这个问题有点老了,但万一其他人发现它,我会提供答案......
在集成模式下,除非您通过属性<system.webserver>
添加约束,否则将为每个 IIS 请求(包括非 ASP.NET 页面)调用您提供的任何模块。preCondition
例如
<system.webserver>
<modules>
<add preCondition="managedHandler" name="..." type="..."/>
</modules>
</system.webserver>
指定managedHandler
意味着该模块将只为 ASP.Net 托管资源(如.aspx
文件)调用,而不是非托管资源(如 html、图像和 javascript)调用。
但是请注意,如果您runAllManagedModulesForAllRequests="true"
在<modules>
元素上指定,则此设置将被覆盖,这会导致所有模块(以及您的Global.asax
类,如果存在)都收到有关所有请求的通知。
在MSDN上有一篇关于 IIS 7.x 请求的生命周期的有用文章,但这并没有提到该preCondition
属性。但是,您可以在IIS 设置架构文档中了解它。
TL;博士
您可能想知道,当Global.asax
未调用文件中定义的事件处理程序时,如何为非托管资源调用模块。毕竟,模块使用HttpApplication
传递给方法的对象注册它们的事件处理程序,IHttpModule.Init
如下所示:-
public void Init(System.Web.HttpApplication context)
{
context.AuthenticateRequest += my_request_handler;
}
HttpApplication
传递的 to与Init
中定义的相同Global.asax
,那么为什么不调用全局应用程序事件处理程序呢?HttpApplication
答案很简单,当一个模块向对象注册其事件处理程序时HttpApplication
,它知道它处于模块初始化模式,并单独注册事件处理程序,以及指示是否应该为非托管事件处理程序调用的标志资源。您可以通过查看
HttpApplication 参考源代码进行进一步调查。