0

我正在开发一个 ASP.Net 应用程序,目前 Global.asax 包含通常的 5 种方法:

  1. 应用程序_启动
  2. 申请_结束
  3. 会话开始
  4. 会话_结束
  5. 应用程序错误

但是,我也需要实现该Application_AuthenticateRequest方法,这不是问题,我刚刚在 Global.asax 中添加了它,但在另一个应用程序中,我看到该方法在另一个实现IHttpModule接口的类的其他地方实现。

这怎么可能?同一个应用程序Application_AuthenticateRequest在 Global.asax 中没有,它们的 Global.asax 看起来像这样:

void Application_BeginRequest(object sender, EventArgs e)
{
    myConfig.Init();
}

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    myConfig.Init();
    if (InstallerHelper.ConnectionStringIsSet())
    {
        //initialize IoC
        IoC.InitializeWith(new DependencyResolverFactory());

        //initialize task manager
        TaskManager.Instance.Initialize(NopConfig.ScheduleTasks);
        TaskManager.Instance.Start();
    }
}

void Application_End(object sender, EventArgs e)
{
    //  Code that runs on application shutdown
    if (InstallerHelper.ConnectionStringIsSet())
    {
        TaskManager.Instance.Stop();
    }
}

是什么让该Application_AuthenticateRequest方法运行?

4

2 回答 2

2

我首先建议您阅读ASP.NET 中的 HTTP 处理程序和模块。然后您将知道,在 ASP.NET 应用程序中,您可以注册多个模块,这些模块将为每个请求运行,并且您可以订阅请求生命周期的不同事件,就像在 Global.asax 中一样。这种方法的优点是您可以将模块放入可在多个应用程序中使用的可重用程序集中,从而避免您一遍又一遍地重复相同的代码。

于 2012-09-21T10:57:08.693 回答
1

基本上,我一直在查看的示例创建了自己的 HTTP 模块并将其注册到 web.config 文件中:

他们创建了一个新的 HTTP 模块,如下所示:

public class MembershipHttpModule : IHttpModule
{
    public void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        // Fires upon attempting to authenticate the user
        ...
    }

    public void Dispose()
    {
    }

    public void Init(HttpApplication application)
    {
        application.AuthenticateRequest += new EventHandler(this.Application_AuthenticateRequest);
    }
}

还将以下内容添加到 web.config 文件中:

<httpModules>
  <add name="MembershipHttpModule" type="MembershipHttpModule, App_Code"/>
</httpModules>   

正如上面@Darin Dimitrov 的链接中所解释的:必须注册模块才能接收来自请求管道的通知。注册 HTTP 模块的最常用方法是在应用程序的 Web.config 文件中。在 IIS 7.0 中,统一请求管道还允许您通过其他方式注册模块,包括通过 IIS 管理器和通过 Appcmd.exe 命令行工具。

于 2012-09-21T11:18:43.600 回答