2010-08-05 3 views
0

Je reçois une erreur intermittente étrange lorsque j'essaie d'écrire un message Diagnostics.Trace à partir d'un assembly utilisé par une application ASP.NET. C'est .NET 3.5 sur IIS7.System.Diagnostics.Trace.TraceListener UnsafeStringCopy exception from ASP.NET

La configuration de code est que lorsque web.config a débogué spécifié, j'ajoute une instance de HttpResponseTraceListener à System.Diagnostics.Trace.Listeners. Je le fais de telle sorte que dans mon autre assemblage, je puisse écrire des informations de débogage lors de l'exécution sur un serveur de test que je ne suis pas configuré pour déboguer en utilisant Visual Studio. Donc, dans mon autre assemblage, j'utilise System.Diagnostics.Trace.WriteLine pour sortir des informations, qui sont ensuite écrites dans le flux de réponse (inline, mais dans mon cas c'est très bien).

L'erreur est:

Référence d'objet non définie à une instance d'un objet.

L'information de pile concerné est la suivante:

à System.Web.Util.StringUtil.memcpyimpl (Byte * src, Byte * dest, Int32 len) à System.Web.Util.StringUtil.UnsafeStringCopy (String src , Int32 srcIndex, Char [] dest, Int32 destIndex, Int32 len) à System.Web.HttpWriter.Write (Chaînes) à System.Web.HttpResponse.Write (String s) à SSO.HttpResponseTraceListener.Write (String message) dans HttpResponseTraceListener.cs: ligne 23 à SSO.HttpResponseTraceListener.WriteLine (message de chaîne) dans HttpResponseTraceListener.cs: ligne 30 à System.Diagnostics.TraceInternal.WriteLine (message String)

La classe TraceListener est la suivante:

public class HttpResponseTraceListener : TraceListener 
{ 
    public System.Web.HttpResponse Response { get; private set; } 
    public HttpResponseTraceListener(System.Web.HttpResponse response) 
    { 
     Response = response; 
    } 
    public override void Write(string message) 
    { 
     if (!string.IsNullOrEmpty(message) 
     && null != Response 
     && null != Response.OutputStream 
     && Response.OutputStream.CanWrite) 
     { 
      Response.Write(System.Web.HttpUtility.HtmlEncode(message)); 
     } 

    } 

    public override void WriteLine(string message) 
    { 
     this.Write(message); 
     Response.Write("<BR />"); 
    } 
} 

Répondre

0

On dirait que le problème était que les TraceListeners ne se sont détachés. Donc, chaque fois que j'ai frappé la page, j'en ai ajouté une autre. Et chaque fois que j'écrivais à Diagnostics.Trace, j'écrivais à tous ceux qui étaient attachés. Mais pour certains, l'objet Response n'a pas pu être écrit. Pour corriger cela, j'ai ajouté le code pour ne pas écrire s'il y avait une exception. Et également ajouté du code pour supprimer l'écouteur lorsque la page a été chargée.