WCF端点配置错误:';合同';属性无效?
我有一个WCF服务,我们称之为WCF端点配置错误:';合同';属性无效?,wcf,web-config,wcf-endpoint,Wcf,Web Config,Wcf Endpoint,我有一个WCF服务,我们称之为UserService。UserService引用了类库。让我们称之为DoWork.dll。DoWork.dll中有一个WCF服务引用,它指向一个我们称之为CompanyService的不同服务 现在,当我第一次尝试调用UserService时,我会收到一条端点未配置错误消息。在浏览完web之后,我发现我需要将公司服务绑定和客户机信息添加到用户服务节点下的web.config中 这是: <system.serviceModel> <bind
UserService
。UserService
引用了类库。让我们称之为DoWork.dll
。DoWork.dll
中有一个WCF服务引用,它指向一个我们称之为CompanyService
的不同服务
现在,当我第一次尝试调用UserService
时,我会收到一条端点未配置错误消息。在浏览完web之后,我发现我需要将公司服务
绑定和客户机信息添加到用户服务
节点下的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文件并重建了项目,但这也不起作用(建议在web上的其他地方)。此外,如果我键入contract=
,我会得到下拉列表,但是找不到CompanyService.ICompanyService
(仅当我在UserService
项目中直接引用服务时)
我尝试使用Tools>WCF服务配置编辑器
对其进行配置,但没有任何帮助
我应该注意到,一切似乎都很好,但我不喜欢intellisense给我蓝色的弯曲下划线和错误消息。我有一种感觉,我需要web.config
中的其他东西来实现这一点,因为UserService
引用了DoWork.dll
,后者又引用了CompanyService
,我无法正确查看其合同
任何建议都将不胜感激。提前谢谢。你说得对-你不应该这样做 拥有带有“服务引用”(ComanyService)的DLL(DoWork.DLL)的体系结构是不好的。除非DLL硬编码了客户端端点(在代码中)来为您调用CompanyService,否则使用DLL的任何人都必须尝试并找出如何为他们不知道的服务配置客户端端点。这就是你遇到的 当您直接从UserService添加服务引用时,这种方法起作用的原因是,当您这样做时,您会从CompanyService元数据获得ServiceContract的副本。为了证明这一点,请查看生成的Reference.cs文件,搜索CompanyService,您会发现它具有[ServiceContract]属性,将其标识为WCF服务。此外,您将看到这些方法的[OperationContract]属性,以及服务my exchange的任何[DataContracts]。换句话说,所有这些“类型”都被导入到您的项目中,当您编译时,WCF现在能够在实例化客户端端点时找到这些类型
如果CypService是您的服务之一,那么考虑将Service Engress定义(接口)提取到单独的DLL中。然后,您可以从服务(CompanyService)和任何客户端应用程序(如UserService)将这些类型引用为“程序集引用”。至少这样,您不必添加服务引用。但是,您仍然必须填充。。。。在您的服务申请中,您在技术上可能不知道服务的详细信息。这不是最好的办法
更好的方法是将服务依赖项移出DoWork.dll。您可以通过将逻辑移动到UserService实现中来实现这一点或者,如果您需要保持DOWORK.DLL独立,那么考虑将其封装在WCF服务上,WCF服务依赖于公司服务。然后,从UserService向新的DoWork服务添加服务引用。这更符合SOA的租户,并允许您的服务独立发展。
谢谢您提供的信息。也许我的架构不好。CompanyService只是一个WCF服务,因为我需要它像一个单例一样运行,服务行为为InstanceContextMode.Single。在我现在的系统中,CompanyService中的one service方法不应该从DoWork.DLL以外的任何地方调用。因此,我的后续问题是,我应该在DoWork.DLL中硬编码端点,还是应该一起删除ComapnyService,并以某种方式将其逻辑移到DoWork.DLL中(以某种方式保持单例行为)?谢谢。不,不要硬编码端点。我向您介绍的最后一个选项可能最适合您的场景。有一些方法(通过安全设置)可以确保服务包装DoWork.DLL是唯一可以调用CompanyService的服务。像这样的。UserService NewWrapperService(dowork)CompanyService我最近遇到了这个问题,发现实际上包含完整名称空间是造成我的问题的原因。对于有此问题的其他人,请注意这一点。