barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 18 января 2013 г.

WSO2 ESB: исключение "com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog" при получении ответа конечного сервиса

Проблема:

Ситуация такая: некоторое сообщение шлется из прокси-сервиса А на одном экземпляре WSO2 ESB на прокси-сервис Б, развернутый на другом экземпляре WSO2. При обработке ответа  от сервиса Б сервис А валится с ошибкой:
com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog
при этом в логах сервиса Б сообщение никаких "-" в прологе не содержит, и выглядит очень даже корректно.

Причина:

На самом деле сервис Б выдает multipart-ответ вида:
HTTP/1.1 200 OK
Content-Type: multipart/related; boundary="MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9"; type="application/xop+xml"; start="<0.78536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9@apache.org>"; start-info="text/xml"
Accept-Encoding: gzip,deflate
Host: 10.24.12.132:8280
Date: Fri, 18 Jan 2013 15:40:19 GMT
Server: Synapse-HttpComponents-NIO
Transfer-Encoding: chunked
Connection: Keep-Alive

--MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.78536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9@apache.org>

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><!--...--></soapenv:Body></soapenv:Envelope>
--MIMEBoundary_68536b3ce7bdd007e0bcc56b638c8e0f9b2cd5c381cba6e9--
Причина такого ответа в том, что на втором сервере включена MTOM-оптимизация. А вот на первом она выключена, поэтому он оптимизированных ответов не понимает.

Решение:

Т.к. для данного конкретного сервиса (особенно для его ответов), оптимизация была не нужна, я её выключил установкой свойства:
<property name="enableMTOM" value="false" scope="axis2"/>
в цепочке медиации сервиса Б перед отправкой ответа (в out / faultSequence).
Можно также отключить MTOM параметром сервиса:
<parameter name="enableMTOM">false</parameter>

Комментариев нет:

Отправить комментарий