NullReferenceException durante l'invio dell'output XMLWrite a httpContext.Response.OutputStream

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

Domanda

Ho un'applicazione in cui ogni tanto ricevo uno strano errore. Questo è il pezzo di codice:

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

L'errore che sto ricevendo è: Messaggio: riferimento all'oggetto non impostato su un'istanza di un oggetto.

on line XMLWriter.Flush ();

Per rendere le cose più divertenti, questo è assolutamente non riproducibile. Succede solo ogni tanto ....

Dato che sta accadendo quando si scarica l'XML, suppongo che l'Oggetto che ora è nullo debba essere Response.OutputStream.

Questa è la parte rilevante della traccia dello stack:

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

La mia domanda è: in quali casi potrebbe accadere? Questo server è un server a lungo polling, quindi il client chiede qualcosa e potrei non rispondere per 30 secondi ... È possibile che questo Stream diventi Null se il client si disconnette (ovvero chiude la finestra del browser)?

Altre idee? (eventuali suggerimenti apprezzati)

È stato utile?

Soluzione

Reflector dà questo:

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

L'unico oggetto che non è null controllato, inizializzato o referenziato attraverso un altro metodo (che mostrerebbe nella traccia dello stack) è this._buffers. L'unico posto in cui è impostato su null in quella classe è in RecycleBufferElements () che se si scava più in profondità può verificarsi quando il client si disconnette.

Altri suggerimenti

La chiamata a Flush è ciò che farà sì che qualsiasi cosa memorizzata nella cache venga scritta nello stream e, in definitiva, nel client, quindi sì, potrebbe essere il problema.

Hai menzionato che l'esecuzione della richiesta dovrebbe richiedere molto tempo, quindi è possibile che ASP.Net o IIS ti stiano eseguendo il timeout troppo presto. Vorrei suggerire di dare un'occhiata alla esecuzioneTimeout proprietà nel web.config e impostazioni simili.

No, se succede quando chiami Flush, è molto più tardi della sola volta in cui Context.Response.OutputStream viene effettivamente referenziato. Il valore viene recuperato nella chiamata al costruttore XmlTextWriter e quindi non esaminato di nuovo.

Hai ulteriori informazioni dalla traccia dello stack?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top