我正在开发一个ASP.Net应用程序,目前Global.asax包含通常的5种方法:
但是,我也需要实现Application_AuthenticateRequest
方法,这不是问题,我刚刚在Global.asax中添加了它,但在另一个应用程序中,我看到这个方法在另一个类的其他地方实现它实现了IHttpModule
接口。
这怎么可能?相同的应用程序在Global.asax中没有Application_AuthenticateRequest
,他们的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
方法运行的原因是什么?
答案 0 :(得分:2)
我建议您先阅读HTTP handlers and modules in ASP.NET。然后,您将知道在ASP.NET应用程序中,您可以注册多个模块,这些模块将针对每个请求运行,您可以订阅请求生命周期的不同事件,就像在Global.asax中执行它一样。这种方法的优点是您可以将模块放入可在多个应用程序中使用的可重用组件中,从而避免需要一遍又一遍地重复相同的代码。
答案 1 :(得分:0)
基本上我一直在看的例子创建了自己的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 link所述:必须注册模块才能接收来自请求管道的通知。注册HTTP模块的最常用方法是在应用程序的Web.config文件中。在IIS 7.0中,统一请求管道还允许您以其他方式注册模块,包括通过IIS管理器和Appcmd.exe命令行工具。