为什么WCF会替换我的端点名称?

时间:2013-05-07 19:55:11

标签: .net wcf service wcf-configuration

我有以下端点的服务:

<endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
          name="SomeServiceDotNetEndpoint" contract="Contracts.ISomeService" />

当我将此服务引用添加到另一个项目时,应用程序配置文件显示以下客户端端点:

<endpoint address="http://test.example.com/Services/SomeService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISomeService"
                contract="SomeService.ISomeService" name="BasicHttpBinding_ISomeService" />

现在,名称为BasicHttpBinding_ISomeService的端点永远不会在服务的Web配置文件中定义。当我尝试使用以下代码创建新的通道工厂时:

var someServiceChannelFactory = new ChannelFactory<ISomeService>("SomeServiceDotNetEndPoint", endpoint);

它失败了,告诉我该地址没有匹配的合同/端点。我也尝试过使用"BasicHttpBinding_ISomeService",我也遇到了同样的错误。

Could not find endpoint element with name 'SomeServiceDotNetEndPoint' and
contract 'SomeService.ISomeService' in the ServiceModel client configuration
section. This might be because no configuration file was found for your
application, or because no endpoint element matching this name could be found
in the client element.

那么,BasicHttpBinding_ISomeService来自何处,为什么我的原始端点名称被覆盖,我如何让服务识别我想要击中的端点?

2 个答案:

答案 0 :(得分:2)

在服务端定义端点时,不需要指定名称。但是在客户端,如果要使用channelFactory创建代理,则应提供唯一的名称。

总结:

服务web.config

<endpoint address="" 
          binding="basicHttpBinding" 
          contract="Contracts.ISomeService" />

客户端app.config

<endpoint address="http://test.com/SomeService"
          binding="basicHttpBinding"
          name="someServiceEndpoint"
          contract="Contracts.ISomeService" />

var someServiceChannelFactory = new ChannelFactory<ISomeService>("someServiceEndpoint", endpoint);

希望这有帮助,

的Lukas

答案 1 :(得分:1)

这里的混淆点是,WCF服务配置中的大多数“名称”值是未在服务外部发布的实现细节。端点名称,绑定名称,服务行为名称仅对服务和客户端可见。

当您创建服务引用时,客户端根据发布的服务信息生成端点名称:地址,绑定和合同......并提供名称“BasicHttpBinding_ISomeService”。您会发现对使用BasicHttpBinding公开ISomeService的服务的所有服务引用都具有相同的名称。

因此未覆盖您的端点名称。客户根本不知道它是什么。

调用服务的最简单方法是使用服务引用生成的客户端。如果您使用该向导选择的默认ServiceReferece1命名空间:

ServiceReference1.SomeServiceClient client = new ServiceReference1.SomeServiceClient("endpointname");