как вы подключаете Application_BeginRequest () в asp.net-mvc - PullRequest
42 голосов
/ 06 июля 2011

я вижу в global.aspx.cs из проекта asp.net-mvc

 protected void Application_BeginRequest()
 {
 }

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

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

Ответы [ 2 ]

110 голосов
/ 18 ноября 2011

Боюсь, ответ Коса не совсем точен.Вам не нужно подключать его, потому что базовый класс HttpApplication сделает это за вас.Здесь нет интерфейса или переопределения;HttpApplication использует отражение, чтобы связать эти методы с событиями, основанными на имени метода.Так что это немного основанной на соглашениях магии, которая была в структуре некоторое время.Это очень странно, и я думаю, что они сделали это только для того, чтобы сохранить сходство с Classic ASP в те времена и / или предоставить ярлык, чтобы не писать много маленьких HttpModule s.

Для любопытных загрузитеHttpApplication в рефлекторе и охота за методом HookupEventHandlersForApplicationAndModules().Или загрузите HttpApplicationFactory и посмотрите на методы ReflectOnApplicationType() и ReflectOnMethodInfoIfItLooksLikeEventHandler() (обожаю это имя!).

Рик Страл обсуждал это в своем блоге несколько лет назад.

Это то, что вам действительно нужно знать, чтобы использовать ASP.NET?Нет, но зная это, безусловно, удаляет некоторые тайны.

3 голосов
/ 06 июля 2011

Любое приложение ASP.NET - это объект (или класс) типа:

public class Global : System.Web.HttpApplication ( вы найдете это в global.asax )

Вызов ядра ASP.NET IIS создает экземпляр вашего объекта, а интерфейс HttpApplication требует Application_BeginRequest, который вызывается IIS (посредством ISAPI)

Когда ASP.NETДвижок создает экземпляр вашего класса, он выглядит следующим образом:

HttpApplication thisAspApp = new YourASPApplication()
thisApplication.Begin_Request()

Поскольку приложение преобразуется в производный тип, к известному интерфейсу можно получить прямой доступ без необходимости переопределений.Хотя HttpApplication является классом, он используется в качестве интерфейса для приведения типов.Если вы добавите новый метод (или свойство) в свой класс, механизм ASP.NET не сможет получить доступ к этому методу, потому что он знает о вашем приложении только как об общем приложении HttpApplication.В VS, если вы идете в global.asax и щелкаете правой кнопкой мыши по HttpApplication в объявлении класса и выбираете «Перейти к определению» (или нажимаете F12), вы можете увидеть структуру базового класса.(или вы можете найти его в MSDN онлайн).

...