关于Web服务:CF中不需要BOM,但由IIS / SharePoint发送

关于Web服务:CF中不需要BOM,但由IIS / SharePoint发送

BOM not expected in CF but sent by IIS/SharePoint

我正在尝试通过cfinvoke从ColdFusion使用SharePoint Web服务(因为我不想处理(读取:解析)SOAP响应本身)。

SOAP响应包含一个字节顺序标记字符(BOM),该字符在CF中产生以下异常:

1
2
3
4
5
6
"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


正如亚当·塔特尔(Adam Tuttle)所说的那样,解决方法在您链接到的页面上

1
2
3
4
<!--- 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>

我要说的是您的问题的答案(可能吗?)不是。我不确定,但是在halL上方(在此页面的注释中)发表评论的海报提供了解决该问题的方法-因此,我认为手动解析时可以进行处理。

您说您正在使用CFInvoke,因为您不想自己处理肥皂响应。看来您别无选择。


听起来像ColdFusion在后台使用Apache Axis。

这并不完全适用于您的解决方案,但是在使用Apache Axis / Java使用.NET Web服务之前,我不得不处理一次此问题。我能够找到的唯一解决方案(由于Web服务的所有者不愿意在其末端更改任何内容)是编写一个Handler类,Axis将其插入管道中,如果存在的话,该类将从消息中删除BOM。

那么也许可以通过ColdFusion配置Axis?如果是这样,则可以将其他处理程序添加到消息处理流程。


推荐阅读