C# WCF是否支持SOAP 1.1的WS-Security?

C# WCF是否支持SOAP 1.1的WS-Security?,c#,.net,wcf,soap,ws-security,C#,.net,Wcf,Soap,Ws Security,我需要调用一些需要WS-Security的第三Web服务。我使用以下配置创建了一个WCF端点: <system.serviceModel> <bindings> <wsHttpBinding> <binding name="TestBinding"> <security mode="TransportWithMessageCredential"> <message cli

我需要调用一些需要WS-Security的第三Web服务。我使用以下配置创建了一个WCF端点:

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="TestBinding">
        <security mode="TransportWithMessageCredential">
          <message clientCredentialType="Certificate" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <behaviors>
    <endpointBehaviors>
      <behavior name="TestBehavior">
        <callbackDebug includeExceptionDetailInFaults="true" />
        <clientCredentials>
          <clientCertificate findValue="Acme" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
          <serviceCertificate>
            <authentication certificateValidationMode="PeerOrChainTrust" />
          </serviceCertificate>
        </clientCredentials>
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <client>
    <endpoint address="https://acme.com/webservices" binding="wsHttpBinding" bindingConfiguration="TestBinding" behaviorConfiguration="TestBehavior" contract="AcmeContract" name="AcmeEndpoint"></endpoint>
  </client>
</system.serviceModel>

问题在于,第三方服务器a引发以下异常:

接收协议 '_http://schemas.xmlsoap.org/wsdl/soap12/', 所需协议 '_http://schemas.xmlsoap.org/wsdl/soap/"


我知道使用wsHttpBinding将导致WCF发送SOAP 1.2请求,而使用basicHttpBinding将导致SOAP 1.1请求。因为WS-Security部分是必需的,据我所知,我必须使用wsHttpBinding。我的问题是如何强制SOAP1.1请求?我的选项是什么?

您必须使用同样支持
TransportWithMessageCredentials
(SOAP 1.1+HTTPS+WS-Security X.509证书令牌配置文件)的
BasicHttpBinding
,或者根据您的所有需要创建自定义绑定。

以便使用WS-Addressing(
wsHttpBinding
),但使用SOAP 1.1(默认为SOAP 1.2),您需要定义自定义WCF绑定(例如在配置中)并使用该绑定:

<bindings>
   <customBinding>
      <binding name="WsHttpSoap11" >
         <textMessageEncoding messageVersion="Soap11WSAddressing10" />
         <httpTransport/>
      </binding>
   </customBinding>
</bindings>

然后在端点定义中,使用:

<endpoint name="WsSoap11"
    address="....."
    binding="customBinding"
    bindingConfiguration="wsHttpSoap11"
    contract="....." />

当然,您可以使用附加属性(例如
或其他属性)扩展上面定义的自定义绑定


有关WCF绑定以及如何“编写”的更详细、更有用的信息您自己在配置中的自定义绑定,请阅读Aaron Skonnard的这篇优秀MSDN文章。

我尝试将wsHttpBinding更改为basicHttpBinding,但它会导致异常,并且无法发送到第三方服务器。据我所知,basicHttpBinding与证书身份验证不兼容。我错了吗?MSDN说是证书身份验证支持身份验证:这极大地帮助了我创建了一个使用SOAP1.2和2004年8月WS-Addressing的端点。填补了最后一个小缺口,使它适合我!这个答案正是我修复错误所需的:(415)无法处理消息,因为内容类型“text/xml;charset=utf-8”不是预期的类型“application/soap+xml;charset=utf-8”。-1:这不适用于HTTPS地址,因为自定义绑定中使用的传输用于HTTP。@reSPAWNed:那又怎样?将
替换为