System.diagnostics.trace.tracelistener unsafestringcopy исключение из ASP.NET
-
26-09-2019 - |
Вопрос
Я получаю странную прерывистую ошибку при попытке написать сообщение 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 />");
}
}
Решение
Похоже, проблема заключалась в том, что травелистенеры никогда не были отделены. Поэтому каждый раз, когда я ударил страницу, я добавил другой. И каждый раз, когда я писал на диагностику. Но для некоторого ответа объект не мог быть написан.
Чтобы исправить это, я добавил код не писать, если произошло исключение. А также добавлен код для удаления слушателя, когда страница была выполнена загрузкой.