httpsodules(经典模式)Vs模块(集成模式)不以相同方式解析请求

时间:2015-10-07 12:45:31

标签: asp.net web-config iis-7.5 httpmodule integrated-pipeline-mode

我有一个ASP.NET FW 4.5应用程序,通常它在经典模式下运行,我们使用一个HttpModule来解析每个网页请求。 如果用户有权访问,模块将检查数据库。 没问题。

当我们切换到集成模式时,我们放了一个< webserver> <模块>按照迁移指南中的建议。 问题是该模块正在解析对应用程序的每个请求,包括css,jss和images。 在经典模式下,这不会发生,只会解析页面。 经典和集成之间有不同的行为吗? 该模块实现如下方法: private void OnBeginRequest(object sender, EventArgs e) private void OnAuthorization(object sender, EventArgs e)

1 个答案:

答案 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

中阅读相关内容

TL; DR

您可能想知道在未调用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