Не удается отправить запрос службы 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 занимает более нескольких минут.