Подтвердить что ты не робот

Как вы подключаете Application_BeginRequest() в asp.net-mvc

Я вижу в файле global.aspx.cs проект asp.net-mvc

 protected void Application_BeginRequest()
 {
 }

но когда я пытаюсь добавить это в свой проект, я не вижу, что вызывает этот метод. Я вижу, что базовое System.Web.HttpApplication имеет это событие, но я не вижу ничего, что могло бы его переопределить или подписаться на это событие.

Может кто-нибудь объяснить, как вы подключаете Application_BeginRequest в asp.net-mvc?

4b9b3361

Ответ 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 онлайн).