我有一个ASP.NET FW 4.5应用程序,通常它在经典模式下运行,我们使用一个HttpModule来解析每个网页请求。 如果用户有权访问,模块将检查数据库。 没问题。
当我们切换到集成模式时,我们放了一个< webserver> <模块>按照迁移指南中的建议。
问题是该模块正在解析对应用程序的每个请求,包括css,jss和images。
在经典模式下,这不会发生,只会解析页面。
经典和集成之间有不同的行为吗?
该模块实现如下方法:
private void OnBeginRequest(object sender, EventArgs e)
private void OnAuthorization(object sender, EventArgs e)
答案 0 :(得分:1)
这个问题有点陈旧,但万一有人发现它我会提供答案......
在集成模式下,除非您通过<system.webserver>
属性添加约束,否则将为每个IIS请求(包括非ASP.NET页面)调用preCondition
中提供的任何模块。 e.g。
<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 Settings Schema documentation。
您可能想知道在未调用Global.asax
文件中定义的事件处理程序时,如何为非托管资源调用模块。毕竟,模块使用传递给HttpApplication
方法的IHttpModule.Init
对象注册其事件处理程序,如下所示: -
public void Init(System.Web.HttpApplication context)
{
context.AuthenticateRequest += my_request_handler;
}
传递给HttpApplication
的{{1}}与Init
中定义的Global.asax
相同,那么为什么不调用全局应用程序事件处理程序?答案很简单,当一个模块用HttpApplication
对象注册它的事件处理程序时,HttpApplication
知道它处于模块初始化模式,并分别注册事件处理程序,以及指示是否应该为非托管资源调用事件处理程序。您可以通过查看进一步调查
HttpApplication reference source code