Ответ службы на WCF включает дублированное пространство имен и префикс тега

1

Вопрос:

  1. Зачем мне получать фрагмент ответа SOAP, который содержит пространство имен префиксов дубликатов тегов?

  2. Почему я должен получить другой фрагмент ответа в 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>
  • 1
    1) Что, по словам WSDL, должен быть ответ? 2) Два примера ответов, которые вы опубликовали, идентичны XML, даже если они не идентичны байтам; это просто, как клиент отображает это для вас .
Теги:
soap
soapui
web-services
wcf

1 ответ

1
Лучший ответ

Проблема заключается не в дублированном объявлении пространства имен. Проблема в этом бит:

    <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).

  • 0
    Могу ли я что-то изменить в справочном коде службы, чтобы смягчить это несоответствие? Я проконсультировался с продавцом об этой конкретной проблеме в ответе на сервис, но пока хотел бы найти обходной путь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню