Как 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 будет использовать для обработки входящий запрос на этот маршрут.
Вы можете найти полную историю здесь.
Ответ 2
Хорошо, вы можете прочитать источник. Он доступен на codeplex.com
Вы также можете посмотреть видео Скотта Гензельмана, первая часть идет немного (хотя и не слишком глубоко).
http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-Ninja-Black-Belt-Tips-by-Scott-Hanselman