BOM在CF中不是预期的,但由IIS / SharePoint发送
我试图通过cfinvoke从ColdFusion使用SharePoint Web服务(因为我不想处理(读取:解析)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中进行更改。默认情况下,JRun(ColdFusion)使用的XML解析器不处理UTF-8编码的XML流的BOM字符。因此,似乎解决此问题的方法是更改JRun使用的XML解析器(http://www.bpurcell.org/blog/index.cfm?mode=entry&entry=942)。
Adobe表示,它不处理BOM字符(请参阅5月2日和5日来自anoynomous和halL的评论)。
http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_g-h_09.html#comments
解决方案
回答
听起来ColdFusion在后台使用了Apache Axis。
这并不完全适用于解决方案,但是在使用Apache Axis / Java使用.NET Web服务之前,我不得不处理过一次此问题。我能够找到的唯一解决方案(由于Web服务的所有者不愿意在其末端进行任何更改)是编写一个Handler类,Axis将其插入到管道中,该管道将在消息中删除BOM(如果存在的话)。
那么也许可以通过ColdFusion配置Axis吗?如果是这样,我们可以将其他处理程序添加到消息处理流程中。
回答
我要说的是,问题的答案(可能吗?)是否定的。我不确定,但是在halL上方(在此页面的注释中)发表评论的海报提供了解决该问题的方法-因此我认为手动解析时可以处理。
我们说我们正在使用CFInvoke是因为我们不想自己处理肥皂响应。看来我们别无选择。
回答
正如Adam Tuttle已经说过的那样,解决方法在我们链接到的页面上
<!--- 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>