簡體   English   中英

當 SOAP 主體包含 UTF-8 BOM 時出現 JAX-WS 錯誤

[英]JAX-WS errors when SOAP body contains UTF-8 BOM

我使用部署在 WebLogic 10.3 上的 JAX-WS (v2.1.3 - Sun JDK 1.6.0_05) 開發了一個 Web 服務,當我使用 Java 客戶端或 SoapUI 或其他 Web 服務測試工具時,它工作得很好。 我需要使用 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 作為帖子正文的開頭,而 JAX-WS 不喜歡那樣。 如果我刪除特殊字符並使用 Fiddler 重新提交請求,則 Web 服務調用有效。

為什么 JAX-WS 會因標准的 UTF-8 BOM 而崩潰? 有沒有解決方法來解決這個問題? 任何建議將不勝感激。 謝謝

--文尼

我們在將.Net客戶端編寫到第三方Java Web服務時遇到了類似的問題,.Net包含字節順序標記,Java服務會拋出異常。

第三方SOAP方法將一個字符串作為參數,該字符串是一個XML文檔(我喜歡那些不太了解SOAP試圖解決的問題的人!)默認情況下.net添加了UTF-8字節順序標記為“有效負載”xml文檔,這是嚴格正確的,但在實踐中會導致問題。

在我們的例子中,我們從客戶端(.net)端找到了兩種可能的解決方案。 我不確定從SQL Reporting服務做起來會有多容易。

String.Trim() - 在傳入soap方法之前,必須將xml放入字符串中,調用.Trim()刪除字節順序標記。 簡單。

第二種方法是在XmlWriterSettings上設置UTF編碼設置略有不同,如下所示:

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

重要的一點是“new UTF8Encoding( false );”,該參數是“encoderShouldEmitUTF8Identifier”並且幾乎​​解決了這個問題。

一個解決方法的想法:在將請求文檔傳遞給JAX-WS服務之前,在僅消耗BOM的Web應用程序上添加過濾器。

我們在托管 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 的 UTF-8 編碼文檔后發現的。

SoapCore 存儲庫中的一個問題也提到了相同的內容: https : //github.com/DigDes/SoapCore/issues/394

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM