0

最近、.NET (.asmx) Web サービスで次のような例外が見られます。

System.Web.Services.Protocols.SoapException: Server was unable to read request. ---> System.InvalidOperationException: There is an error in XML document (868, -3932). ---> System.Xml.XmlException: '.', hexadecimal value 0x00, is an invalid character. Line 868, position -3932.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
   at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, BufferBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
   at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
   at System.Xml.XmlTextReaderImpl.ParseText()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
   at System.Xml.XmlReader.ReadElementString()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read14_SendErrlog()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer12.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

この例外をデバッグするにはどうすればよいですか? この例外は、message.Stage = SoapMessageStage.AfterSerialize で例​​外を探す SOAP フィルターから報告されています。

元の石鹸リクエストを取得する方法はありますか? 行 868、列 -3932 で無効な文字を取得するにはどうすればよいですか? の列 3932をどのように作成できますか?

4

3 に答える 3

3

これは、Microsoft Web サービス アプローチの厄介な点の 1 つです。要求を Web メソッド シグネチャ内のオブジェクトに逆シリアル化できない場合、サービス コンシューマーは不可解なメッセージを受け取ります。それに加えて、リクエストは逆シリアル化できないため、エラーを適切に処理できないため、Web サービスに送信されることはありません。

この種の問題を解決するために私ができることは、生の XML を自分にとって便利な出力先 (ファイルまたは Trace を DebugView などで読み取るなど) に出力できるようにする新しい SoapExtension を作成することです。コードは BeforeDeserialize ステージに入ります。これらの問題のいずれかを調査したい場合は、web.config を介して SoapExtension を有効にすることができます。web.config を使用して SoapExtension を追加することの欠点は、Web アプリケーション全体に対してアクティブになることです。必要に応じて、サービスが特定のエンドポイントまたは特定の Web メソッドの情報のみをログに記録できるようにするカスタム構成を追加できます。

通常、受信した XML を見るだけで、何が問題なのかがわかります。そうでない場合は、XML シリアライザーを呼び出す小さなプログラムを使用して、キャプチャーされた XML を手動で実行し、何が起こっているかを調べることができます。もう 1 つの便利なツールは、Web Service Studio 2です。これは、データを入力してサービスを呼び出す (さらに必要な XML を送信する) ことができるテスト ハーネスです。

あなたの特定の問題に関して、ここに私の見解/推測があります。ASCII 文字の null がエンコードされてサービスに送信されているようですが、これは XML 仕様によれば無効です。簡単な答えは、その文字を送信しないことです。しかし、誰がそのキャラクターを送っていますか?.NET クライアントですか? クライアントを制御できますか? 他の人のバグを回避する必要がある場合は、問題のある文字を別の文字 (おそらく空の文字列) に置き換える必要があります。

于 2009-06-08T06:32:52.107 に答える
2

別のSoapExtensionを使用すると、元のメッセージを取得できるはずです。実際、同じ拡張子を変更して、入力のコピーを作成し、例外がない場合はそれを破棄することができます。例外が発生した場合は、元の入力を利用できます。

Fiddlerなどの外部ツールを使用して、送信された内容を監視することもできます。

于 2009-06-05T17:37:06.773 に答える