NullReferenceException lors de l'envoi d'une sortie XMLWrite vers httpContext.Response.OutputStream

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

Question

J'ai une application dans laquelle je reçois de temps en temps une erreur étrange. Ceci est le morceau de 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()

L'erreur que je reçois est la suivante: Message: La référence à l'objet n'est pas définie sur une instance d'objet.

en ligne XMLWriter.Flush ();

Pour rendre les choses plus amusantes, ceci est absolument non reproductible. Cela se produit de temps en temps ....

Etant donné que cela se produit lors du vidage du XML, je suppose que l'objet qui est maintenant nul doit être Response.OutputStream.

Il s'agit de la partie pertinente de la trace de la pile:

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

Ma question est la suivante: dans quels cas cela pourrait-il se produire? Ce serveur est un serveur à longue interrogation, le client demande donc quelque chose et je ne peux pas répondre avant 30 secondes ... Est-il possible que ce flux devienne nul si le client se déconnecte (c'est-à-dire ferme la fenêtre du navigateur)?

Avez-vous d'autres idées? (tous les pointeurs appréciés)

Était-ce utile?

La solution

Le réflecteur donne ceci:

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

Le seul objet non vérifié, initialisé ou référencé via une autre méthode (qui apparaîtrait dans la trace de la pile) est this._buffers. Le seul endroit où il est défini sur null dans cette classe est dans RecycleBufferElements (). Si vous creusez plus profondément, cela peut se produire lorsque le client se déconnecte.

Autres conseils

L’appel de Flush est ce qui fera que tout ce qui est mis en cache en mémoire sera écrit dans le flux et finalement dans le client, alors oui, c’est peut-être le problème.

Vous avez mentionné que l'exécution de la demande prendrait beaucoup de temps. Il est donc possible qu'ASP.Net ou IIS vous chronomètrent trop tôt. Je vous suggère de consulter la propriété executionTimeout dans le fichier Web.config et paramètres similaires.

Non, si cela se produit lorsque vous appelez Flush, c'est bien plus tard que le seul moment où Context.Response.OutputStream est réellement référencé. La valeur est extraite dans l'appel du constructeur XmlTextWriter , puis non réexaminée.

Avez-vous d'autres informations sur la trace de la pile?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top