我有一个WCF服务,我们称它为UserServiceUserService具有对类库的引用。我们称它为DoWork.dllDoWork.dll具有WCF服务引用,该服务引用了另一个服务,我们将其称为CompanyService

现在,当我第一次尝试调用UserService时,我会收到未配置端点的错误消息。在网上阅读后,我发现需要将CompanyService绑定(bind)和客户端信息添加到UserService节点下的web.config<system.serviceModel>中。

这里是:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IComapnyService" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint name="BasicHttpBinding_ICompanyService"
          address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc"
          binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IComapnyService"
          contract="CompanyService.ICompanyService"  />
    </client>

我的问题是contract="CompanyService.ICompanyService"向我显示了错误:



现在,如果我将CompanyService引用直接添加到UserService WCF项目,则错误消失了(很明显)。但是,我不必这样做。我已经尝试完全限定ICompanyService契约(Contract)所在的 namespace ,但该方法也不起作用。我已经删除了.suo文件并重建了项目,但该方法也不起作用(建议在网络上的其他地方使用)。另外,如果键入contract=,则会得到下拉列表,但找不到CompanyService.ICompanyService(仅当我直接在UserService项目中引用该服务时)。

我尝试使用Tools > WCF Service Configuration Editor对其进行配置,但这无济于事。

我应该注意,一切似乎都可以正常工作,但是我不喜欢智能感知给我蓝色的波浪状下划线和该错误消息这一事实。我觉得我需要web.config中的其他内容才能使其正常工作,因为UserService引用了DoWork.dll,后者又引用了我无法正确查看其契约(Contract)的CompanyService

任何建议,不胜感激。提前致谢。

最佳答案

您是对的-您不必这样做。

具有“服务引用”(ComanyService)的DLL(DoWork.dll)的体系结构是不好的。除非DLL已用代码对客户端端点进行了硬编码(以代码形式)以为您调用CompanyService,否则使用DLL的任何人都必须尝试弄清楚如何为他们不知道的服务配置客户端端点。这是您遇到的问题。

直接从UserService添加服务引用时此方法起作用的原因是,这样做时会从CompanyService元数据中获得ServiceContract的副本。为了证明这一点,请查看生成的Reference.cs文件,搜索CompanyService,您将发现它具有[ServiceContract]属性,将其标识为WCF服务。此外,您将看到方法的[OperationContract]属性,以及还将交换的任何[DataContracts]服务。换句话说,所有这些“类型”都已导入到您的项目中,并且在编译时,WCF现在可以在实例化客户端端点时找到这些类型。

如果CompanyService是您的服务之一,请考虑将ServiceContract定义(接口(interface))提取到单独的DLL中。然后,您可以从服务(CompanyService)和任何客户端应用程序(例如UserService)中将这些类型引用为“程序集引用”。至少这样,您不必添加服务引用。但是,对于技术上您可能不了解其详细信息的服务,您仍然必须在应用程序中填充....部分。不是最好的方法。

更好的方法是将服务依赖项移出DoWork.dll。您可以通过将逻辑移到UserService实现中来实现。

或者,如果您需要保持DoWork.dll独立,那么可以考虑在WCF服务上包装DoWork,该服务依赖于CompanyService。然后,从UserService中,将服务引用添加到新的DoWork服务。这更符合SOA的租户,并且将使您的服务独立发展。

10-08 03:01