WCF 终结点配置错误 : The 'contract' attribute is invalid?

标签 wcf web-config wcf-endpoint

我有一个 WCF 服务,我们称之为 UserService . UserService有一个类库的引用。我们就叫它DoWork.dll . DoWork.dll有一个 WCF 服务引用到另一个我们将调用的服务 CompanyService .

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

The 'contract' attribute is invalid - The value 'CompanyService.ICompanyService' is invalid according to its datatype 'clientContractType' - The Enumeration constraint failed.



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

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

我应该注意到一切似乎都工作正常,但我不喜欢智能感知给我蓝色波浪下划线和错误消息的事实。我有一种感觉,我需要在 web.config 中添加其他内容从 UserService 开始让它工作引用 DoWork.dll ,它又引用了 CompanyService我看不清谁的契约(Contract)。

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

最佳答案

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

具有“服务引用”(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 独立,则考虑将 DoWork 包装在 WCF 服务上,该服务依赖于 CompanyService。然后,从 UserService 中,添加对新 DoWork 服务的服务引用。这更符合 SOA 的租户,并将允许您的服务独立发展。

关于WCF 终结点配置错误 : The 'contract' attribute is invalid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18276251/

相关文章:

c# - 在单独的 js 文件中访问 Web 配置

c# - wcf单向非阻塞操作

xml - WCF - 让客户选择返回格式

c - 我的 wcf 端点出现问题

c# - 在 asp.net core 中实现 SOAP 1.2 服务

c# - 如何在wcf中处理客户端上下文(sharepoint online)?

web.config-transform - 在 Debug模式下删除 web.config 文件中的部分

c# - 如何从 wcf ksoap2 响应中填充字典

wcf - 如何在WCF和WIF中使用JWT token ?

php - 从 PHP 应用程序的 Windows 身份验证 IIS 中提取登录信息