Как происходит связывание событий Global.asax PostAuthenticateRequest? - PullRequest
8 голосов
/ 13 января 2011

Как я могу использовать PostAuthenticateRequest событие Global.asax? Я следую этому уроку , и в нем упоминается, что я должен использовать событие PostAuthenticateRequest . Когда я добавил событие Global.asax, оно создало два файла: разметку и файл с выделенным кодом. Вот содержимое файла с выделенным кодом

using System;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace authentication
{
    public class Global : System.Web.HttpApplication
    {    
        protected void Application_Start(object sender, EventArgs e)
        {    
        }

        protected void Session_Start(object sender, EventArgs e)
        {    
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {    
        }

        protected void Application_Error(object sender, EventArgs e)
        {    
        }

        protected void Session_End(object sender, EventArgs e)
        {    
        }

        protected void Application_End(object sender, EventArgs e)
        {    
        }
    }
}

Теперь, когда я набираю

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)

Это успешно называется. Теперь я хочу узнать, как PostAuthenticateRequest связан с этим Application_OnPostAuthenticateRequest методом? Как я могу изменить метод на другой?

1 Ответ

15 голосов
/ 13 января 2011

Magic ..., механизм под названием Auto Event Wireup , по той же причине, по которой вы можете написать

Page_Load(object sender, EventArgs e) 
{ 
} 

в вашем коде и метод будет автоматически вызываться при загрузке страницы.

MSDN описание для System.Web.Configuration.PagesSection.AutoEventWireup свойства :

Получает или задает значение, указывающее, автоматически ли события для страниц ASP.NET подключаются к функциям обработки событий.

Когда AutoEventWireup равен true, обработчики автоматически связываются с событиями во время выполнения на основании их имени и подписи. Для каждого события ASP.NET ищет метод, который назван в соответствии с шаблоном Page_eventname(), например, Page_Load() или Page_Init(). ASP.NET сначала ищет перегрузку, которая имеет типичную сигнатуру обработчика событий (то есть она определяет параметры Object и EventArgs). Если обработчик событий с этой подписью не найден, ASP.NET ищет перегрузку без параметров. Подробнее в этом ответе .

Если вы хотите сделать это явно, вместо этого вы должны написать следующее

public override void Init()
{
    this.PostAuthenticateRequest +=
        new EventHandler(MyOnPostAuthenticateRequestHandler);
    base.Init();
}

private void MyOnPostAuthenticateRequestHandler(object sender, EventArgs e)
{
}
...