2008-11-12 67 views
1

我有一个应用程序,其中每隔一段时间我得到一个奇怪的错误。 这是一段代码:NullReferenceException当发送XMLWrite输出到httpContext.Response.OutputStream

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() 

我得到的错误是: 消息:对象没有设置为一个对象的一个​​实例。

on line 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秒内回答... 如果客户端断开连接(即关闭浏览器窗口),该流可能会变为空, ?

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

回答

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(),如果您深入挖掘,则可能会在客户端断开连接时发生。

0

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

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

+0

我明白,但OutputStream中有问题的东西(仅在写入时才使用)为空? – 2008-11-12 20:54:59

0

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

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