System.Diagnostics.Trace.TraceListener UnsafeStringCopy исключение из ASP.NET - PullRequest
0 голосов
/ 06 августа 2010

При попытке записать сообщение Diagnostics.Trace из сборки, используемой приложением ASP.NET, я получаю странную прерывистую ошибку.Это .NET 3.5 на IIS7.

Настройка кода такова, что когда в 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 (String src, Int32 srcIndex, Char [] dest, Int32 destIndex, Int32 len) в System.Web.HttpWriter.Write (String s) в System.Web.HttpResponse.Записать (String s) в SSO.HttpResponseTraceListener.Write (String message) в HttpResponseTraceListener.cs: строка 23 в SSO.HttpResponseTraceListener.WriteLine (String message) в HttpResponseTraceListener.cs: строка 30 в SystemTiagnest.Inter.Inter.)

Класс 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 />");
    }
}

1 Ответ

0 голосов
/ 12 августа 2010

Похоже, проблема была в том, что TraceListeners никогда не были отсоединены.Поэтому каждый раз, когда я заходил на страницу, я добавлял еще одну.И каждый раз, когда я писал в Diagnostics.Trace, он записывал все, что было прикреплено.Но для некоторых объект Response не мог быть записан.

Чтобы исправить это, я добавил код, чтобы не писать, если было исключение.А также добавлен код для удаления прослушивателя после завершения загрузки страницы.

...