Ведение журнала, поиск и устранение ошибок в ASP.NET Web API

| Четверг, 11 апреля, 2013

Метки: ASP.NET Web API Комментарии: 0

ASP.NET предоставляет два встроенных механизма ведения журнала, поиска и устранения ошибок. Обработка ошибок может показаться довольно сложным и запутанным занятием без применения этих двух механизмов, особенно если ошибки происходят во время выполнения до начала работы обработчиков сообщений HTTP и контроллеров.

Первый механизм – это правила обработки ошибок (error policy). Настроить правила обработки ошибок можно в свойстве IncludeErrorDetailPolicy конфигурационного объекта HTTPConfiguration. Это свойство имеет тип перечисления enum и указывает среде Web API, как обрабатывать исключения. Проинициализировать свойство можно, например, в Global.asax:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
              IncludeErrorDetailPolicy.Never;

Значения могут быть такие:

  • Default: Используется по умолчанию. Для хостинга ASP.NET применяется значение и элемента customErrors в файле web.config. Для локального хостинга используется значение LocalOnly.
  • LocalOnly: В сообщения об ошибках включаются детали только при локальном запросе.
  • Always: Детали ошибок показываются всегда.
  • Never: Детали ошибок не показываются никогда.

Когда происходит ошибка, Web API проверяет значение этого свойства, и, соответственно, возвращает или нет в ответном сообщении детали исключения. Например, если указана опция Always, то в ответное сообщение Web API добавит сериализованные детали исключения.

Второй механизм – трассировка (tracing). Трассировка – это сервис, который внедряется в приложение, как часть объекта конфигурации. Встроенная реализация ничего не делает.

public static void Register(HttpConfiguration config)
{
    config.Services.Replace(typeof(ITraceWriter), new MyTracer());
}

Поэтому нужно написать собственную реализацию интерфейса ITracerWriter, которую Web API будет использовать для трассировки. Это основной механизм трассировки, Web API будет использовать его везде и не только для ошибок.

public class MyTracer : ITraceWriter
{
    public void Trace(HttpRequestMessage request, string category, 
        TraceLevel level, Action<TraceRecord> traceAction)
    {
        TraceRecord rec = new TraceRecord(request, category, level);
        traceAction(rec);
        WriteTrace(rec);
    }

    protected void WriteTrace(TraceRecord rec)
    {
        var message = string.Format("{0};{1};{2}", 
            rec.Operator, rec.Operation, rec.Message);
        System.Diagnostics.Trace.WriteLine(message, rec.Category);
    }
}

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019