Прежде, чем мы приступим к изучению «внутренностей» ASP.NET Core, стоит потратить немного времени, чтобы разобраться с тем, как в принципе работает любое приложение ASP.NET Core.
Приложение ASP.NET Core
В самом простом случае, работу приложения ASP.NET Core можно представить как показано на рисунке:
Любое приложение будь то приложение ASP.NET Core или любое другое всегда запускается в каком-либо окружении (среде выполнения). В зависимости от того, какая среда выполнения используется, разработчик может определять поведение приложения – включать/отключать различные функции, изменять содержимое журнала (лога) приложения и так далее.
В приложении ASP.NET Core одним из важных параметров, касающихся среды выполнения, является её имя (Environment Name). Например, когда мы запускали свое первое приложение, то могли увидеть, что имя среды выполнения было Develpment
.
Когда мы запускаем приложение ASP.NET Core, то оно запускается совместно с внутрипроцессной реализацией одного из трех веб-серверов: Kestrel (используется по умолчанию), HTTP.sys или IIS (в зависимости от выбора разработчика).
Веб-сервер берет на себя все задачи, связанные с получением HTTP-запросов от пользователя. После того, как получен очередной запрос, веб-сервер преобразует его в объект типа HttpContext
и передает его уже непосредственно в ту часть приложения, которую пишет разработчики, то есть – мы.
Таким образом, разработчики в ASP.NET Core избавлены от рутинной работы, связанной с организацией прослушивания IP-адресов, установлением соединения с клиентом, обработкой входящих запросов и так далее. От нас требуется получить от веб-сервера объект HttpContext
, каким-либо образом проанализировать его и указать какие данные необходимо записать в ответ. Всю рутину по отправке клиенту ответа берет на себя веб-сервер.
Web-сервер Kestrel
В .NET 9 для работы приложения используется сервер Kestrel — рекомендуемый кроссплатформенный веб-сервер для ASP.NET Core.
К основным преимуществам web-сервера Kestrel относят:
- Кроссплатформенность: веб-сервер работает в Windows, Linux и macOS.
- Высокая производительность: Kestrel оптимизирован для эффективной обработки большого количества одновременных подключений.
- Легковесность: сервер оптимизирован для работы в средах с ограниченными ресурсами.
- Поддержка HTTPS.
- Поддержка расширенных протоколов: Kestrel поддерживает общие веб-протоколы, в том числе:
- HTTP/1.1, HTTP/2 и HTTP/3
- WebSockets
- Интеграция с ASP.NET Core: простая интеграция с другими компонентами ASP.NET Core, такими как конвейер по промежуточного слоя, внедрение зависимостей и система конфигурации.
- Расширяемость: настройка Kestrel с помощью конфигурации и ПО промежуточного слоя.
- Диагностика производительности: Kestrel предоставляет встроенные функции диагностики производительности, такие как ведение журнала и метрики.
Действительно, разработчики ASP.NET Core постарались сделать работу с сервером Kestrel максимально прозрачно и комфортно. При необходимости, мы можем легко перенастроить web-сервер нашего приложения на прослушивание других адресов, указать ограничения по количеству одновременных подключений и т.д.
В качестве примера, можно продемонстрировать как указать серверу Kestrel «слушать» определенный порт. Так, когда мы создаем новый проект ASP.NET Core, то порты, которые будет прослушивать web-сервер настраивается следующим образом:
- для протокола HTTP выбирается случайный порт от 5000 до 5300
- для протокола HTTPS выбирается случайный порт от 7000 до 7300.
Выбранные порты хранятся в созданном файле Properties/launchSettings.json
и могут быть изменены разработчиком. Однако этот файл используется только при разработке и поэтому, когда мы запускаем приложение НЕ из Visual Studio, то Kestrel автоматически привязывается к адресу http://localhost:5000
. Это не всегда бывает удобным, если вам приходится тестировать приложение в различных вариантах, например, часто запускать приложение непосредственно из проводника Windows.
Чтобы указать web-серверу Kestrel прослушивать любые адреса по определенному порту, достаточно добавить в файл Program.cs следующую настройку:
var builder = WebApplication.CreateBuilder(args); //указываем, что необходимо прослушивать любые адреса по заданному порту builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(5000); }); //здесь другой код файла Program.cs, созданный по умолчанию
Теперь, если вы запустите приложение из Visual Studio, то увидите следующий вывод в консоли:

Также, будет выдано предупреждение о том, что конечные точки Kestrel были переопределены. Но это предупреждение будет появляться только при отладке приложения, если запустить приложение из проводника Windows, то никакого предупреждения не будет

Итого
Приложение ASP.NET Core запускается с внутрипроцессорной реализацией web-сервера. По умолчанию, в ASP.NET Core используется кроссплатформенный веб-сервер Kestrel.