Что такое Kestrel (vs IIS/Express)
Что такое веб-сервер kestrel и как он относится к IIS/IIS Express?
Я прихожу от разработки приложений на IIS Express и размещения их на веб-сервере IIS. Ядро ASP.NET имеет зависимость от Microsoft.AspNetCore.Server.Kestrel
, и мой запуск имеет .UseServer("Microsoft.AspNetCore.Server.Kestrel")
. Но когда я запускаю свой сайт, я все равно получаю значок IIS Express в системном трее. Кто-то спросил меня, пользуюсь ли я IIS Express или Kestrel, и я не знал, что сказать!
У меня нет кросс-платформенных требований, поскольку я разрабатываю на ПК и хосте в Azure, поэтому я смущен, если даже need
Kestrel, но похоже, что нет альтернативы - даже Простейшие образцы используют Kestrel.
Ответы
Ответ 1
Что такое Kestrel
Это полномасштабный веб-сервер. Вы можете запустить приложение ASP.NET Core, используя только Kestrel.
Но когда я запускаю свой сайт, я все равно получаю значок IIS Express в системном трее
В вашем приложении ASP.NET, вероятно, в каталоге wwwroot
вы увидите файл web.config, который содержит следующее:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>
Это HttpPlatformHandler. По сути, это то, что это делает все запросы к Kestrel. IIS Express (и IIS, если на то пошло) больше не будет запускать ASP.NET. Вместо этого они будут выступать в качестве доверенных лиц, которые просто передают запросы и ответы от Kestrel. Все еще есть преимущества использования IIS, в частности, он дает вам конфигурацию безопасности, кэширование на уровне ядра и т.д.
Ответ 2
Я хотел бы предложить альтернативный ответ, с некоторой историей, чтобы вы могли понять, почему Kestrel приходит, даже если вы используете только Windows и IIS.
В самом начале разработки ASP.NET до 2000 года, очевидно, Microsoft создала две части для размещения приложений ASP.NET WebForms,
- Кассини, позже стал Сервер разработки ASP.NET в Visual Studio. Это полностью управляемый веб-сервер, написанный на С# на основе
HttpListener
. Конечно, поскольку это было только для разработки, многие функции никогда не были реализованы. Поскольку Microsoft сделала общедоступный исходный код Cassini доступным, появились сторонние разработчики, которые раздвоили базу кода и добавили дополнительные функции, что положило начало семейству Cassini. - Поддержка ASP.NET в IIS (редакция 1). Поскольку IIS был 4.0 и 5.0/5.1 в то время, который не имеет ничего общего с пулами приложений, ASP.NET даже имеет свой собственный рабочий процесс (
aspnet_wp.exe
).
Поэтому для разработки веб-приложения вы используете Cassini, а для развертывания - IIS.
-
Введение пулов приложений в IIS 6 потребовало некоторых изменений на стороне ASP.NET, поэтому aspnet_wp.exe
устарел и заменился aspnet_isapi.dll
. Это можно рассматривать как поддержку ASP.NET в IIS версии 2. Поэтому приложения ASP.NET размещаются в рабочих процессах IIS w3wp.exe
.
-
Внедрение интегрированного конвейера в IIS 7 и выше потребовало дальнейших изменений, которые заменили aspnet_isapi.dll
на webengine4.dll
. Это можно рассматривать как поддержку ASP.NET в IIS версии 3. Конвейеры ASP.NET и IIS объединены.
Вы можете видеть, что ASP.NET стал намного более сложным и тесно интегрированным с IIS, поэтому Cassini начал показывать свой возраст и постепенно был заменен IIS Express (пользовательский режим облегченного IIS).
Таким образом, во многих случаях, когда люди обвиняют IIS в медленной работе, они должны обвинять ASP.NET в действительности. Сам IIS без ASP.NET довольно быстрый и стабильный, в то время как ASP.NET не разрабатывался с учетом достаточных показателей производительности (так как WebForms фокусирует довольно много производительности и RAD).
Затем в ноябре 2014 года было объявлено, что ASP.NET 5 (позже переименованный в ASP.NET Core) стал кроссплатформенной технологией. Очевидно, что Microsoft нужен был новый дизайн для поддержки Windows, macOS и Linux, где следует рассмотреть все основные веб-серверы, nginx/Apache (или другие веб-серверы), кроме IIS.
Я думаю, что многие согласятся с тем, что Microsoft многому научилась у NodeJS, а затем спроектировала и разработала Kestrel (изначально на основе libuv
но вскоре может перейти на другие технологии). Первоначально это был легкий веб-сервер, такой как Cassini, но позже добавляются дополнительные функции (как в другом ответе, гораздо больше функций, которые можно рассматривать как полноценный веб-сервер). Несмотря на то, что он полностью управляем (существуют некоторые нативные зависимости), он больше не является игрушечным веб-сервером, таким как Cassini.
Тогда почему вы не можете просто использовать Kestrel? Почему IIS Express и потенциально IIS, nginx или Apache все еще нужны? Это в первую очередь результат современной интернет-практики. Большинство веб-сайтов используют обратные прокси-серверы для получения запросов от ваших веб-браузеров, а затем перенаправляют их на серверы приложений в фоновом режиме.
- IIS Express/IIS/nginx/Apache - это обратные прокси-серверы
- Kestrel/NodeJS/Tomcat и т.д. Являются серверами приложений
Другой ответ уже показал ссылку на документацию Microsoft, так что вы можете посмотреть.
Microsoft изначально разработала HttpPlatformHandler, чтобы сделать IIS достаточно хорошим обратным прокси-сервером для Java/Python и т.д., Поэтому планировала использовать его для ASP.NET Core. Проблемы начали появляться во время разработки, поэтому позже Microsoft сделала модуль ASP.NET Core специально для ASP.NET Core. Поддержка ASP.NET в IIS версии 4.
Начиная с ASP.NET Core 2.2, модуль ASP.NET Core для IIS (версия 2) может размещать среду .NET Core внутри рабочего процесса IIS (w3wp.exe
), очень похожую на ASP.NET 2.x/4.x. Этот режим называется "IIS in-process hosting". Это можно рассматривать как поддержку ASP.NET в IIS версии 5.
Ну, довольно долго, но я надеюсь, что соберу все необходимые кусочки, и вам понравится читать.
Ответ 3
Из документации MS: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x
Kestrel - это кроссплатформенный веб-сервер для ASP.NET Core, основанный на libuv, кроссплатформенной библиотеке асинхронного ввода-вывода. Kestrel - это веб-сервер, который по умолчанию включен в шаблоны проектов ASP.NET Core.
Вы можете использовать Kestrel отдельно или с обратным прокси-сервером, таким как IIS, Nginx или Apache. Обратный прокси-сервер получает HTTP-запросы из Интернета и перенаправляет их в Kestrel после некоторой предварительной обработки.
ОБНОВЛЕНИЕ:.net core 2.1, вместо libuv Kestrel использует управляемые сокеты
Из документации asp.net core 2.1 по адресу: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration
С выпуском ASP.NET Core 2.1 транспорт по умолчанию Kestrel больше не основан на Libuv, а на управляемых сокетах.