Pergunta

Estou tentando consumir um webservice do SharePoint do ColdFusion via cfinvoke (porque não quero lidar com isso (leia:analisar) a própria resposta SOAP).

A resposta SOAP inclui um caractere de marca de ordem de byte (BOM), que produz a seguinte exceção em 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."

O padrão para codificação UTF-8 inclui opcionalmente o caractere BOM (http://unicode.org/faq/utf_bom.html#29).A Microsoft inclui quase universalmente o caractere BOM com fluxos codificados em UTF-8.Pelo que sei, não há como mudar isso no IIS.O analisador XML que JRun (ColdFusion) usa por padrão não lida com o caractere BOM para fluxos XML codificados em UTF-8.Então, parece que a maneira de corrigir isso é alterar o analisador XML usado pelo JRun (http://www.bpurcell.org/blog/index.cfm?mode=entry&entry=942).

A Adobe diz que não lida com o caractere BOM (veja comentários de anoynomous e hallL em 2 e 5 de maio).
http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_g-h_09.html#comments

Foi útil?

Solução

Direi que a resposta à sua pergunta (é possível?) é não.Não sei com certeza, mas o postador que comentou logo acima hallL (nos comentários desta página) forneceu uma solução alternativa para o problema - então presumo que seja possível lidar com isso ao analisar manualmente.

Você diz que está usando CFInvoke porque não quer lidar sozinho com a resposta do sabonete.Parece que você não tem escolha.

Outras dicas

Como Adam Tuttle já disse, a solução alternativa está na página que você vinculou

<!--- 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>

Parece que o ColdFusion está usando o Apache Axis nos bastidores.

Isso não se aplica exatamente à sua solução, mas já tive que lidar com esse problema uma vez ao consumir um serviço da web .NET com Apache Axis/Java.A única solução que consegui encontrar (já que o proprietário do serviço da web não estava disposto a mudar nada) foi escrever uma classe Handler que o Axis conectaria ao pipeline, o que excluiria o BOM da mensagem, se existisse.

Então talvez seja possível configurar o Axis através do ColdFusion?Se for assim você pode adicionar manipuladores adicionais ao fluxo de manipulação de mensagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top