Web Services SOAP主体包含UTF-8 BOM时出现JAX-WS错误

9udxz4iz  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(202)

我使用部署在WebLogic 10.3上的JAX-WS(v2.1.3 - Sun JDK 1.6.0_05)开发了一个Web Service,当我使用Java客户端、SoapUI或其他Web Service测试工具时,该Web Service工作正常。我需要使用2005 Microsoft SQL Server Reporting Services使用此服务,但收到以下错误
无法创建SOAP消息,因为出现异常:XML读取器错误:意外字符内容

SEVERE: Couldn't create SOAP message due to exception: XML reader error: unexpected character content: "?"
com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: unexpected character content: "?"
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:292)
at com.sun.xml.ws.transport.http.HttpAdapter.decodePacket(HttpAdapter.java:276)
at com.sun.xml.ws.transport.http.HttpAdapter.access$500(HttpAdapter.java:93)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:432)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:134)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: unexpected character content: "?"
at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:102)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:174)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:296)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:128)
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:287)
... 22 more

如果我使用HTTP代理来探查SSRS发送到JAX-WS的内容,我会看到EF BB BF作为post正文的开头,而JAX-WS不喜欢这样。如果我删除特殊字符并使用Fiddler重新提交请求,则Web服务调用将工作。
为什么JAX-WS在使用标准UTF-8 BOM时会崩溃?有没有解决这个问题的方法?如果有任何建议,我们将不胜感激。谢谢
--文尼

vfwfrxfs

vfwfrxfs1#

我们在将.Net客户端写入第三方Java Web服务时遇到了类似的问题,.Net包含字节顺序标记,Java服务将抛出异常。
第三方SOAP方法将单个字符串作为参数,而该字符串是一个XML文档(我喜欢那些不真正理解SOAP试图解决什么问题的人!)默认情况下,.net将UTF-8字节顺序标记添加到“payload”xml文档中,这严格来说是正确的,但实际上会导致问题。
在我们的案例中,我们发现了两种可能的客户端(.net)解决方案。但我不确定从SQL报告服务中实现这一点有多容易。
String.Trim()--xml在传递到soap方法之前必须被放入一个字符串中,调用.Trim()删除了字节顺序标记。
第二种方法是在XmlWriterSettings上设置UTF编码设置,方法稍有不同,如下所示:

XmlWriter xmlWriter = null;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = new UTF8Encoding(false);
xmlWriter = XmlWriter.Create(xmlSteam, settings);

重要位是“新UTF8 Encoding(false);“,该参数是“encoderShouldEmitUTF 8Identifier”,它基本上解决了这个问题。

nvbavucw

nvbavucw2#

一个变通办法:在将请求文档传递给JAX-WS服务之前,在仅使用BOM的Web应用程序上添加过滤器。

bqucvtff

bqucvtff3#

我们在托管由Java客户端使用的.NET WCF服务时遇到了这个问题。
.NET服务使用SoapCore,因此我们的解决方案是修改服务器应用程序的编码选项:

var encoder = new SoapEncoderOptions();
encoder.WriteEncoding = new UTF8Encoding(false); // <---- disables BOM which causes issue

app.UseEndpoints(endpoints => {
    endpoints.UseSoapEndpoint<IPingService>("/Service.svc", encoder, SoapSerializer.DataContractSerializer);
});

审查Microsoft documentation for UTF-8 encoding后发现此问题。
SoapCore存储库中的一个问题也提到了这一点:https://github.com/DigDes/SoapCore/issues/394

相关问题