无法停止为静态内容触发ASP.NET模块

时间:2012-10-25 02:20:35

标签: asp.net iis

我在ASP.NET MVC应用程序中有一个模块。该模块工作正常,但即使我有:

,它仍然针对包括静态内容在内的每种类型的文件触发
<modules  runAllManagedModulesForAllRequests="false">
    <add name="MyModule" ... / >
</modules>

该模块挂钩AcquireRequestState和PostRequestHandlerExecute事件,并且都显示静态内容触发(.htm,.css,.png等)。

我的印象是runAllManagedModulesForAllRequests =“false”应该阻止模块触发非ASP.NET内容。

澄清:

可以像这样设置preCondition =“managedHandler”:

<add name="MyModule" type="MyApp.MyModule" preCondition="managedHandler" />

并让我的模块仅触发托管请求。

但是,我试图理解为什么IIS管道通常会针对每个请求触发托管模块命中。我认为这在旧版本中运行得很好,除非runAllManagedModulesForAllRequests =“true”,否则它不会将非托管内容发送到ASP.NET模块。

在Windows 8 64位模式下运行IIS8,具有集成管道模式。

更新

经过一些研究后发现以下情况属实:

  • 如果runAllManagedModulesForAllRequests =“true”所有模块 - 无论其preCondition属性设置如何触发所有请求。对于HttpApplication上的Application_XXXX事件实现也是如此
  • runAllManagedModulesForAllRequests =“false”无法阻止非托管请求命中模块,除非 preCondition =“managedHandler”已设置
  • runAllManagedModulesForAllRequests =“false”确实会影响Application_XXXX事件,导致这些事件仅在托管请求上触发。 IOW,Application_XXXX的行为好像'模块'实现有一个preCondition =“managedHandler”

有关此的更多详细信息,我发布了一篇博客文章: http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78

1 个答案:

答案 0 :(得分:7)

在IIS7中,Microsoft引入了一种使用托管(.NET)代码开发模块和处理程序的新方法,而不仅仅是本机代码。问题是在托管代码和本机代码之间切换请求非常昂贵,因此Microsoft引入了preCondition="managedHandler"。它将模块标记为仅可用于托管内容请求(.aspx,.asmx,...),因此IIS避免为静态内容触发它。

现在,您可能会遇到要修改静态内容请求的情况,例如即时缩小JavaScript。您可以使用C#编写模块并将其编译为托管模块,但是您希望它针对静态内容触发,因此您只需将其标记为managedHandler

最后,runAllManagedModulesForAllRequests="true"用于覆盖preCondition="managedHandler",因此所有这些都会被解雇。

有更多信息,请访问:
http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition