【问题标题】:NullReferenceException when sending XMLWrite output to httpContext.Response.OutputStream将 XMLWrite 输出发送到 httpContext.Response.OutputStream 时出现 NullReferenceException
【发布时间】:2008-11-12 17:24:20
【问题描述】:

我有一个应用程序时不时地遇到一个奇怪的错误。 这是一段代码:

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?

还有其他想法吗? (任何指针表示赞赏)

【问题讨论】:

    标签: asp.net null objectoutputstream


    【解决方案1】:

    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;
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        你有更多来自堆栈跟踪的信息吗?

        【讨论】:

        • 我明白,但是 OutputStream 中的问题(仅在写入时使用)为空?
        猜你喜欢
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 2021-06-03
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多