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 秒内没有回答......如果客户端断开连接(即关闭浏览器窗口),这个 Stream 是否有可能变为 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;
    }
}

唯一不通过其他方法检查、初始化或引用的对象(将显示在堆栈跟踪中)是 this._buffers。在该类中它设置为 null 的唯一位置是在 RecycleBufferElements() 中,如果您深入挖掘,可能会在客户端断开连接时发生。

于 2008-12-05T16:40:02.637 回答
0

Context.Response.OutputStream不,如果它发生在您调用 Flush 时,那将比实际引用的唯一时间晚。该值在对XmlTextWriter构造函数的调用中获取,然后不再查看。

您是否有来自堆栈跟踪的更多信息?

于 2008-11-12T17:27:49.857 回答
0

对 Flush 的调用将导致内存中缓存的任何内容被写入流并最终写入客户端,所以是的,这可能是问题所在。

您提到该请求预计需要很长时间才能执行,因此 ASP.Net 或 IIS 可能会过早地让您超时。我建议查看web.config和类似设置中的 executionTimeout 属性。

于 2008-11-26T09:54:27.497 回答