TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.78K subscribers
Post #1301 1.5K
День 1058. #ЗаметкиНаПолях #ExploringNET6
Исследуем .NET 6. Часть 4
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Часть 3

Рассматриваем код WebApplication
Сегодня мы немного рассмотрим код, лежащий в основе WebApplication, и сосредоточимся на настройке промежуточного ПО и конечных точек.

В предыдущем посте мы остановились на том, на WebApplicationBuilder вызывался метод Build(), который создавал WebApplication, передавая в его конструктор построенный хост:
_builtApplication = new WebApplication(_hostBuilder.Build());
…
return _builtApplication;

Класс WebApplication
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/
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →