Ошибка WCF Сообщение SOAP 1.2 недопустимо при отправке на SOAP 1.1 только с использованием wsHttpBinding - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь использовать службу, которую я не могу контролировать, и которой был предоставлен только WSDL. Сервис требует сертификат для аутентификации. Моя конфигурация для сертификата в порядке, и я получаю сообщение об ошибке при попытке вызвать службу, как показано ниже:

Тип содержимого text / xml; charset = UTF-8 ответного сообщения не совпадаеттип содержимого привязки (application / soap + xml; charset = utf-8). Если вы используете пользовательский кодировщик, убедитесь, что метод IsContentTypeSupported реализован правильно. Первые 274 байта ответа были: «soap: VersionMismatchA SOAP 1.2 сообщение недопустимо при отправке в конечную точку только SOAP 1.1.».

Я пробовал по-другому, как с использованием customBinding, но яприземлился с общим количеством новых ошибок и чувствую, что не получаю в любом случае. Не могли бы вы помочь?

Конфиг клиента:

<system.serviceModel>
    <client>
      <endpoint name="IDeliveryServiceImplPort" 
                address="WebServiceUrl" 
                binding="wsHttpBinding" 
                bindingConfiguration="wsHttpBinding"
                behaviorConfiguration="wsHttpCertificateBehavior"
                contract="IDeliveryService">
        <identity>
          <dns value="MyIdentity" />
        </identity>
      </endpoint>
    </client>

    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:10:00" sendTimeout="00:01:00"
                 bypassProxyOnLocal="false" transactionFlow="false"
                 hostNameComparisonMode="StrongWildcard"
                 maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                 messageEncoding="Text" textEncoding="utf-8"
                 useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas
            maxDepth="32" maxStringContentLength="8192"
            maxArrayLength="16384" maxBytesPerRead="4096"
            maxNameTableCharCount="16384" />
          <reliableSession enabled="false" ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Transport">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
      <customBinding>
        <binding name="WsHttpSoap11"  closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:10:00" sendTimeout="00:01:00">
          <textMessageEncoding messageVersion="Soap11WSAddressing10" />
          <security authenticationMode="MutualCertificate" />
          <httpsTransport requireClientCertificate="true" />
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <endpointBehaviors>
        <behavior name="wsHttpCertificateBehavior">
          <clientCredentials>
            <clientCertificate x509FindType="FindBySubjectName" findValue="MyIdentity" storeLocation="LocalMachine" storeName="My" />
            <serviceCertificate>
              <defaultCertificate x509FindType="FindBySubjectName" findValue="MyIdentity" storeLocation="LocalMachine" storeName="My" />
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Мне удалось выяснить это с помощью твиков и испытаний. Чтобы решить эту проблему, я перехожу на basicHttpsBinding, что заняло у меня еще день или два, чтобы выяснить, что транспортным значением по умолчанию clientCredentialType является None, и вам необходимо настроить пользовательское связывание, как показано ниже. Я бы хотел, чтобы WCF рассказал вам, почему или дал бы решение об ошибке, которую вы получаете, потому что это было такой болью. От одного описания ошибки к следующему безостановочно.

<bindings>
      <basicHttpsBinding>
        <binding name="SecureHubBinding">
          <security>
            <transport clientCredentialType="Certificate"  />
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpsBinding>
    </bindings>
0 голосов
/ 25 октября 2019

Эти конфигурации автоматически генерируются путем добавления ссылки на сервис? Мы можем использовать файл WSDL службы для генерации информации о привязке, используемой на стороне сервера, и добавить ссылку на службу для генерации прокси-класса клиента.
Кроме того, если служба в режиме безопасности транспорта аутентифицирует клиента с помощьюсертификат, пожалуйста, убедитесь, что ниже требований.

  1. Должны быть установлены доверительные отношения между клиентской и серверной сторонами. Установите взаимные сертификаты в локальном ЦС.
  2. Эти два сертификата должны быть доступны приложению WCF. Добавьте учетную запись «Все» (или учетную запись, на которой запущено приложение WCF) в группу управления закрытого ключа сертификата.
  3. Оба эти сертификата должны иметь назначение для проверки подлинности клиента и назначение для проверки подлинности сервера.

Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

...