Не удается отправить запрос службы WCF в виде SOAP+XML

Используя Visual Studio 2010, я разработал службу WCF, размещенную в веб-приложении, для использования третьей стороной. Они говорят мне, что не могут вызвать это. Для тестирования они перенаправили меня на Altova XmlSpy и указали, что при создании нового запроса SOAP, если они выбирают "Отправить как SOAP+XML (SOAP 1.2)" в пункте меню "Изменить параметры запроса SOAP", они получают следующие два диалоговых окна предупреждения:

HTTP error: could not POST file ‘/TurniArc/WebServices/Processi.svc’ on server ’10.51.0.108’ (415)

Error sending the soap data to ‘http://10.51.0.108/TurniArc/WebServices/Processi.svc’ HTTP error: could not POST file ‘/TurniArc/WebServices/Processi.svc’ on server ’10.51.0.108’ (415)

Я действительно подтвердил это. Если снять этот флажок, запрос будет отправлен как требуется. И у меня никогда не было проблем с вызовом моего веб-сервиса с помощью soapUI, программного обеспечения, которое я всегда использовал для внутреннего тестирования.

Это первый веб-сервис, который я создаю, начав без каких-либо теоретических знаний (но я думаю, что все это делают:-)), поэтому я даже не уверен, где можно заняться, чтобы это исправить. Может ли проблема заключаться в привязке? Я создал службу, используя Add/New Item/WCF Service и оставив все опции по умолчанию, поэтому это должен быть BasicHttpBinding

Это часть serviceModel моего web.config

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
<!--other bindings related to proxies to other services I'm invoking -->
</system.serviceModel>

Мой интерфейс имеет только

[ServiceContract(Namespace="http://www.archinet.it/HRSuite/Processi/")]

атрибут и класс, реализующий его, имеет

[ServiceBehavior(IncludeExceptionDetailInFaults = true, Namespace = "http://www.archinet.it/HRSuite/Processi/")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

атрибуты

Спасибо

Изменить: Третья сторона использует промежуточное ПО Oracle SOA

1 ответ

Решение

BasicHttpBinding использует SOAP 1.1, поэтому вы не можете отправить запрос в SOAP 1.2 конечной точке, используя эту привязку. Код состояния HTTP 415 означает неподдерживаемый тип носителя, что также подразумевает это, поскольку SOAP 1.1 использует тип содержимого text/xml, тогда как SOAP 1.2 использует тип содержимого application/soap+xml.

Если вы хотите, чтобы BasicHttpBinding был эквивалентен SOAP 1.2 без каких-либо других вещей WS-*, включенных в WsHttpBinding, вам нужно создать пользовательскую привязку. Самая простая версия выглядит так:

<bindings>
  <customBinding>
    <binding name="soap12">
      <textMessageEncoding messageVersion="Soap12" />
      <httpTransport />
    </binding>
  </customBinding>
</bindings>

Затем вы должны вручную определить конечную точку для вашего сервиса (в данный момент вы используете конечную точку по умолчанию):

<services>
  <service name="YourNamespace.YourServiceClass">
    <endpoint address="" binding="customBinding" bindingConfiguration="soap12" 
              contract="YourNamespace.YourServiceContractInterface" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

В любом случае, я не верю, что перенастройка версии SOAP для использования вашего сервиса в промежуточном программном обеспечении Oracle SOA занимает более нескольких минут.

Другие вопросы по тегам