2

关于<modules runAllManagedModulesForAllRequests="true">

MSDN 文档说明了该属性:

读/写布尔值。如果为每个请求运行所有托管模块,则为 true;否则为假。默认值为假。

本文详细描述了它的“真实”价值行为:

这个强烈推荐的修复可能会导致其他问题。这些问题的形式是让所有注册的 HTTP 模块在每个请求上运行,而不仅仅是托管请求(例如 .aspx)。这意味着模块将在任何时候运行 .jpg .gif .css .html .pdf 等。

现在关于:runAllManagedModulesForAllRequests=" false " ...

我的问题——MSDN 文档似乎没有详细说明——除了不为每个请求运行所有托管模块的一般描述之外,错误值的行为如何?

例如,“false”是否跳过了一些模块但通过一堆其他模块运行请求?请求是否在第一个像处理程序等处理它的模块上停止?非托管模块如何适应这种行为?

总的来说,这种行为是否有很好的指南或描述?

4

2 回答 2

2

FWIW,

Scott Hanselman 有一篇关于设置及其含义的好帖子。他也有一些具体的理由来解释它的存在以及你可能不需要它的原因。

于 2013-03-27T01:41:36.973 回答
2

您可能对Rick Strahl关于该主题的博客文章感兴趣,因为其中有一些细微差别runAllManagedModulesForAllRequests="false"

runAllManagedModulesForAllRequests="false" - 与您想象的不同!不太明显的是,当您设置 runAllManagedModulesForAllRequests="false" 时会发生什么。您可能希望非 ASP.NET 请求不再通过 ASP.NET 模块管道传递。但实际情况并非如此。

例如,如果我创建这样的模块:

<add name="SharewareModule" type="HowAspNetWorks.SharewareMessageModule"  /> 

默认情况下,无论 runAllManagedModulesForAllRequests 标志如何,它都会针对所有请求触发。即使值 runAllManagedModulesForAllRequests="false",该模块也会被通过它的非托管请求触发。不太像预期的那样。

那么 runAllManagedModulesForAllRequests 到底有什么用呢?它本质上是对 managedHandler preCondition 的覆盖。如果我像这样在 web.config 中声明我的处理程序:

   <add name="SharewareModule" type="HowAspNetWorks.SharewareMessageModule" preCondition="managedHandler" />

然后设置

 <modules runAllManagedModulesForAllRequests="false" >

我的模块仅针对托管请求触发。如果我将标志切换为true,现在我的模块最终会处理从 IIS 传递的所有 IIS 请求。

这里的故事的寓意是,如果您打算只查看 ASP.NET 内容,则应始终设置 preCondition="managedHandler"属性以确保仅在此模块上触发托管请求。但即使你这样做了,也要意识到runAllManagedModulesForAllRequests="true"可以覆盖这个设置,所以你的模块必须预期处理任何类型的请求。

于 2012-11-29T21:06:34.850 回答