Исследуем .NET 6. Часть 4
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Часть 3
Рассматриваем код WebApplication
Сегодня мы немного рассмотрим код, лежащий в основе
WebApplication, и сосредоточимся на настройке промежуточного ПО и конечных точек.В предыдущем посте мы остановились на том, на
WebApplicationBuilder вызывался метод Build(), который создавал WebApplication, передавая в его конструктор построенный хост:_builtApplication = new WebApplication(_hostBuilder.Build());Класс WebApplication
…
return _builtApplication;
public sealed class WebApplication : IHost, IApplicationBuilder, IEndpointRouteBuilder, IAsyncDisposableПо сравнению с конструктором
{
}
WebApplicationBuilder, конструктор WebApplication относительно прост. Конструктор и инициализаторы полей выполняют 4 основные задачи:1. Сохранить предоставленный хост в поле
_host. Это тот же тип хоста, что и при прямом использовании универсального хоста, как в ASP.NET Core 3.x/5.2. Создать новый список
EndpointDataSource. Источники конечных точек используются для настройки конечных точек в приложении, включая Razor Pages, контроллеры, конечные точки API и новые «минимальные» API.3. Создать новый экземпляр
ApplicationBuilder. Он используется для создания конвейера промежуточного ПО.4. Установить свойство
__GlobalEndpointRouteBuilder в ApplicationBuilder. Это свойство используется для «сообщения» другому промежуточному ПО, что мы используем новый WebApplication, у которого немного другие значения по умолчанию.WebApplication в основном делегирует реализацию IHost, IApplicationBuilder и IEndpointRouteBuilder своим приватным свойствам и реализует эти интерфейсы явно.Конвейер промежуточного ПО в WebApplication
Одно из серьёзных отличий
WebApplication от универсального хоста заключается в том, что WebApplication по умолчанию устанавливает различное промежуточное ПО.Рассмотрим простой пример приложения:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Здесь создаётся следующее промежуточное ПО (см. рисунок ниже):
WebApplication app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.Run();
1.
HostFilteringMiddleware – добавляется благодаря скрытому вызову ConfigureWebHostDefaults(), как и в универсальном хосте в предыдущих версиях.2.
ForwardedHeadersMiddleware – добавляется там же, если для переменной среды ASPNETCORE_FORWARDEDHEADERS_ENABLED задано значение true (не в нашем случае).3.
DeveloperExceptionPageMiddleware – теперь добавляется автоматически, когда вы работаете в среде разработки (Development):app.UseDeveloperExceptionPage().4.
EndpointRoutingMiddleware (также известное как RoutingMiddleware) – теперь автоматически добавляется в конвейер промежуточного ПО до начала конвейера в Program.cs, а EndpointMiddleware автоматически добавляется в конвейер в конце.5. Конвейер
WebApplication.ApplicationBuilder, содержащий всё промежуточное ПО, определённое в Program.cs:-
HttpsRedirectionMiddleware
- StaticFilesMiddleware
6. EndpointMiddleware – теперь автоматически добавляется в конвейер в конце.Добавление конечной точки с помощью
MapGet() добавляет запись в коллекцию EndpointDataSource объекта WebApplication, что приводит к автоматическому добавлению промежуточного ПО конечных точек:-
EndpointRoutingMiddleware выбирает конечную точку, -
EndpointMiddleware исполняет конечную точку.EndpointMiddleware обычно добавляется в конвейер в конце путем вызова UseEndpoints(), но здесь оно добавляется автоматически.Подробнее перевод статьи с примерами кода размещён на Хабре.
Источник: https://andrewlock.net/exploring-dotnet-6-part-4-building-a-middleware-pipeline-with-webapplication/