gpt4 book ai didi

asp.net - 无法停止为静态内容触发 ASP.NET 模块

转载 作者:行者123 更新时间:2023-12-02 12:04:12 25 4
gpt4 key购买 nike

我在 ASP.NET MVC 应用程序中有一个模块。该模块工作正常,但它会针对包括静态内容在内的每种类型的文件触发,即使我有:

<modules  runAllManagedModulesForAllRequests="false">
<add name="MyModule" ... / >
</modules>

该模块 Hook AcquireRequestState 和 PostRequestHandlerExecute 事件,并且都显示静态内容触发(.htm、.css、.png 等)。

我的印象是 runAllManagedModulesForAllRequests="false"应该阻止模块在非 ASP.NET 内容上触发。

澄清一下:

可以设置 preCondition="managementHandler"像这样:

<add name="MyModule" type="MyApp.MyModule" preCondition="managedHandler" />

并让我的模块仅触发托管请求。

但是,我试图理解为什么 IIS 管道通常会针对每个请求触发托管模块命中。我认为这在旧版本中工作得很好,除非 runAllManagedModulesForAllRequests="true",否则它不会将非托管内容触发到 ASP.NET 模块中。

在Windows 8 64位模式的IIS8上运行,具有集成管道模式。

更新:

经过更多研究,事实证明以下内容是正确的:

  • 如果 runAllManagedModulesForAllRequests="true"所有模块 - 无论其 preCondition 属性如何设置都会触发所有请求。对于在 HttpApplication 上实现的 Application_XXXX 事件也是如此
  • runAllManagedModulesForAllRequests="false"无法阻止非托管请求命中模块,除非设置了 preCondition="managementHandler"
  • runAllManagedModulesForAllRequests="false"确实会影响 Application_XXXX 事件,导致这些事件仅在托管请求上触发。 IOW,Application_XXXX 的行为就好像“模块”实现有一个 preCondition="managementHandler"

有关这方面的更多详细信息,我发布了一篇博客文章: http://www.west-wind.com/weblog/posts/2012/Oct/25/Caveats-with-the-runAllManagedModulesForAllRequests-in-IIS-78

最佳答案

在 IIS7 中,Microsoft 引入了一种使用托管 (.NET) 代码(而不仅仅是 native 代码)来开发模块和处理程序的新方法。问题是在托管代码和 native 代码之间切换请求的成本非常昂贵,因此 Microsoft 引入了 preCondition="managedHandler"。它将模块标记为仅可用于托管内容请求(.aspx、.asmx...),以便 IIS 避免针对静态内容触发它。

现在,您可能会遇到想要修改静态内容请求的情况,例如动态缩小 JavaScript。您可以使用 C# 编写该模块并将其编译为托管模块,但您希望针对静态内容触发它,因此您只需不将其标记为 managedHandler

最后,runAllManagedModulesForAllRequests="true" 用于覆盖 preCondition="managedHandler",以便所有这些都被解雇。

更多信息请访问:
http://www.iis.net/learn/get-started/introduction-to-iis/iis-modules-overview#Precondition

关于asp.net - 无法停止为静态内容触发 ASP.NET 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13060678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com