我天真地为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服务将确定如何读取它
答案 0 :(得分:0)
当您通过AddServiceEndpoint
对象呼叫ServiceHost
时,您要为地址参数指定""
两次。这被解释为相对URI - 相对于ServiceHost
的基地址。因此,在这种情况下,两个端点都以相同的地址结束。
这本身不是一个问题,但当它们具有不同的绑定时它就变成了一个问题(BasicHttpBinding
和WebHttpBinding
)。
来自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
。