【问题标题】:Does WCF support WS-Security with SOAP 1.1?WCF 是否支持带有 SOAP 1.1 的 WS-Security?
【发布时间】:2011-03-23 22:51:06
【问题描述】:

我需要调用一些需要 WS-Security 的第 3 个 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>

问题是第 3 方服务器抛出以下异常:

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

我了解使用 wsHttpBinding 将导致 WCF 发送 SOAP 1.2 请求,而使用 basicHttpBinding 将导致 SOAP 1.1 请求。由于需要 WS-Security 部分,据我了解,我必须使用 wsHttpBinding。我的问题是如何强制发出 SOAP 1.1 请求?我有哪些选择?

【问题讨论】:

    标签: c# .net wcf soap ws-security


    【解决方案1】:

    为了使用 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="....." />
    

    当然,您可以使用附加属性扩展上面定义的自定义绑定,例如&lt;reliableMessaging&gt; 或其他人。

    有关 WCF 绑定以及如何在配置中“组合”您自己的自定义绑定的更详细、非常有用的信息,请阅读 Aaron Skonnard 撰写的这篇出色的 MSDN 文章 Service Station: WCF Bindings In Depth

    【讨论】:

    • 这极大地帮助我创建了一个使用 SOAP1.2 和 2004 年 8 月 WS-Addressing 的端点。填补了让我点击的最后一个小空白!
    • 这个答案正是我修复错误所需要的:(415)无法处理消息,因为内容类型'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; charset=utf-8'.
    • -1:这不适用于 HTTPS 地址,因为自定义绑定中使用的传输是用于 HTTP。
    • @reSPAWNed:那又怎样?将&lt;httpTransport/&gt; 替换为&lt;httpsTransport/&gt;
    【解决方案2】:

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

    【讨论】:

    • 我已经尝试将 wsHttpBinding 更改为 basicHttpBinding,但它会导致异常并且无法将其发送到第 3 方服务器。根据我的阅读,basicHttpBinding 与证书身份验证不兼容。我错了吗?
    • MSDN 说支持证书认证:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2015-12-15
    • 2014-04-10
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多