我在 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