我有一个应用程序,偶尔我会遇到一个奇怪的错误。 这是一段代码:
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的Object必须是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秒...... 如果客户端断开连接(即关闭浏览器窗口),该流是否可能变为空?
还有其他想法吗? (任何指针赞赏)
答案 0 :(得分: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(),如果您在客户端断开连接时可以进行更深入的挖掘。
答案 1 :(得分:0)
不,如果在调用Flush时发生这种情况,那么这比实际引用Context.Response.OutputStream
的时间要晚。该值在调用XmlTextWriter
构造函数时获取,然后不再查看。
您是否有来自堆栈跟踪的更多信息?
答案 2 :(得分:0)
对Flush的调用是什么会导致在内存中缓存的任何内容写入流并最终写入客户端,所以是的,这可能是问题。
您提到请求预计需要很长时间才能执行,因此ASP.Net或IIS可能会过早计时。我建议看一下executionTimeout property in the web.config和类似设置。