我在一个ASP.NET MVC应用程序中有一个模块。该模块运行良好,但它对每种类型的文件(包括静态内容)都会触发,尽管我有:
<modules runAllManagedModulesForAllRequests="false">
<add name="MyModule" ... / >
</modules>该模块连接AcquireRequestState和PostRequestHandlerExecute事件,并且都显示静态内容触发(.htm、.css、.png等)。
我的印象是,runAllManagedModulesForAllRequests="false“应该防止模块在非ASP.NET内容上触发。
澄清:
I可以设置preCondition="managedHandler“如下:
<add name="MyModule" type="MyApp.MyModule" preCondition="managedHandler" />让我的模块只触发托管请求。
但是,我正试图理解IIS管道为什么会为每个请求触发托管模块命中。我认为这在以前的版本中很好,除非runAllManagedModulesForAllRequests="true“它不会将非托管内容激发到ASP.NET模块中。
运行在IIS8上的Windows 8 64位模式,与集成流水线模式。
更新:
经过更多的研究后,事实证明以下情况是正确的:
有关这方面的更多详细信息,我张贴了一个博客条目:http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78
发布于 2012-10-25 04:19:23
在IIS7中,微软引入了一种通过使用托管(.NET)代码开发模块和处理程序的新方法,而不仅仅是本机代码。问题是在托管代码和本地代码之间切换请求是非常昂贵的,因此微软引入了preCondition="managedHandler"。它将模块标记为仅适用于托管内容请求(.aspx、.asmx、.)因此IIS避免为静态内容触发它。
现在,您可以在需要修改静态内容请求的情况下,例如动态地缩小JavaScript。您可以使用C#编写模块并将其编译为托管模块,但是您希望为静态内容触发它,因此您只需将其标记为managedHandler即可。
最后,runAllManagedModulesForAllRequests="true"被用来覆盖preCondition="managedHandler",这样所有的preCondition="managedHandler"都会被触发。
有更多的信息可在以下网站获得:
http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition
https://stackoverflow.com/questions/13060678
复制相似问题