Упражнение. Создание пользовательского ПО промежуточного слоя
Разработчики могут создавать пользовательские компоненты по промежуточного слоя, чтобы добавить функциональные возможности в приложение ASP.NET Core. Настраиваемое ПО промежуточного слоя можно вставить в любом месте конвейера ПО промежуточного слоя и использовать с встроенными компонентами по промежуточного слоя, как показано в этом примере:
Группа сетевых операций вашей компании устраняет проблемы с производительностью в рабочей среде. Ваша команда поручила реализовать некоторые функции для повышения поддержки мониторинга приложения в режиме реального времени. Приложение должно записывать сведения о запросе в консоль. Для каждого запроса он должен регистрировать метод запроса, путь и код состояния ответа.
В этом упражнении вы создадите пользовательский компонент ПО промежуточного слоя, который регистрирует сведения о запросе сведений в консоль.
Добавление пользовательского ПО промежуточного слоя
Давайте изменим существующее приложение ASP.NET Core, чтобы включить пользовательское ПО промежуточного слоя, которое регистрирует сведения о запросе сведений в консоль.
Откройте файл Program.cs, если он еще не открыт.
Непосредственно перед
app.Run()вставой следующего кода:app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); });В предыдущем коде:
-
app.Use()добавляет в конвейер пользовательский компонент ПО промежуточного слоя. Компонент принимаетHttpContextобъект иRequestDelegateобъект в качестве параметров. - Делегат записывает в консоль метод запроса, путь и код состояния ответа.
-
await next()вызывает следующий компонент ПО промежуточного слоя в конвейере.
-
Тестирование изменений
Нажмите клавиши CTRL+SHIFT+F5 , чтобы перестроить и перезапустить приложение.
Когда откроется окно браузера, обратите внимание, что корневой URL-адрес отображает сообщение "Добро пожаловать в Contoso!"
Добавьте
/historyв URL-адрес и нажмите клавишу ВВОД. Браузер перенаправляется на страницу/about.В Visual Studio Code нажмите клавиши CTRL+SHIFT+P, чтобы открыть палитру команд. Найдите и выберите консоль отладки: фокус на режиме консоли отладки, чтобы перейти на вкладку "Консоль отладки" на нижней панели. Обратите внимание на следующие строки:
GET / 200 GET /about 200Выходные данные консоли показывают метод запроса, путь и код состояния ответа для каждого запроса. Первая строка отображает запрос на корневой URL-адрес, а вторая строка — запрос на
/aboutстраницу.Примечание.
Кроме того, браузер может запросить
/favicon.ico. Это стандартный запрос для фавикона веб-сайта и его можно игнорировать.Оставьте приложение запущенным для следующего упражнения.
Изменение порядка ПО промежуточного слоя
Приложение, кажется, работает, но есть проблема. Вы запросили страницу, но выходные /history данные консоли не отображаются. Это связано с тем, что компонент пользовательского ПО промежуточного слоя, который записывает сведения о запросах, был добавлен после ПО промежуточного слоя перезаписи URL-адресов. ПО промежуточного слоя перезаписи URL-адресов перенаправляет запросы и /history/about отправляет ответ, а компонент пользовательского ПО промежуточного слоя не видит запрос. Давайте исправим это.
Переместите добавленную
app.Use()строку непосредственно перед строкойapp.UseRewriter().Полный Program.cs файл должен выглядеть следующим образом:
using Microsoft.AspNetCore.Rewrite; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); }); app.UseRewriter(new RewriteOptions().AddRedirect("history", "about")); app.MapGet("/", () => "Hello World!"); app.MapGet("/about", () => "Contoso was founded in 2000."); app.Run();Теперь компонент пользовательского ПО промежуточного слоя добавляется перед ПО промежуточного слоя перезаписи URL-адресов. Пользовательский компонент ПО промежуточного слоя записывает сведения о запросе до того, как ПО промежуточного слоя перезаписи URL-адресов обрабатывает запрос и перенаправляет его.
Перезапустите приложение еще раз и протестируйте его, как и раньше. На этот раз выходные данные консоли отладки должны включать запрос на страницу
/history.GET / 200 GET /history 200 GET /about 200Выходные данные консоли теперь отображают запрос на
/historyстраницу прямо перед перенаправлением на страницу/about.
Исправление кода состояния
Приложение почти готово, но есть еще одна проблема. Код состояния в выходных данных консоли всегда равен 200, даже если приложение перенаправляет запрос. Код состояния запроса /history должен быть перенаправлен 302. Причина этого поведения — другая проблема порядка, в которой обрабатываются компоненты ПО промежуточного слоя.
Пользовательский компонент ПО промежуточного слоя записывает сведения в консоль, а затем вызывает await next() передачу следующему компоненту ПО промежуточного слоя. Проблема заключается в том, StatusCode что свойство объекта задается после запуска ответа компонентом по промежуточного Response слоя терминала. Давайте изменим код, чтобы исправить это.
В добавленном делегате переместите
Console.WriteLine()строку послеawait next()строки.Обновленный код должен выглядеть следующим образом:
app.Use(async (context, next) => { await next(); Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); });Теперь компонент пользовательского ПО промежуточного слоя записывает сведения о запросе после установки кода состояния ответа.
Перезапустите и проверьте
/historyзапрос еще раз. Выходные данные консоли отладки теперь должны отображать правильный код состояния.GET / 200 GET /history 302 GET /about 200