您可能对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"
可以覆盖这个设置,所以你的模块必须预期处理任何类型的请求。