我在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,具有集成管道模式.
更新:
经过一些研究后发现以下情况属实:
有关这方面的更多详细信息,我发布了一篇博客文章: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
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |