2008-11-12 3 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, я угадываю объект, который теперь является нулевым, должен быть 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, если клиент отключится (т.е. закрывает окно браузера) ?

Любые другие идеи? (любые указатели оцениваются)

ответ

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 и аналогичные настройки.

Смежные вопросы