3

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

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

4

1 回答 1

1

这个问题有点老了,但万一其他人发现它,我会提供答案......

在集成模式下,除非您通过属性<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 参考源代码进行进一步调查。

于 2017-06-07T10:28:27.887 回答