Вопрос:
Зачем мне получать фрагмент ответа SOAP, который содержит пространство имен префиксов дубликатов тегов?
Почему я должен получить другой фрагмент ответа в SoapUI и клиенте WCF, используя тот же самый запрос SOAP?
Контекст:
Я вызываю стороннюю веб-службу на основе Java с клиентом WCF. Ответ фрагмента SOAP, отправленный из стороннего WS, содержит дублирующее пространство имен и префикс тега для мыльной оболочки в строке метки Fault при вызове с неправильным значением, которое приводит к ответу на неисправность. Это заставляет WCF вызывать CommunicationException с внутренним исключением XmlException, которое ссылается на следующее как на ошибку:
Исходный элемент "Код ошибки" из пространства имен "" ожидается. Найден элемент "SOAP-ENV: ошибка" из пространства имен " http://schemas.xmlsoap.org/soap/envelope/ ".
Это сообщение об ошибке приводит меня к мысли, что дублируемое пространство имен в фрагменте SOAP является виновником. Странно, что использование точного запроса SOAP, отправленного клиентом WCF в веб-службу в SoapUI, не приводит к дублированию этого пространства имен в фрагменте ответа SOAP.
Клиент WCF использует basicHttpBinding.
Ниже приведены фрагменты SOAP запроса, ответ через WCF и ответ через SoapUI.
Запрос, отправленный как WCF, так и SoapUI:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Search xmlns="urn:ent.soap.testservice.com/objs">
<Request objType="Report">
<RequestorId>ABCD</RequestorId>
<TargetId></TargetId>
</Request>
</Search>
</s:Body>
</s:Envelope>
Ответ, полученный клиентом WCF:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
<SOAP-ENV:detail>
<fns:fault xmlns:fns="urn:fault.soap.testservice.com" xmlns:java="java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="fns:ApiFault">
<fns:exceptionCode>INTERNAL_ERROR</fns:exceptionCode>
<fns:exceptionMessage>Invalid action parameters</fns:exceptionMessage>
<fns:logDataExchangeId>1234567890</fns:logDataExchangeId>
</fns:fault>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Ответ, полученный SoapUI:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
<SOAP-ENV:detail>
<fns:fault xsi:type="fns:ApiFault" xmlns:fns="urn:fault.soap.testservice.com" xmlns:java="java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fns:exceptionCode>INTERNAL_ERROR</fns:exceptionCode>
<fns:exceptionMessage>Invalid action parameters</fns:exceptionMessage>
<fns:logDataExchangeId>1234567890</fns:logDataExchangeId>
</fns:fault>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Проблема заключается не в дублированном объявлении пространства имен. Проблема в этом бит:
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
В Спецификации SOAP элементы кода ошибки и faultstring находятся в пустом пространстве имен по умолчанию, а не в пространстве имен " http://schemas.xmlsoap.org/soap/envelope/ ". Поэтому он действительно должен был выглядеть примерно так:
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>SOAP Must Understand Error</faultstring>
</SOAP-ENV:Fault>
Поэтому похоже, что эта служба, в частности, не соответствует спецификации SOAP 1.1 (или 1.2).