2008-11-12 4 views
1

J'ai une application où de temps en temps je reçois une erreur étrange. Ce est le morceau de code:NullReferenceException lors de l'envoi de la sortie XMLWrite à httpContext.Response.OutputStream

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: Message: Référence d'objet non définie à une instance d'un objet.

sur la ligne XMLWriter.Flush(); Pour rendre les choses plus amusantes, ce n'est absolument pas reproductible. Cela arrive juste de temps en temps ....

Comme il se passe lors du vidage du XML, je devine que l'objet qui est maintenant nul doit être le Response.OutputStream.

Ceci est 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, dans ce cas, cela pourrait-il se produire? Ce serveur est un serveur à interrogation longue, donc le client demande quelque chose, et je ne peux pas répondre pendant 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) ?

D'autres idées? (tout pointeur apprécié)

Répondre

1

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 qui est vérifié non nulle, initialisé ou référencé par un autre procédé (qui montrerait 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() qui, si vous creusez plus profond peut se produire lorsque le client se déconnecte.

0

Non, si cela arrive lorsque vous appelez Flush, c'est bien plus tard que la seule fois où Context.Response.OutputStream est réellement référencé. La valeur est récupérée dans l'appel au constructeur XmlTextWriter et n'est pas regardée à nouveau.

Avez-vous plus d'informations de la trace de la pile?

+0

Je comprends cela, mais quelque chose de problème dans le OutputStream (qui est seulement utilisé lors de l'écriture) est nul? –

0

L'appel à Flush est ce qui entraînera l'écriture de tout ce qui est mis en cache dans la mémoire et, en fin de compte, du client, alors c'est peut-être le problème.

Vous avez mentionné que la requête devrait prendre beaucoup de temps à s'exécuter. Il est donc possible qu'ASP.Net ou IIS vous prévienne trop tôt. Je suggère de jeter un oeil à la executionTimeout property in the web.config et des paramètres similaires.

Questions connexes