为什么ASP.NET Routing优先于web.config Http Handlers部分?

时间:2010-11-23 14:57:43

标签: asp.net-mvc asp.net-mvc-routing httphandler asp.net-routing

我们的工作室正在将ASP.NET MVC集成到一个大型Web应用程序中,该应用程序利用了自定义和在 system.webServer \ handlers 下的web.config中定义的第三方HTTP处理程序。以这种方式利用HTTP处理程序对我们来说非常好,因为我们不需要重新编译应用程序,也不需要将实际的处理程序页面放在Web范围内的磁盘上,以用于每个产品实例。

是否真的有必要在我们的global.asax中添加显式的忽略路由,以便运行时可以遵守web.config中定义的处理程序?我认为在调查了system.webServer \ handlers中定义的处理程序之后 会调用Web.Routing(而不是相反)。

我们使用模块化设计,允许在添加功能时从web.config添加/删除处理程序。随着MVC路由的引入,我们需要在global.asax文件中为web.config中定义的每个可能的处理程序添加忽略路由。

请注意,磁盘上不存在这些处理程序的实际文件 - 它们是虚拟的并嵌入在程序集中。以下是第三方处理程序的示例,现在需要在global.asax中显式忽略路由:

<system.webServer>
    <handlers>
          <!-- telerik radcontrols -->
          <add name="TelerikDialogHandler" verb="*" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler, Telerik.Web.UI, Version=2009.1.402.20, Culture=neutral, PublicKeyToken=121fae78165ba3d4"></add>
    </handlers>
</system.webServer>

因此,对于记录,如果使用System.Web.Routing,则必须包含在Web.Config中指定的Http Handler的忽略路由?或许我做错了什么?

1 个答案:

答案 0 :(得分:2)

ASP.NET请求处理基于管道模型,其中ASP.NET将http请求传递给管道中的所有模块。每个模块都接收http请求并完全控制它。一旦请求通过所有HTTP模块,它最终将由HTTP处理程序处理。 HTTP处理程序对其执行一些处理,结果再次通过管道中的HTTP模块。

我认为考虑这些问题的最佳方法是HttpModule是一个过滤器,它在事件发生时从请求对象中添加或减去某些内容,而HttpHandler是实际为请求提供服务的处理器。 ASP.NET请求生命周期的设置方式是在处理发生之前,所有过滤器首先应用于请求。