Вопрос

Я получаю странную прерывистую ошибку при попытке написать сообщение 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 (байт * SRC, байт * dest, int32 len) в system.web.util.stringutil.unsafestringcopy (строка src, int32 srcindex, char [] dest, int32 destindex, int32 len) При System.Web.httpwriter.write (строки S) на System.Web.httpresponse.write (строки S) на sso.httpresponsetracelistener.write (строковое сообщение) в httpresponsetracelistener.cs: линия 23 на SSO.httpresponsetracelistener.writeLine (строковое сообщение ) в httpresponsetracelistener.cs: линия 30 на System.diagnostics.traceInternal.writeline (строковое сообщение)

Класс 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 />");
    }
}
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top