Упражнение. Создание пользовательского ПО промежуточного слоя

Завершено

Разработчики могут создавать пользовательские компоненты по промежуточного слоя, чтобы добавить функциональные возможности в приложение ASP.NET Core. Настраиваемое ПО промежуточного слоя можно вставить в любом месте конвейера ПО промежуточного слоя и использовать с встроенными компонентами по промежуточного слоя, как показано в этом примере:

Схема, показывающая поток запроса через конвейер.

Группа сетевых операций вашей компании устраняет проблемы с производительностью в рабочей среде. Ваша команда поручила реализовать некоторые функции для повышения поддержки мониторинга приложения в режиме реального времени. Приложение должно записывать сведения о запросе в консоль. Для каждого запроса он должен регистрировать метод запроса, путь и код состояния ответа.

В этом упражнении вы создадите пользовательский компонент ПО промежуточного слоя, который регистрирует сведения о запросе сведений в консоль.

Добавление пользовательского ПО промежуточного слоя

Давайте изменим существующее приложение ASP.NET Core, чтобы включить пользовательское ПО промежуточного слоя, которое регистрирует сведения о запросе сведений в консоль.

  1. Откройте файл Program.cs, если он еще не открыт.

  2. Непосредственно перед 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() вызывает следующий компонент ПО промежуточного слоя в конвейере.

Тестирование изменений

  1. Нажмите клавиши CTRL+SHIFT+F5 , чтобы перестроить и перезапустить приложение.

  2. Когда откроется окно браузера, обратите внимание, что корневой URL-адрес отображает сообщение "Добро пожаловать в Contoso!"

  3. Добавьте /history в URL-адрес и нажмите клавишу ВВОД. Браузер перенаправляется на страницу /about .

  4. В Visual Studio Code нажмите клавиши CTRL+SHIFT+P, чтобы открыть палитру команд. Найдите и выберите консоль отладки: фокус на режиме консоли отладки, чтобы перейти на вкладку "Консоль отладки" на нижней панели. Обратите внимание на следующие строки:

    GET / 200
    GET /about 200
    

    Выходные данные консоли показывают метод запроса, путь и код состояния ответа для каждого запроса. Первая строка отображает запрос на корневой URL-адрес, а вторая строка — запрос на /about страницу.

    Примечание.

    Кроме того, браузер может запросить /favicon.ico. Это стандартный запрос для фавикона веб-сайта и его можно игнорировать.

  5. Оставьте приложение запущенным для следующего упражнения.

Изменение порядка ПО промежуточного слоя

Приложение, кажется, работает, но есть проблема. Вы запросили страницу, но выходные /history данные консоли не отображаются. Это связано с тем, что компонент пользовательского ПО промежуточного слоя, который записывает сведения о запросах, был добавлен после ПО промежуточного слоя перезаписи URL-адресов. ПО промежуточного слоя перезаписи URL-адресов перенаправляет запросы и /history/about отправляет ответ, а компонент пользовательского ПО промежуточного слоя не видит запрос. Давайте исправим это.

  1. Переместите добавленную 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-адресов обрабатывает запрос и перенаправляет его.

  2. Перезапустите приложение еще раз и протестируйте его, как и раньше. На этот раз выходные данные консоли отладки должны включать запрос на страницу /history .

    GET / 200
    GET /history 200
    GET /about 200
    

    Выходные данные консоли теперь отображают запрос на /history страницу прямо перед перенаправлением на страницу /about .

Исправление кода состояния

Приложение почти готово, но есть еще одна проблема. Код состояния в выходных данных консоли всегда равен 200, даже если приложение перенаправляет запрос. Код состояния запроса /history должен быть перенаправлен 302. Причина этого поведения — другая проблема порядка, в которой обрабатываются компоненты ПО промежуточного слоя.

Пользовательский компонент ПО промежуточного слоя записывает сведения в консоль, а затем вызывает await next() передачу следующему компоненту ПО промежуточного слоя. Проблема заключается в том, StatusCode что свойство объекта задается после запуска ответа компонентом по промежуточного Response слоя терминала. Давайте изменим код, чтобы исправить это.

  1. В добавленном делегате переместите Console.WriteLine() строку после await next() строки.

    Обновленный код должен выглядеть следующим образом:

    app.Use(async (context, next) =>
    {
        await next(); 
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
    });
    

    Теперь компонент пользовательского ПО промежуточного слоя записывает сведения о запросе после установки кода состояния ответа.

  2. Перезапустите и проверьте /history запрос еще раз. Выходные данные консоли отладки теперь должны отображать правильный код состояния.

    GET / 200
    GET /history 302
    GET /about 200