Поддерживает ли WCF WS-Security с SOAP 1.1? - PullRequest
9 голосов
/ 24 марта 2011

Мне нужно вызвать несколько третьих веб-сервисов, которым требуется WS-Security. Я создал конечную точку 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>

Проблема в том, что сторонние серверы выдают следующее исключение:

полученный протокол «_ 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? Какие у меня варианты?

Ответы [ 2 ]

13 голосов
/ 24 марта 2011

Чтобы использовать WS-Addressing (wsHttpBinding), но с SOAP 1.1 (SOAP 1.2 по умолчанию), вам нужно определить пользовательскую привязку WCF (например, в config) и использовать это:

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

и затем в своем определении конечной точки используйте:

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

Конечно, вы можете расширить пользовательскую привязку, определенную выше, с помощью дополнительных свойств, например, <reliableMessaging> или других.

Более подробную и очень полезную информацию о привязках WCF и о том, как «составить» свои собственные привязки в конфигурации, можно прочитать в этой превосходной статье MSDN Сервисная станция: привязки WCF в глубину Аарона Сконнарда.

7 голосов
/ 24 марта 2011

Вы должны либо использовать BasicHttpBinding, который также поддерживает TransportWithMessageCredentials (SOAP 1.1 + HTTPS + профиль токена сертификата WS-Security X.509), либо создать пользовательскую привязку на основе всех ваших потребностей.

...