Как вы подключаете Application_BeginRequest() в asp.net-mvc
Я вижу в файле global.aspx.cs проект asp.net-mvc
protected void Application_BeginRequest()
{
}
но когда я пытаюсь добавить это в свой проект, я не вижу, что вызывает этот метод. Я вижу, что базовое System.Web.HttpApplication имеет это событие, но я не вижу ничего, что могло бы его переопределить или подписаться на это событие.
Может кто-нибудь объяснить, как вы подключаете Application_BeginRequest в asp.net-mvc?
Ответы
Ответ 1
Я боюсь, что Cos ответ не совсем точен. Вам не нужно подключать его, потому что базовый класс HttpApplication
делает это за вас. Здесь нет интерфейса или переопределения; HttpApplication
использует отражение, чтобы подключить эти методы к событиям на основе имени метода. Так что это немного основанная на соглашения магия, которая была в каркасе какое-то время. Это очень странно, и я думаю, что они только сделали это, чтобы поддерживать сходство с классическим ASP в тот же день и/или обеспечить ярлык, чтобы избежать написания большого количества небольших HttpModule
s.
Для любопытных загрузите HttpApplication
в Reflector и найдите метод HookupEventHandlersForApplicationAndModules()
. Или загрузите HttpApplicationFactory
и посмотрите методы ReflectOnApplicationType()
и ReflectOnMethodInfoIfItLooksLikeEventHandler()
(любите это имя!).
Рик Стралл рассказал об этом в своем блоге несколько лет назад.
Это то, что вам действительно нужно знать, чтобы использовать ASP.NET? Нет, но знание этого, конечно же, устраняет некоторые тайны.
Ответ 2
Любое приложение ASP.NET - это объект (или класс) типа:
public class Global : System.Web.HttpApplication
(вы найдете это в global.asax)
Механизм ASP.NET, вызываемый IIS, создает экземпляр вашего объекта, а интерфейс HttpApplication требует Application_BeginRequest, который вызывается IIS (через ISAPI).
Когда ASP.NET Engine создает экземпляр вашего класса, он выглядит так:
HttpApplication thisAspApp = new YourASPApplication()
thisApplication.Begin_Request()
Поскольку приложение отличает тип приложения, доступ к известному интерфейсу можно получить без необходимости переопределения. Хотя HttpApplication - это класс, он используется как интерфейс посредством кастинга. Если вы добавите новый метод (или свойство) в свой класс, механизм ASP.NET не сможет получить доступ к этому методу, поскольку он знает только ваше приложение как общий HttpApplication. В VS, если вы перейдете к global.asax и щелкните правой кнопкой мыши по HttpApplication в объявлении класса и выберите "Перейти к определению" (или нажмите F12), вы увидите структуру базового класса. (или вы можете найти его в MSDN онлайн).