NullReferenceException ao enviar saída XMLWrite para httpContext.Response.OutputStream

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

Pergunta

Eu tenho uma aplicação onde a cada momento e, em seguida, eu estou recebendo um erro estranho. Este é o pedaço de código:

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

O erro que eu estou recebendo é: Mensagem:. Referência de objeto não definida para uma instância de um objeto

na linha XMLWriter.Flush ();

Para tornar as coisas mais divertido, isso é absolutamente não-reprodutível. Ela só acontece de vez em quando ....

Uma vez que isso está acontecendo durante a lavagem do XML i estou supondo que o objeto que está agora nulo tem que ser o Response.OutputStream.

Esta é a parte relevante do rastreamento de pilha:

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

A minha pergunta é, em que casos isso pode estar acontecendo? Este servidor é um servidor de longa votação, para que o cliente pede algo, e eu não pode responder por 30 segundos ... É possível que este fluxo se tornará nulo se o cliente se desconecta (ie. Fecha a janela do navegador)?

Quaisquer outras ideias? (Qualquer ponteiros apreciado)

Foi útil?

Solução

refletor dá a este:

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

O único objeto que não é nulo verificado, inicializado ou referenciados através de outro método (o que mostrar no rastreamento de pilha) é this._buffers. O único lugar que é definido como nulo em que a classe está em RecycleBufferElements () que se você cavar mais fundo pode ocorrer quando o cliente se desconecta.

Outras dicas

A chamada para flush é o que fará com que qualquer coisa em cache na memória para ser escrito para o fluxo e, finalmente, o cliente então sim, pode ser o problema.

Você mencionou que o pedido é esperado para levar um longo tempo para executar por isso pode ser possível que ASP.Net ou IIS está cronometrando-lo para fora muito cedo. Gostaria de sugerir ter um olhar para o executionTimeout propriedade no web.config e configurações semelhantes.

Não, se isso acontece quando você chamar flush, que de maneira mais tarde do que o único Context.Response.OutputStream tempo é realmente referenciado. O valor é obtido na chamada para o construtor XmlTextWriter, e depois não olhou novamente.

Você tem mais alguma informação a partir do rastreamento de pilha?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top