关于<modules runAllManagedModulesForAllRequests="true">
有关属性的MSDN文档states:
读/写布尔值。如果为每个请求运行所有托管模块,则为true;否则,错误。默认值为false。
这个article更多地描述了它的“真实”价值行为:
这种强烈推荐的修复可能会导致其他问题。这些问题的形式是使所有已注册的HTTP模块在每个请求上运行,而不仅仅是托管请求(例如.aspx)。这意味着模块将运行.jpg .gif .css .html .pdf等。
现在关于: runAllManagedModulesForAllRequests =“ false ” ...
我的问题 - MSDN文档似乎没有详细说明 - 假值是如何表现的,而不仅仅是没有为每个请求运行所有托管模块的一般描述?
例如,“false”是否跳过某些模块,但是通过其他一些模块运行请求;请求是否停止在处理它的第一个模块上,如处理程序等?非托管模块如何适应行为?
总体而言,这种行为是否有良好的指导或描述?
答案 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关于设置及其含义。他也有一些具体的理由存在,为什么你可能不需要它。