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

Ric*_*ahl 6 asp.net iis

我在ASP.NET MVC应用程序中有一个模块.该模块工作正常,但它为所有类型的文件,包括静态内容触发,即使我有:

<modules  runAllManagedModulesForAllRequests="false">
    <add name="MyModule" ... / >
</modules>
Run Code Online (Sandbox Code Playgroud)

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

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

澄清:

可以像这样设置preCondition ="managedHandler":

<add name="MyModule" type="MyApp.MyModule" preCondition="managedHandler" />
Run Code Online (Sandbox Code Playgroud)

并让我的模块只触发托管请求.

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

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

更新:

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

  • 如果runAllManagedModulesForAllRequests ="true"所有模块 - 无论它们的preCondition属性设置如何触发所有请求.对于HttpApplication上的Application_XXXX事件实现也是如此
  • 除非设置了 preCondition ="managedHandler" ,否则 runAllManagedModulesForAllRequests ="false"不会阻止非托管请求命中模块
  • 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

小智 7

在IIS7中,Microsoft引入了一种使用托管(.NET)代码开发模块和处理程序的新方法,而不仅仅是本机代码.问题是在托管和本机代码之间切换请求是非常昂贵的,所以微软推出了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