Спецификация не ожидается в CF, но отправляется IIS/SharePoint

Я пытаюсь использовать веб-службу SharePoint из ColdFusion через cfinvoke (потому что я не хочу иметь дело (читай: анализировать) сам ответ SOAP).

Ответ SOAP включает символ метки порядка байтов (BOM), который создает следующее исключение в CF:

"Cannot perform web service invocation GetList.
The fault returned when invoking the web service operation is:
'AxisFault
faultCode: {http://www.w3.org/2003/05/soap-envelope}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXParseException: Content is not allowed in prolog."

Стандарт кодировки UTF-8 дополнительно включает символ BOM (http://unicode.org/faq/utf_bom.html#29). Microsoft почти повсеместно включает символ BOM в потоки в кодировке UTF-8. Насколько я могу судить, изменить это в IIS невозможно. Анализатор XML, который JRun (ColdFusion) использует по умолчанию, не обрабатывает символ спецификации для XML-потоков в кодировке UTF-8. Таким образом, похоже, что способ исправить это — изменить синтаксический анализатор XML, используемый JRun (http://www.bpurcell.org/blog/index.cfm?mode=entry&entry=942).

Adobe заявляет, что не обрабатывает символ BOM (см. комментарии anoynomous и hall от 2 и 5 мая).
http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_g-h_09.html#comments


person antony.trupe    schedule 11.09.2008    source источник
comment
У меня точно такая же проблема с веб-сервисом Websphere 6.1.   -  person djangofan    schedule 31.05.2012


Ответы (3)


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

Вы говорите, что используете CFInvoke, потому что не хотите сами разбираться с ответом мыла. Похоже, у тебя нет выбора.

person Adam Tuttle    schedule 11.09.2008

Как уже сказал Адам Таттл, обходной путь находится на странице, на которую вы ссылаетесь.

<!--- Remove BOM from the start of the string, if it exists --->
<cfif Left(responseText, 1) EQ chr(65279)>
<cfset responseText = mid(xmlText, 2, len(responseText))>
</cfif>
person Dan Cramer    schedule 16.09.2008

Похоже, что ColdFusion использует Apache Axis под прикрытием.

Это не совсем относится к вашему решению, но мне уже приходилось сталкиваться с этой проблемой однажды при использовании веб-службы .NET с Apache Axis/Java. Единственное решение, которое я смог найти (поскольку владелец веб-сервиса не хотел ничего менять со своей стороны), состоял в том, чтобы написать класс Handler, который Axis подключил бы к конвейеру, который удалил бы спецификацию из сообщения, если бы она существовала.

Так что, возможно, можно настроить Axis через ColdFusion? В этом случае вы можете добавить дополнительные обработчики в поток обработки сообщений.

person matt b    schedule 11.09.2008