XMLWrite出力をhttpContext.Response.OutputStreamに送信するときのNullReferenceException
-
08-07-2019 - |
質問
私は時々、奇妙なエラーを受け取るアプリケーションを持っています。 これはコードの一部です:
Dim XMLWriter As New System.Xml.XmlTextWriter(Me.Context.Response.OutputStream, Encoding.UTF8)
XMLWriter.WriteStartDocument()
XMLWriter.WriteStartElement("Status")
Message.SerializeToXML(XMLWriter)
XMLWriter.WriteEndElement()
XMLWriter.WriteEndDocument()
XMLWriter.Flush()
XMLWriter.Close()
私が得ているエラーは: メッセージ:オブジェクトの参照がオブジェクトのインスタンスに設定されていません。
オンラインXMLWriter.Flush();
物事をもっと楽しくするために、これは絶対に再現できません。それはたまに起こるだけです。...
XMLをフラッシュするときに発生するため、現在nullであるオブジェクトはResponse.OutputStreamである必要があると推測しています。
これはスタックトレースの関連部分です。
Description:
An unhandled exception occurred and the process was terminated.
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
StackTrace: at System.Web.HttpWriter.BufferData(Byte[] data, Int32 offset, Int32 size, Boolean needToCopyData)
at System.Web.HttpWriter.WriteFromStream(Byte[] data, Int32 offset, Int32 size)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.Xml.XmlTextWriter.Flush()
at RequestData.CompleteRequest(MessageBase Message) in RequestData.vb:line 142
私の質問は、どのような場合にこれが起こるのでしょうか? このサーバーは長時間ポーリングサーバーなので、クライアントが何かを要求しますが、30秒間応答しない場合があります... クライアントが切断した場合(つまり、ブラウザウィンドウを閉じた場合)、このStreamがNullになる可能性はありますか?
他のアイデアはありますか? (任意のポインタを高く評価)
解決
Reflectorはこれを提供します:
private void BufferData(byte[] data, int offset, int size, bool needToCopyData)
{
int num;
if (this._lastBuffer != null)
{
num = this._lastBuffer.Append(data, offset, size);
size -= num;
offset += num;
}
else if ((!needToCopyData && (offset == 0)) && !this._responseBufferingOn)
{
this._buffers.Add(new HttpResponseBufferElement(data, size));
return;
}
while (size > 0)
{
this._lastBuffer = this.CreateNewMemoryBufferElement();
this._buffers.Add(this._lastBuffer);
num = this._lastBuffer.Append(data, offset, size);
offset += num;
size -= num;
}
}
nullでチェック、初期化、または別のメソッド(スタックトレースに表示される)を介して参照されない唯一のオブジェクトはthis._buffersです。そのクラスでnullに設定される唯一の場所は、RecycleBufferElements()です。これは、クライアントが切断されたときにさらに掘り下げると発生する可能性があります。
他のヒント
Flushを呼び出すと、メモリにキャッシュされたものがすべてストリームに書き込まれ、最終的にはクライアントに書き込まれるため、問題になる可能性があります。
リクエストの実行には長い時間がかかることが予想されるため、ASP.NetまたはIISがタイムアウトするのが早すぎる可能性があります。 web.configのexecutionTimeoutプロパティおよび同様の設定。
いいえ、Flushを呼び出したときに発生した場合、 Context.Response.OutputStream
が実際に参照される時間よりも遅くなります。値は、 XmlTextWriter
コンストラクターの呼び出しで取得され、再度確認されることはありません。
スタックトレースからの情報はありますか?