вызов веб-службы Axis2 из клиента ATL C ++ - PullRequest
0 голосов
/ 04 ноября 2008

У меня есть простой веб-сервис POJO, опубликованный с Axis2 на Tomcat5.5 Я пытаюсь использовать его с клиентом ATL C ++, и он терпит неудачу. Делать то же самое с клиентом C # работает. Проблема в том, что клиент ATL отправляет мыльное тело, которое выглядит как

<soap:Body>< xmlns="http://fa.test.com/xsd"></></soap:Body></soap:Envelope>

Обратите внимание на недопустимый элемент в середине. Я подозреваю, что это как-то связано с UTF-8, потому что C # отправляет заголовок

<?xml version='1.0' encoding='utf-8'?>

, а клиент ATL - нет. Также, когда я смотрю на некоторые из внутренних элементов ATL SOAP, я замечаю, что структура имеет два члена: szName и szwName. Первый пустой и производит элемент, второй имеет правильное (?) Имя testResponse (метод, который я вызываю, называется test).

Нужен совет, куда идти?

Подробнее: полное сообщение от клиента ATL:

POST /axis2/services/EnterpriseService.EnterpriseServiceHttpSoap11Endpoint/ HTTP/1.1
Content-Length: 304
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:test"
Accept: text/xml
Host: xxxxxxx
User-Agent: Microsoft-ATL-Native/8.00

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><soap:Body>< xmlns="http://fa.test.com/xsd"></></soap:Body></soap:Envelope>

Ответ от Axis2:

HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Tue, 04 Nov 2008 15:31:57 GMT
Connection: close

<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '>' (code 62); expected an element name.&#xd;
 at [row,col {unknown-source}]: [1,276]</faultstring><detail /></soapenv:Fault></soapenv:Body></soapenv:Envelope>

О, и вот хороший запрос от клиента C #:

POST /axis2/services/EnterpriseService.EnterpriseServiceHttpSoap11Endpoint/ HTTP/1.1
Via: 1.1 ANGEL-ISLAND
Content-Type: text/xml; charset=utf-8
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.1433)
Host: xxxxxxx:8080
SOAPAction: "urn:test"
Connection: Keep-Alive
Content-Length: 236

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body /></soap:Envelope>

В случае C # мыло: тело пустое.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2008

Сервер ATL полностью способен правильно генерировать запрос. Похоже, есть некоторые проблемы с WSDL. Мой беглый тест генерирует запрос:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
  <soap:Body></soap:Body></soap:Envelope>

для веб-службы ASP.NET с SoapParameterStyle.Bare. У вас есть элемент <wsdl:part> во входном сообщении? Можете ли вы опубликовать описание службы WSDL?

0 голосов
/ 08 ноября 2008

Не думаю, что это имеет какое-либо отношение к UTF-8.

Действительное сообщение от C # не имеет ничего внутри soap: Body, в то время как недействительное сообщение имеет. Похоже, что клиент ATL C ++ пытается ввести что-то в тело SOAP, когда там вообще ничего не должно быть.

Также обратите внимание, что клиент C # не включает в свой элемент элемент testResponse.

Я бы посмотрел код еще немного, где он использует szName, и посмотрю, где он генерирует. Этого не должно быть.

...