WCF 终结点配置错误: 'contract'属性无效?



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

现在,当我第一次尝试调用UserService时,我会收到未配置端点错误消息。在浏览了网络之后,我发现我需要将CompanyService绑定和客户端信息添加到UserService <system.serviceModel>节点下的web.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"根据其数据类型"clientContractType"无效 - 枚举约束失败。

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

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

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

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

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

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

当您

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

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

更好的方法是将服务依赖项移出 DoWork.dll。 您可以通过将逻辑移动到用户服务实现中来执行此操作。

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

相关内容

  • 没有找到相关文章

最新更新