我在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,具有集成管道模式。
更新
经过一些研究后发现以下情况属实:
有关此的更多详细信息,我发布了一篇博客文章: http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78
答案 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