7

我有一个 WCF 服务,我们称之为UserServiceUserService具有对类库的引用。让我们称之为DoWork.dll。有DoWork.dll一个 WCF 服务引用到我们将调用的不同服务CompanyService

现在,当我第一次尝试调用时,UserService我会收到一个未配置端点的错误消息。在网上阅读后,我发现我需要将CompanyService绑定和客户端信息添加到节点下的UserService's中。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"我展示了错误:

“合同”属性无效 - 根据其数据类型“clientContractType”,值“CompanyService.ICompanyService”无效 - 枚举约束失败。

现在,如果我CompanyService直接将引用添加到UserServiceWCF 项目,错误就会消失(显然)。但是,我不应该这样做。我已经尝试完全限定ICompanyService合同所在的命名空间,但这也不起作用。我已经删除了 .suo 文件并重建了项目,但这也不起作用(在网络上的其他地方建议)。此外,如果我键入contract=,我会得到下拉列表但CompanyService.ICompanyService无处可寻(仅当我直接在UserService项目中引用该服务时)。

我已经尝试使用它来配置它Tools > WCF Service Configuration Editor,但这没有帮助。

我应该注意到一切似乎都工作正常,但我不喜欢智能感知给我蓝色波浪下划线和错误消息的事实。我有一种感觉,我需要其他东西web.config才能让它工作,因为UserService引用了DoWork.dll,这反过来又引用了CompanyService我无法正确看到的合同。

任何建议都非常感谢。提前致谢。

4

1 回答 1

3

你是对的 - 你不应该这样做。

具有“服务引用”(ComanyService) 的 DLL (DoWork.dll) 的体系结构很糟糕。除非 DLL 已硬编码客户端端点(在代码中)为您调用 CompanyService,否则使用 DLL 的任何人都必须尝试弄清楚如何为他们不知道的服务配置客户端端点。这就是你遇到的。

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

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

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

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

于 2013-08-16T22:14:21.027 回答