HttpModules的执行顺序是如何确定的?

36

假设 FirstModuleSecondModule 都处理 Application_BeginRequest 事件。它会按照在 web.config 中定义的顺序执行吗?

<httpModules>
  <add type="MyApp.FirstModule, MyApp" name="FirstModule"/>
  <add type="MyApp.SecondModule, MyApp" name="SecondModule"/>
  <add type="OtherApp.OtherModule, OtherApp" name="OtherModule"/>
</httpModules>

还有其他指定顺序的方法吗?

2个回答

38
根据这篇论坛帖子,HttpModules的执行顺序与它们的注册顺序相同。这对我来说很有道理,因为否则<clear><remove>指令也不会像预期的那样工作,例如在以下情况下使用:
<httpModules> 
   <clear/>
   <add... />
</httpModules>

2
论坛帖子中确实有人这么说。然而,也有几个人说你不应该依赖它。 - jessegavin
10
不应该依赖它,不是因为它不起作用,而是出于设计考虑和促进模块之间的松散耦合。但是,在配置文件中模块的顺序不会与实际情况有所不同。希望这可以帮到你。 - Phil Bennett
看起来你可以对它们进行排序,但是排序似乎被锁定了,你必须解锁条目才能影响实际排序。 - jamiebarrow
@jamiebarrow 我很想了解更多关于这个话题。你有什么网址或资源可以分享一下,让我了解一下锁定/解锁的相关信息吗? - jessegavin
1
在投入时间回答之前,请先检查这个链接:https://dev59.com/NWUp5IYBdhLWcg3w5Kk6#14974151 - Samuel
微软会不会如此无能,没有包含一个明确的排序机制? - thepirat000

4
根据Microsoft Press的Internet Information Services (IIS) 7.0 Resource Kit书籍摘录,为了解决这种相对排序依赖关系,管理员可以通过更改模块列表中列出的顺序来控制模块的相对排序。这是有效的,因为服务器使用模块配置部分中的顺序来在每个请求处理阶段内排序模块执行。通过在列表中将模块A放在模块B之前,您可以允许模块A在模块B之前执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接