我有一个WCF服务,我们称之为UserService
。 UserService
引用了类库。我们称之为DoWork.dll
。 DoWork.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}}正常。
非常感谢任何建议。提前谢谢。
答案 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的租户,并允许您的服务独立发展。