2010-03-11 83 views
28

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

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

是否有其他方式可以指定订单?

回答

31

根据this forum post,HttpModules按它们注册的顺序执行。这对我来说是有意义的,因为否则<clear><remove>指令也不能按预期工作,例如,当使用像这样:

<httpModules> 
    <clear/> 
    <add... /> 
</httpModules> 
+0

有人在论坛帖子中说过。但是有几个人也说过你不应该依赖它。 – jessegavin 2010-03-11 19:04:51

+8

不应该依赖于它是的,不是因为它不起作用,而是因为设计考虑和促进模块之间的松散耦合。但是不存在模块排序与配置文件中的排序不同的情况。希望这可以帮助。 – 2010-03-22 08:40:26

+0

看起来您可以订购它们,但订购似乎已锁定,您必须解锁条目以影响实际订购。 – jamiebarrow 2011-08-17 14:53:01

-1

我不认为您可以保证或指定httpmodules将运行的命令。如果SecondModule依赖于FirstModule,将它们的功能组合到1个httpmodule中可能会更好。

+4

我有一个UrlRewriting第三方HttpModule,我真的很希望能够在它到达第三方HttpModule之前拦截请求。 – jessegavin 2010-03-11 18:26:42

+0

您可能可以将事件处理程序附加到在urlrewriting模块关心的事件之前触发的事件。所以如果UrlRewriting只处理EndRequest,你可以附加到BeginRequest。 – 2010-03-11 19:17:36