0

カスタム バインディングを介して SOAP メッセージを受け入れる Web サービスを実行しています。

メッセージは正しくディスパッチされ、ほとんどのメッセージは正常に処理されます。メッセージの処理中に、メッセージは次を使用して XmlDocument に読み取られます。

XmlDocument doc = new XmlDocument();
try {
    doc.Load(msg.GetReaderAtBodyContents());
} catch (XmlException x) {
    e = x;
} catch (IOException x) {
    e = x;
}

ただし、サービスの負荷が増加すると (おそらくスレッドの問題でしょうか? カスタム トランスポート チャネルが WebMessageEncoder を使用してメッセージを作成した後、メッセージは他のどこにもアクセスされないため、想像できません)、XmlException がまれにスローされますが、入力メッセージはわかった。

予期しないファイルの末尾。次の要素が閉じていません: A、B、Body、Envelope。行 28、位置 9。

コードのこの行にブレークポイントを設定したので、msg.ToString() の現在の値を確認できます。これにより、http://www.validome.org/ のようなバリデーターで適切に検証される XML ファイルが得られます。 xml/検証/

本体は、msg.GetReaderAtBodyContents() でリーダーを使用して 1 回だけ読み取ることができるストリーム形式にすることもできるため、msg.ToString() の呼び出しが常に適切に機能する必要はないことに注意してください。

この奇妙な動作の理由は、WebHttpBinding で 25000 を超えるリクエストで正常に動作するため、カスタム バインディングにあるようです。

私のトランスポート チャネルでは、入力ソースから byte[] 本体にメッセージを抽出した後に、このコードを使用します。

Message message = encoder.ReadMessage(
new ArraySegment<byte>(body, 0, contentLength), bufferManager, contentType);

ヘッダーは後で適用され、メッセージは RequestContext の RequestMessage プロパティに直接入れられます。エラーには忘れていたものがあるはずです。しかし、何?

4

1 に答える 1

1

問題は、encoder.ReadMessageを2回呼び出して、デバッグ出力用のメッセージとRequestContextに渡すメッセージを1つずつ持つことでした。残念ながら、ReadMessageはbyte[]バッファをプールに返します。負荷が増加すると、別のスレッドが2つのReadMessage呼び出しの間のバッファーを取得し、それを独自のもので上書きする可能性があります。2番目のメッセージはServiceModelに転送されたため、このプロセスによって破損した可能性があります。

于 2009-08-14T07:47:24.647 に答える