5

私は、WebLogic 10.3 にデプロイされた JAX-WS (v2.1.3 - Sun JDK 1.6.0_05) を使用して Web サービスを開発しました。この 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 で爆発するのはなぜですか? この問題を回避するための回避策はありますか? どんな提案でも大歓迎です。ありがとう

--ヴィニー

4

3 に答える 3

2

.Net クライアントをサード パーティの Java Web サービスに書き込む際にも同様の問題がありました。.Net にはバイト オーダー マークが含まれており、Java サービスは例外をスローしていました。

サード パーティの SOAP メソッドは引数として 1 つの文字列を取り、その文字列は XML ドキュメントでした (SOAP が解決しようとしている問題を本当に理解していない人が大好きです!) デフォルトで .net は UTF-8 バイト オーダーを追加しました。これは厳密には正しいですが、実際には問題を引き起こします。

私たちの場合、クライアント (.net) 側から 2 つの解決策が見つかりました。ただし、これが SQL レポート サービスからどれほど簡単に実行できるかはわかりません。

String.Trim() - SOAP メソッドに渡す前に xml を文字列に入れる必要があり、.Trim() を呼び出すとバイト オーダー マークが削除されました。簡単。

2 番目の方法は、次のように、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」であり、問​​題をほぼ解決します。

于 2010-09-14T12:23:48.807 に答える
1

1 つの回避策のアイデア: 要求ドキュメントを JAX-WS サービスに渡す前に、BOM を消費するだけの Web アプリケーションにフィルターを追加します。

于 2009-10-28T20:20:06.687 に答える
0

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);
});

これは、UTF-8 エンコーディングに関する Microsoft のドキュメントを確認した後に発見されました。

SoapCore リポジトリの問題には、同じことが言及されています: https://github.com/DigDes/SoapCore/issues/394

于 2021-12-29T18:49:30.393 に答える