Исключение NullReferenceException при отправке выходных данных XMLWrite в HttpContext.Response.OutputStream

StackOverflow https://stackoverflow.com/questions/284678

Вопрос

У меня есть приложение, в котором время от времени я получаю странную ошибку.Это фрагмент кода:

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.Промыть ();

Чтобы сделать процесс более увлекательным, это абсолютно невоспроизводимо.Просто это случается время от времени....

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

Есть еще какие-нибудь идеи?(любые указания приветствуются)

Это было полезно?

Решение

Отражатель дает это:

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(), которая, если копнуть глубже, может возникнуть при отключении клиента.

Другие советы

Вызов Flush - это то, что приведет к тому, что все, что кэшируется в памяти, будет записано в поток и, в конечном счете, клиенту, так что да, это может быть проблемой.

Вы упомянули, что выполнение запроса, как ожидается, займет много времени, поэтому возможно, что ASP.Net или IIS устанавливают слишком раннее время ожидания.Я бы предложил взглянуть на Свойство executionTimeout в web.config и аналогичные настройки.

Нет, если это происходит при вызове Flush, то это происходит намного позже, чем в первый раз Context.Response.OutputStream на самом деле есть ссылка.Значение извлекается при вызове XmlTextWriter конструктор, а потом больше на него не смотрели.

У вас есть еще какая-нибудь информация из трассировки стека?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top