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

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

现在,当我第一次尝试调用UserService我会得到一个未配置端点的错误消息。 在浏览网页后,我发现我需要将CompanyService绑定和客户端信息添加到<system.serviceModel>节点下的UserServiceweb.config

这里是:

<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"向我显示错误:

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

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

我曾尝试使用Tools > WCF Service Configuration Editor ,但这没有帮助。

我应该注意到,一切似乎都很好,但我不喜欢intellisense给我蓝色下划线和错误信息的事实。 我有一种感觉,我需要web.config其他东西来实现这个功能,因为UserService引用了DoWork.dll ,而DoWork.dll又引用了CompanyService它的合同我看不清楚。

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


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

具有“服务参考”(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的租户,并将允许您的服务独立发展。

链接地址: http://www.djcxy.com/p/15283.html

上一篇: WCF Endpoint Configuration Error: The 'contract' attribute is invalid?

下一篇: SciPy 0.12.0 and Numpy 1.6.1