Трассировка в веб-API ASP.NET 2
При попытке отладки веб-приложения нет замены хорошего набора журналов трассировки. В этом руководстве показано, как включить трассировку в веб-API ASP.NET. Эту функцию можно использовать для отслеживания того, что делает платформа веб-API до и после вызова контроллера. Его также можно использовать для трассировки собственного кода.
Версии программного обеспечения, используемые в этом руководстве
- Visual Studio 2017 (также работает с Visual Studio 2015)
- Веб-API 2
- Microsoft.AspNet.WebApi.Tracing
Включение трассировки System.Diagnostics в веб-API
Сначала мы создадим проект веб-приложения ASP.NET. В Visual Studio в меню Файл выберите Создать>проект. В разделе Шаблоны, Веб выберите ASP.NET Веб-приложение.
Выберите шаблон проекта веб-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
.
Инструкции трассировки записываются в окно Вывод в 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 создает трассировку с уровнем трассировки 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 должна выполнять следующие действия.
- Создайте traceRecord. Инициализируйте его с помощью запроса, категории и уровня трассировки, как показано ниже. Эти значения предоставляются вызывающим.
- Вызовите делегат traceAction . Внутри этого делегата вызывающий объект должен заполнить остальную часть TraceRecord.
- Напишите TraceRecord, используя любой способ ведения журнала, который вам нравится. Приведенный здесь пример просто вызывает System.Diagnostics.Trace.
Настройка модуля записи трассировки
Чтобы включить трассировку, необходимо настроить веб-API для использования реализации ITraceWriter . Это можно сделать с помощью объекта HttpConfiguration , как показано в следующем коде:
public static void Register(HttpConfiguration config)
{
config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());
}
Может быть активен только один модуль записи трассировки. По умолчанию веб-API задает трассировку без операций, которая ничего не делает. (Трассировщик без операции существует, поэтому код трассировки не должен проверка, имеет ли модуль записи трассировки значение NULL перед записью трассировки.)
Как работает трассировка веб-API
Трассировка в веб-API использует шаблон фасада . Если трассировка включена, веб-API заключает различные части конвейера запросов с классами, которые выполняют вызовы трассировки.
Например, при выборе контроллера конвейер использует интерфейс IHttpControllerSelector . Если трассировка включена, конвейер вставляет класс, который реализует IHttpControllerSelector , но вызывает к реальной реализации:
К преимуществам этого дизайна относятся:
- Если не добавить модуль записи трассировки, компоненты трассировки не создаются и не влияют на производительность.
- Если заменить службы по умолчанию, такие как IHttpControllerSelector , собственной пользовательской реализацией трассировка не повлияет, так как трассировка выполняется объектом-оболочкой.
Вы также можете заменить всю платформу трассировки веб-API собственной пользовательской платформой, заменив службу ITraceManager по умолчанию:
config.Services.Replace(typeof(ITraceManager), new MyTraceManager());
Реализуйте ITraceManager.Initialize для инициализации системы трассировки. Имейте в виду, что это заменяет всю платформу трассировки, включая весь код трассировки, встроенный в веб-API.