WCF端点配置错误:“合同”属性无效?

时间:2013-08-16 14:55:10

标签: wcf web-config wcf-endpoint

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

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

  

'contract'属性无效 - 值'CompanyService.ICompanyService'根据其数据类型'clientContractType'无效 - 枚举约束失败。

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

我尝试使用Tools > WCF Service Configuration Editor进行配置,但这没有帮助。

我应该注意到一切似乎都运行正常,但我不喜欢intellisense给我蓝色波浪线下划线和错误信息这一事实。我有一种感觉,我需要在web.config中使用其他内容才能使其发挥作用,因为UserService引用了DoWork.dll,而CompanyService又引用了我看不到合同的{{1}}正常。

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

1 个答案:

答案 0 :(得分: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独立,请考虑在WCF服务上包装DoWork,这会依赖于CompanyService。然后,从UserService,向新的DoWork服务添加服务引用。这更符合SOA的租户,并允许您的服务独立发展。