Как ASP.NET MVC подключен к ASP.NET?

Я пытаюсь лучше понять "сантехника за ASP.NET и ASP.NET MVC. Я читал эту страницу, что очень помогло. Насколько я понимаю, на каждом сайте ASP.NET есть класс, который наследуется от System.Web.HttpApplication. Затем HttpApplication имеет ряд событий, которые вызывают HttpModules и HttpHandlers, такие как BeginRequest, AuthorizeRequest, End Request и т.д. Затем HttpModules и HttpHandlers читают и записывают в текущий HttpContext и из него.

Как ASP.NET знает, какой класс HttpApplication использовать? Мое приложение имеет типичный класс MvcApplication в файле Global.asax. Но я ничего не вижу в этом классе, связанном с MVC. Я также не вижу никаких настроек в любом месте, которые назначают этот класс как "приложение". Всегда ли ASP.NET ищет файл с именем Global.asax, чтобы выяснить, какой класс HttpApplication создать? Или ASP.NET просто ищет какой-либо класс, который наследует от HttpApplication в моей сборке?

Также, как он знает, какие модули и обработчики использовать? На упомянутой выше странице указано, что вы указываете обработчики и модули и настройки в web.config. Но мое приложение ASP.NET MVC не имеет этих параметров в своем web.config?

Если я установил точку прерывания в одном из моих методов действия и проверил HttpContext.Current.ApplicationInstance.Modules, я вижу следующее:

OutputCache
Session
WindowsAuthentication
FormsAuthentication
PassportAuthentication
RoleManager
UrlAuthorization
FileAuthorization
AnonymousIdentification
Profile
ErrorHandlerModule
ServiceModel
UrlRoutingModule-4.0
ScriptModule-4.0
__DynamicModule_System.Web.WebPages.WebPageHttpModuleDefaultAuthentication

Где они были указаны? Аналогично, если я проверяю HttpContext.Current.Handler, я вижу, что он установлен в System.Web.Mvc.MvcHandler.

Ответ 1

Когда первый пользователь попадает на ваш сайт:

1) Он загружает все Http-модули, указанные всеми веб-приложениями, которые относятся к вашему приложению.

2) Если система поддерживает ASP.NET MVC, глобальный web.config регистрирует UrlRoutingModule, включив его в конвейер запросов.

Теперь класс, полученный из HttpApplication в вашем global.asax(например, стандартный MvcApplication), скомпилирован в вашу dll. Принимая это во внимание...

5) Время выполнения ASP.NET сканирует YourApplication.dll для класса, который происходит от HttpApplication и выполняет ряд его методов (например, Application_Start).

6) Когда вы создаете маршруты, используя идиоматический метод расширения ASP.NET MVC MapRoute, он связывает маршрут с MvcRouteHandler.

7) UrlRoutingModule (из шага 2) использует обработчик маршрутизации, чтобы выбрать обработчик http, который ASP.NET будет использовать для обработки входящий запрос на этот маршрут.

Вы можете найти полную историю здесь.