0

尝试从 ASP.NET 应用程序使用的程序集编写 Diagnostics.Trace 消息时,我收到一个奇怪的间歇性错误。它是 IIS7 上的 .NET 3.5。

代码设置是,当 web.config 指定了调试时,我添加了一个HttpResponseTraceListenerto的实例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(String src, Int32 srcIndex, Char[] dest, Int32 destIndex, Int32 len)在 System.Web.HttpWriter.Write(String s) 在 System.Web.HttpResponse.Write(String s) 在 SSO.HttpResponseTraceListener.Write(String message) 在 HttpResponseTraceListener.cs:line 23 在 SSO.HttpResponseTraceListener.WriteLine(String message )在 HttpResponseTraceListener.cs:System.Diagnostics.TraceInternal.WriteLine(字符串消息)的第 30 行

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

1 回答 1

0

看起来问题是 TraceListeners 从未分离过。所以每次我点击页面时,我都会添加另一个页面。每次我写信给 Diagnostics.Trace 时,它​​都会写给所有附加的内容。但是对于某些 Response 对象无法写入。

为了修复它,我添加了代码,如果出现异常则不写。并且还添加了代码以在页面加载完成时删除侦听器。

于 2010-08-12T18:29:06.603 回答