Pregunta

Tengo una aplicación donde de vez en cuando recibo un error extraño. Este es el fragmento 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()

El error que obtengo es: Mensaje: Referencia de objeto no establecida en una instancia de un objeto.

en línea XMLWriter.Flush ();

Para hacer las cosas más divertidas, esto es absolutamente no reproducible. Simplemente sucede de vez en cuando ...

Dado que está sucediendo al vaciar el XML, supongo que el objeto que ahora es nulo tiene que ser el Response.OutputStream.

Esta es la parte relevante del seguimiento de la pila:

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

Mi pregunta es, ¿en qué casos podría estar pasando esto? Este servidor es un servidor de larga votación, por lo que el cliente pide algo y es posible que no responda durante 30 segundos ... ¿Es posible que este flujo se vuelva nulo si el cliente se desconecta (es decir, cierra la ventana del navegador)?

¿Alguna otra idea? (cualquier puntero apreciado)

¿Fue útil?

Solución

Reflector le da esto:

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

El único objeto que no se verifica, se inicializa o se hace referencia a través de otro método (que se mostraría en el seguimiento de la pila) es this._buffers. El único lugar en el que se establece como nulo en esa clase es en RecycleBufferElements (), que si profundiza puede ocurrir cuando el cliente se desconecta.

Otros consejos

La llamada a Flush es lo que hará que todo lo guardado en la memoria caché se escriba en la transmisión y, en última instancia, en el cliente, por lo que sí, puede ser el problema.

Usted mencionó que se espera que la solicitud tarde mucho tiempo en ejecutarse, por lo que es posible que ASP.Net o IIS lo estén agotando demasiado pronto. Sugeriría echar un vistazo a la propiedad de la ejecución de TimeTimeout en la web.config y configuraciones similares.

No, si sucede cuando llama a Flush, eso es mucho más tarde que la única vez que se hace referencia a Context.Response.OutputStream . El valor se obtiene en la llamada al constructor XmlTextWriter , y luego no se vuelve a mirar.

¿Tiene más información del seguimiento de la pila?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top