如何让wcf服务监听soap 1.1和soap 1.2(代码中)

时间:2014-07-23 17:54:40

标签: wcf

我天真地为1.1做了一个基本绑定,为1.2做了一个webhttbinding,并将它们作为端点添加到同一个主机

    var basicBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
    basicBinding.Security.Transport.ClientCredentialType = clientCredType;
    s_serviceHost.AddServiceEndpoint(typeof(IFoo), basicBinding, "");

    var httpBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
    httpBinding.Security.Transport.ClientCredentialType = clientCredType;
    var httpsEndpoint = s_serviceHost.AddServiceEndpoint(typeof(IFoo), httpBinding, "");

wcf对象说

   If two endpoints want to share the same ListenUri, they must also share the same binding object instance. 
The two conflicting endpoints were either specified in AddServiceEndpoint() calls, in a config file, or a combination of AddServiceEndpoint() and config.
编辑:也许我需要稍微改写一下。同一端点(例如mything.org/service)是否支持1.1和1.2。即只需查看有效负载,wcf服务将确定如何读取它

1 个答案:

答案 0 :(得分:0)

当您通过AddServiceEndpoint对象呼叫ServiceHost时,您要为地址参数指定""两次。这被解释为相对URI - 相对于ServiceHost的基地址。因此,在这种情况下,两个端点都以相同的地址结束。

这本身不是一个问题,但当它们具有不同的绑定时它就变成了一个问题(BasicHttpBindingWebHttpBinding)。

来自MSDN上的Specifying an Endpoint Address

  

如果您有多个端点,每个端点都配置了一个   不同的绑定,它们的地址必须是唯一的。使用的端点   相同的绑定但不同的合同可以使用相同的地址。

如果您对WCF中的单个ListenUri不支持多个绑定的原因感兴趣。 MSDN上的Multiple Endpoints at a Single ListenUri文章指出:

  

...同一个ListenUri的端点必须具有相同的绑定,   因为他们共享一个侦听的单个通道堆栈   机器上该物理地址的消息。

要解决此问题,您需要为至少一个端点指定非空字符串。这样就可以了:

s_serviceHost.AddServiceEndpoint(typeof(IFoo), httpBinding, "http");

与您的情况有关,但与问题无关:

WebHttpBinding是通过HTTP请求而不是基于SOAP的消息传递公开的Web服务的绑定。我相信您正在寻找支持SOAP 1.2的WSHttpBinding