6

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

4

1 回答 1

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

于 2012-10-25T04:19:23.580 回答