Трассировка в веб-API ASP.NET 2

При отладке веб-приложения незаменимы хорошие журналы трассировки. В этом руководстве показано, как включить трассировку в веб-API ASP.NET. Эту функцию можно использовать для трассировки того, что делает платформа веб-API до и после вызова контроллера. Его также можно использовать для трассировки собственного кода.

Версии программного обеспечения, используемые в руководстве

Включение трассировки System.Diagnostics в веб-API

Сначала мы создадим новый проект веб-приложения ASP.NET. В Visual Studio в меню "Файл " выберите "Создать>проект". В разделе "Шаблоны" в интернете выберите ASP.NET веб-приложение.

Изображение диалогового окна создания проекта

Выберите шаблон проекта веб-API.

Изображение выбранной веб API

В меню "Сервис" выберите Диспетчер пакетов NuGet, а затем консоль управления пакетами.

В окне консоли диспетчера пакетов введите следующие команды.

Install-Package Microsoft.AspNet.WebApi.Tracing
Update-Package Microsoft.AspNet.WebApi.WebHost

Первая команда устанавливает последний пакет трассировки веб-API. Он также обновляет основные пакеты веб-API. Вторая команда обновляет пакет WebApi.WebHost до последней версии.

Замечание

Если вы хотите использовать определенную версию веб-API, используйте флаг -Version при установке пакета трассировки.

Откройте файл WebApiConfig.cs в папке App_Start. Добавьте следующий код в метод Register .

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code
        config.EnableSystemDiagnosticsTracing();

        // Other configuration code not shown.
    }
}

Этот код добавляет класс SystemDiagnosticsTraceWriter в конвейер веб-API. Класс SystemDiagnosticsTraceWriter записывает трассировки в System.Diagnostics.Trace.

Чтобы просмотреть трассировки, запустите приложение в отладчике. В браузере перейдите к /api/values.

Изображение, отображающее измененный U R L

Инструкции трассировки записываются в окно вывода в Visual Studio. (В меню "Вид " выберите "Вывод").

Изображение инструкций трассировки

Так как SystemDiagnosticsTraceWriter записывает трассировки в System.Diagnostics.Trace, можно зарегистрировать дополнительные прослушиватели трассировки; Например, для записи трассировок в файл журнала. Дополнительные сведения о записи трассировок см. в разделе "Прослушиватели трассировки " в MSDN.

Настройка SystemDiagnosticsTraceWriter

В следующем коде показано, как настроить трассировщик.

SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
traceWriter.IsVerbose = true;
traceWriter.MinimumLevel = TraceLevel.Debug;

Существует два параметра, которые можно контролировать.

  • IsVerbose: если значение false, каждая трассировка содержит минимальную информацию. Если значение true, трассировки содержат дополнительные сведения.
  • MinimumLevel: задает минимальный уровень трассировки. Уровни логгирования, в порядке возрастания важности: Отладка, Информация, Предупреждение, Ошибка и Критическая ошибка.

Добавление трассировок в приложение веб-API

Добавление трассировщика обеспечивает моментальный доступ к трассировкам, созданным конвейером веб-API. Вы также можете использовать трассировщик для трассировки собственного кода.

using System.Web.Http.Tracing;

public class ProductsController : ApiController
{
    public HttpResponseMessage GetAllProducts()
    {
        Configuration.Services.GetTraceWriter().Info(
            Request, "ProductsController", "Get the list of products.");

        // ...
    }
}

Чтобы получить средство записи трассировки, вызовите HttpConfiguration.Services.GetTraceWriter. С контроллера этот метод доступен через свойство ApiController.Configuration .

Чтобы написать трассировку, можно вызвать метод ITraceWriter.Trace напрямую, но класс ITraceWriterExtensions определяет некоторые методы расширения, которые более понятны. Например, приведенный выше метод Info создает трассировку с информацией о уровне трассировки.

Инфраструктура трассировки веб-API

В этом разделе описывается, как писать пользовательский механизм записи трассировки для веб-API.

Пакет Microsoft.AspNet.WebApi.Tracing построен на основе более общей инфраструктуры трассировки в веб-API. Вместо использования Microsoft.AspNet.WebApi.Tracing можно также подключить к другой библиотеке трассировки и ведения журнала, например NLog или log4net.

Чтобы собрать трассировки, реализуйте интерфейс ITraceWriter. Ниже приведен простой пример:

public class SimpleTracer : 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);
    }
}

Метод ITraceWriter.Trace создает трассировку. Вызывающий объект задает категорию и уровень трассировки. Категория может быть любой определяемой пользователем строкой. Реализация Trace должна выполнять следующие действия:

  1. Создайте объект TraceRecord. Инициализируйте его с помощью запроса, категории и уровня трассировки, как показано. Эти значения предоставляются вызывающим абонентом.
  2. Вызовите делегата traceAction. В этом делегате вызывающий должен заполнить остальную часть TraceRecord.
  3. Напишите TraceRecord, используя любой способ ведения журнала, который вам нравится. Пример, показанный здесь, просто вызывает System.Diagnostics.Trace.

Настройка записи трассировки

Чтобы включить трассировку, необходимо настроить веб-API, чтобы оно использовало вашу реализацию ITraceWriter. Это можно сделать с помощью объекта HttpConfiguration , как показано в следующем коде:

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

Только один модуль записи трассировки может быть активным. По умолчанию веб-API задает трассировщик no-op, который ничего не делает. (Трассировщик "no-op" существует для того, чтобы код трассировки не должен был проверять, является ли модуль записи трассировки null перед записью трассировки.)

Как работает трассировка веб-API

Трассировка в веб-API использует шаблон фасада : при включении трассировки веб-API упаковывает различные части конвейера запросов с классами, выполняющими вызовы трассировки.

Например, при выборе контроллера конвейер использует интерфейс IHttpControllerSelector . При включенной трассировке конвейер вставляет класс, реализующий IHttpControllerSelector, однако все вызовы передаются реальной реализации:

Фасадный паттерн используется для трассировки веб-API.

К преимуществам этого дизайна относятся следующие преимущества:

  • Если модуль трассировки не добавлен, то компоненты трассировки не инстанцируются и не влияют на производительность.
  • Если вы заменяете службы по умолчанию, такие как IHttpControllerSelector собственной пользовательской реализацией, трассировка не затрагивается, так как трассировка выполняется объектом-оболочкой.

Вы также можете заменить всю платформу трассировки веб-API собственной пользовательской платформой, заменив службу ITraceManager по умолчанию:

config.Services.Replace(typeof(ITraceManager), new MyTraceManager());

Реализуйте ITraceManager.Initialize для инициализации системы трассировки. Помните, что это заменяет всю платформу трассировки, включая весь код трассировки, встроенный в веб-API.