2010-08-05 69 views
0

嘗試從ASP.NET應用程序使用的程序集編寫Diagnostics.Trace消息時,出現奇怪的間歇性錯誤。它是IIS7上的.NET 3.5。System.Diagnostics.Trace.TraceListener ASP.NET中的UnsafeStringCopy異常

代碼設置是,當web.config指定調試時,我將HttpResponseTraceListener的實例添加到System.Diagnostics.Trace.Listeners。我是這麼做的,所以在我的其他程序集中,我可以在測試服務器上運行時寫出調試信息,但我沒有設置使用visual studio進行調試。所以在我的其他程序集中,我使用System.Diagnostics.Trace.WriteLine來輸出信息,然後將其寫入響應流(內聯,但爲了我的目的,這很好)。

錯誤是:

對象引用不設置爲一個對象的一個​​實例。

相關堆棧信息是:

在System.Web.Util.StringUtil.memcpyimpl(BYTE * SRC,BYTE * DEST,的Int32 LEN) 在System.Web.Util.StringUtil.UnsafeStringCopy(字符串SRC ,Int32 srcIndex,Char [] dest,Int32 destIndex,Int32 len) at System.Web.HttpWriter.Write(String s) at System.Web.HttpResponse.Write(String s) at SSO.HttpResponseTraceListener.Write(String消息)在HttpResponseTraceListener.cs中:line 23 at SSO.HttpResponseTraceListener.WriteLine(String message)in HttpResponseTraceListener.cs:line 30 at System.Diagnostics.TraceInternal.WriteLine(String message )

TraceListener類如下:

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 />"); 
    } 
} 

回答

0

貌似問題是,TraceListeners從來沒有被分離。所以每次我點擊頁面時,我都會添加一個。每次我寫信給Diagnostics.Trace,它都會寫入所有附加的信息。但對於某些Response對象無法寫入。

要修復它,我添加了代碼,如果有異常,不寫。還添加了代碼以在頁面加載完成後刪除監聽器。