runAllManagedModulesForAllRequests =“false”的具体行为是什么?

时间:2012-11-29 18:44:30

标签: asp.net iis-7

关于<modules runAllManagedModulesForAllRequests="true">

有关属性的MSDN文档states

  

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

这个article更多地描述了它的“真实”价值行为:

  

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

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

我的问题 - MSDN文档似乎没有详细说明 - 假值是如何表现的,而不仅仅是没有为每个请求运行所有托管模块的一般描述?

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

总体而言,这种行为是否有良好的指导或描述?

2 个答案:

答案 0 :(得分:2)

您可能会对此Rick Strahl's blog帖子感兴趣,因为runAllManagedModulesForAllRequests="false"的作用存在一些细微差别:

  

runAllManagedModulesForAllRequests =“false” - 与您的不同   认为!什么不是那么明显,当你设置时会发生什么   runAllManagedModulesForAllRequests = “假”。你可能会期待   nonASP.NET请求不再通过ASP.NET获取漏洞   模块管道。但事实并非如此。

     

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

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

默认情况下会   无论如何都要对所有请求进行激活   runAllManagedModulesForAllRequests标志。即使价值   runAllManagedModulesForAllRequests =“false”,模块被触发   通过它的非托管请求。不完全符合预期。

     

那么runAllManagedModulesForAllRequests真正有用的是什么?   它实质上是对managedHandler preCondition的重写。如果我   在web.config中声明我的处理程序,如下所示:       然后设置

<modules runAllManagedModulesForAllRequests="false" >
     

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

     

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

答案 1 :(得分:2)

FWIW,

Scott Hanselman has a good post关于设置及其含义。他也有一些具体的理由存在,为什么你可能不需要它。