Почему я не могу отправить чистый XML в теле SOAP? - PullRequest
0 голосов
/ 27 апреля 2011


Я выполняю вызов клиентской веб-службы к веб-службе SOAP, реализованной с использованием .NET.
Я использовал предоставленный WSDL и доволен тем, что отправляю, например:

POST /publicws/query.asmx HTTP/1.1
Host: www.blablabla.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.blablabla.com/WebServices/Query"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Query xmlns="http://www.blablabla.com/WebServices/Query"> <- <Query> tag #1
      <string_XML>
        <Query>                                                <- <Query> tag #2
          <Param1>param1value</Param1>
          <Param2>param2value</Param2>
        </Query>
      </string_XML>
    </Query>
  </soap:Body>
</soap:Envelope>

Но я получаю сообщение об ошибке:

<faultcode>soap:Client</faultcode>
  <faultstring>Server was unable to read request. --> There is an error in XML document (6, 2). --> 'Element' is an invalid node type. Line 6, position 2.</faultstring>

Однако, отправив следующее сообщение (закодированное в html-код), оно успешно выполняется:

[...]
    <Query xmlns="http://www.blablabla.com/WebServices/Query">
      <string_XML>
        &lt;Query&gt;&lt;Param1&gt;param1value&lt;/Param1&gt;&lt;Param2&gt;param2value&lt;/Param2&gt;&lt;/Query&gt;
      </string_XML>
[...]

Обратите внимание, что при добавлении CDATAвокруг тега # 2 также успешно.

Исправление, описанное выше, мне кажется довольно грязным.

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

Однако, в моем случае, похоже, это не работает так:
-Тэг запроса существует дважды(Наверное, слишком много раз)
-А тега string_XML для бизнеса определенно не существует

[...]
 <Query xmlns="http://www.blablabla.com/WebServices/Query">  <- <Query> tag #1 useless ?
   <string_XML>           <- useless ?
     &Query&...           <- <Query> tag #2 should be pure xml ?
[...]

И тег Query # 1, и тег string_XML кажутся совершенно бесполезными с точки зрения бизнеса.

Почему я не мог простои чистый XML в теле SOAP?
Существует ли первая служба, которая анализирует запрос до string_XML, а затем передает содержимое в другой фрагмент кода, который обрабатывает бизнес?
Какая архитектура за сценой отвечает за это??

Заранее спасибо за помощь,
Николас.

1 Ответ

1 голос
/ 27 апреля 2011

Почему я не могу просто отправить чистый XML в теле SOAP?

Потому что так был разработан SOAP.Внешняя часть вашего xml - это просто формат, определенный протоколом SOAP.Вы пытаетесь передать строку (xml не является типом данных мыла) через этот протокол, поэтому строка должна быть закодирована.И если вы делаете это правильно, ваш код, очевидно, работает.

Мне не понятно, почему вы заботитесь об этих деталях реализации.Обычно вы должны клиентская библиотека обрабатывать эти детали.Тебе даже не важно, что XML вообще задействован.Если по какой-то причине вы думаете, что SOAP требует больших затрат, вы, вероятно, правы.Но тогда вы должны попытаться изменить SOAP.Просто используйте REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...