Frage

Ich habe eine Anwendung, wo ab und zu einem seltsamen Fehler Ich erhalte. Dies ist das Stück Code:

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

Der Fehler ich erhalte ist: Nachricht:. Objektverweis nicht auf eine Instanz eines Objekts

on line XMLWriter.Flush ();

Um die Dinge mehr Spaß machen, das ist absolut nicht reproduzierbar. Es passiert einfach ab und zu ....

Da es passiert, wenn die XML-Spülung ich das Objekt bin zu raten, die jetzt null ist, hat die Response.OutputStream sein.

Dies ist der relevante Teil des Stack-Trace:

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

Meine Frage ist, in welchen Fällen könnte dies geschehen? Dieser Server ist ein lang Polling Server, so dass der Kunde nach etwas fragt, und ich kann nicht für 30 Sekunden beantworten ... Ist es möglich, dass dieser Strom Null sein wird, wenn der Client die Verbindung trennt (dh. Das Browserfenster schließt)?

Jede andere Ideen? (Alle Hinweise geschätzt)

War es hilfreich?

Lösung

Reflektor ergibt dies:

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

Das einzige Objekt, das nicht null überprüft wird, initialisiert oder durch eine andere Methode verwiesen (die in dem Stack-Trace zeigen würden) ist this._buffers. Der einzige Ort, es zu null in dieser Klasse festgelegt wird, ist in RecycleBufferElements (), die, wenn man tiefer graben kann auftreten, wenn der Client die Verbindung trennt.

Andere Tipps

Der Anruf ist zu spülen, was alles im Arbeitsspeicher zwischengespeichert verursacht in den Stream geschrieben werden und letztlich auch der Kunde also ja, kann es das Problem sein.

Sie erwähnte, dass die Anforderung eine lange Zeit in Anspruch nehmen wird erwartet, auszuführen, so kann es möglich sein, dass ASP.Net oder IIS ist Zeit früh zu dir. Ich würde vorschlagen, einen Blick auf die executionTimeout Eigenschaft in der web.config und ähnliche Einstellungen.

Nein, wenn es passiert, wenn man Flush nennen, das ist viel später als das einzige Mal, Context.Response.OutputStream tatsächlich verwiesen. Der Wert wird in dem Aufruf des XmlTextWriter Konstruktor geholt, und dann wieder nicht sah.

Haben Sie weitere Informationen aus dem Stack-Trace?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top