Это мое понимание того, как развивался запуск / хостинг веб-приложения, так как все довольно запутанно. Небольшое резюме:
1. Классический ASP.NET: пишите только код приложения для запуска на последнем этапе обязательного конвейера IIS
2. ASP.NET с OWIN: настройте веб-сервер .NET и напишите код своего приложения. Больше не связан напрямую с IIS, поэтому вам больше не нужно его использовать.
3. Ядро ASP.NET: настройте хост и веб-сервер для использования и написания кода приложения. Больше не нужно использовать веб-сервер .NET, если вы ориентируетесь на .NET Core вместо полной .NET Framework.
Теперь я немного подробнее расскажу о том, как это работает и какие классы используются для запуска приложения:
Классический ASP.NET
Классические приложения ASP.NET имеют Global.asax
файл в качестве точки входа. Эти приложения могут быть запущены только в IIS, и ваш код выполняется в конце конвейера IIS (поэтому IIS отвечает за CORS, аутентификацию ... еще до того, как ваш код запустится). Начиная с IIS 7 вы можете запускать свое приложение в интегрированном режиме, который интегрирует среду выполнения ASP.NET в IIS. Это позволяет вашему коду настраивать функции, которые раньше были недоступны (или только в самом IIS), такие как перезапись URL в Application_Start
случае вашего Global.asax
файла или использование нового <system.webserver>
раздела в вашем web.config
файле.
ASP.NET с OWIN
Прежде всего, OWIN - это не библиотека, а спецификация того, как веб-серверы .NET (например, IIS) взаимодействуют с веб-приложениями. Сами Microsoft имеют реализацию OWIN под названием проект Katana (распространяется через несколько различных пакетов NuGet). Эта реализация предоставляет IAppBuilder
интерфейс, с которым вы сталкиваетесь в Startup
классе, и некоторые промежуточные компоненты OWIN (OMC), предоставляемые Microsoft. С помощьюIAppBuilder
вы в основном составляете промежуточное ПО в режиме «подключи и работай», чтобы создать конвейер для веб-сервера (в дополнение к только конвейеру ASP.NET в IIS7 +, как указано выше), а не привязаны к конвейеру IIS (но теперь вы используете компонент промежуточного программного обеспечения для CORS, компонент промежуточного программного обеспечения для аутентификации ...). По этой причине ваше приложение больше не связано с IIS, и вы можете запустить его на любом веб-сервере .NET, например:
- Пакет OwinHost можно использовать для самостоятельного размещения вашего приложения на веб-сервере Katana.
- Пакет Microsoft.Owin.Host.SystemWeb используется для размещения вашего приложения OWIN в IIS7 + в интегрированном режиме путем внутренней подписки промежуточного программного обеспечения на правильные события времени жизни.
То, что делает все настолько запутанным, заключается в том, что Global.asax
он по-прежнему поддерживается вместе с Startup
классом OWIN , в то время как оба они могут делать схожие вещи. Например, вы можете внедрить CORS Global.asax
и аутентификацию с помощью промежуточного программного обеспечения OWIN, что может сбить вас с толку.
Мое эмпирическое правило заключается в том, чтобы полностью удалить Global.asax
файл, чтобы использовать его Startup
всякий раз, когда мне нужно добавить OWIN.
ASP.NET Core
ASP.NET Core - это следующая эволюция, и теперь вы можете использовать как .NET Core, так и полную .NET Framework. Когда вы ориентируетесь на .NET Core, вы можете запускать свое приложение на любом хосте, который поддерживает .NET Standard. Это означает, что вы больше не ограничены веб-сервером .NET (как в предыдущем пункте), но можете разместить свое приложение в контейнерах Docker, веб-сервере Linux, IIS ...
Точкой входа для веб-приложения ASP.NET Core является Program.cs
файл. Там вы настраиваете свой хост и снова указываете свой Startup
класс, где вы настраиваете свой конвейер. Использование OWIN (с помощью IAppBuilder.UseOwin
метода расширения) не является обязательным, но полностью поддерживается .
AreaRegistration.RegisterAllAreas();
Вызвала ошибку для меня, так как этот метод не может быть использован во время запуска, как это, только вApplication_Start
. Однако мое приложение представляет собой API, и этот метод, по-видимому, полезен только для приложений MVC: stackoverflow.com/questions/18404637/…