Генерация WsHttpBinding вместо BasicHttpBinding с использованием «Добавить ссылку на службу» в VS2010 - PullRequest
2 голосов
/ 20 августа 2011

Я успешно добавил ссылку на службу, используя диалоговое окно «Добавить ссылку на службу» в VS2010. Однако, когда я пытаюсь получить доступ к указанным методам веб-службы, я получаю следующее ProtocolException:

Test method Test.Entities.DocumentumServiceClient_Tests.Can_Read_Client_Message threw
exception: System.ServiceModel.ProtocolException: The content type multipart/related; 
type="application/xop+xml"; boundary="uuid:976dd31d-c531-4298-b12c-e799c8eb4bed"; 
start="<root.message@cxf.apache.org>"; start-info="text/xml" of the response message
does not match the content type of the binding (text/xml; charset=utf-8). 
If using a custom encoder, be sure that the IsContentTypeSupported method is implemented
properly. The first 919 bytes of the response were: <code>

'--uuid:976dd31d-c531-4298-b12c-e799c8eb4bed
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
     <ns8:getRepositoryNameResponse 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:dfs-dm-core-profiles="http://irrelevant.com/" 
           xmlns:dfs-dm-core-context="http://irrelevant2.com/"
           xmlns:dfs-dm-core-properties="http://irrelevant3.com/" 
           xmlns:dfs-dm-core-content="irrelevant4.com/" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:ns8="http://irrelevant5.com/">           
        <return>to the Dagobah system</return>
     </ns8:getRepositoryNameResponse>
   </soap:Body>
</soap:Envelope>
--uuid:976dd31d-c531-4298-b12c-e799c8eb4bed--'.

Все это, после интенсивного поиска в Google, кажется несоответствием между SOAP 1.2 на сервере и SOAP 1.1 в моем проекте. По-видимому, я должен использовать WSHttpBinding вместо BasicHttpBinding. Вот сгенерированный соответствующий раздел app.config:

<system.serviceModel>
  <client>
    <endpoint address="http://irrelevant.com/Service"
              binding="basicHttpBinding"
              bindingConfiguration="CMSPersistantManagerServiceServiceSoapBinding"
              contract="DocumentumService.CMSPersistentManagerService"  
              name="CMSPersistentManagerServicePort" />
  </client>
<bindings>
  <basicHttpBinding>
    <binding name="DfsAgentService" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="DfsContextRegistryService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="DfsDefaultService" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="1000000" maxBufferPoolSize="10000000" maxReceivedMessageSize="1000000"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="CMSPersistantManagerServiceServiceSoapBinding"
      closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00"
      sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"
      hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
      textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Есть ли что-то другое, что я должен сделать, чтобы сообщить диалоговому окну ссылки на службу для создания версии 1.2 с WSHttpBinding? Это вина WSDL? Буду признателен за любую помощь, так как я нахожусь в конце моей веревки Google.

1 Ответ

2 голосов
/ 31 июля 2013

У меня была похожая проблема с сторонним веб-сервисом SOAP, который я не мог контролировать, и обнаружил, что мне нужно использовать SOAP 1.2, а не заголовки SOAP 1.1 по умолчанию, которые Visual Studio добавляет с BasicHttpBinding.

Служба, которую я использовал, была несовместима с функциями безопасности WSHttpBinding, поэтому, создав пользовательскую привязку, вы можете заставить BasicHttpBinding работать с SOAP 1.2, но изменив свой .config следующим образом:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="httpSoap12">
        <textMessageEncoding messageVersion="Soap12"/>
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint address="http://server.com/interface/SoapService.asmx"
      binding="customBinding" bindingConfiguration="httpSoap12"
      contract="Service.ThingsYouNeed" name="ThingsYouNeed" />
  </client>
</system.serviceModel>

Сделайте этивнесение изменений в конфигурацию после добавления ссылки на службу в Visual Studio 2010.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...