1

ときどき奇妙なエラーが発生するアプリケーションがあります。これはコードの一部です:

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 秒間応答しない場合があります... クライアントが切断した場合 (つまり、ブラウザー ウィンドウを閉じた場合)、このストリームが Null になる可能性はありますか?

他のアイデアはありますか?(任意のポインタをいただければ幸いです)

4

3 に答える 3

1

リフレクターはこれを与えます:

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()だけです。これを深く掘り下げると、クライアントが切断したときに発生する可能性があります。

于 2008-12-05T16:40:02.637 に答える
0

いいえ、Flush を呼び出したときに発生した場合は、Context.Response.OutputStream実際に参照されている唯一の時間よりもかなり後になります。値はコンストラクターへの呼び出しでフェッチされ、XmlTextWriter再度参照されることはありません。

スタック トレースからの情報はありますか?

于 2008-11-12T17:27:49.857 に答える
0

Flush の呼び出しにより、メモリにキャッシュされたものはすべてストリームに書き出され、最終的にはクライアントに書き出されるため、問題になる可能性があります。

リクエストの実行には時間がかかることが予想されるため、ASP.Net または IIS のタイムアウトが早すぎる可能性があるとのことでした。web.config の executionTimeout プロパティと同様の設定を確認することをお勧めします。

于 2008-11-26T09:54:27.497 に答える