Asp.net mvc 为什么ASP.NET路由优先于web.config Http处理程序部分?

Asp.net mvc 为什么ASP.NET路由优先于web.config Http处理程序部分?,asp.net-mvc,asp.net-mvc-routing,httphandler,asp.net-routing,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中定义的处理程序?我原以为Web.Routing

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

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

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

请注意,这些处理程序的实际文件不存在于磁盘上-它们是虚拟的并嵌入在程序集中。下面是一个第三方处理程序的示例,该处理程序现在需要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处理程序的忽略路由,以作记录?或者我做错了什么?

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


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

路由是作为HttpModule实现的,因此它总是在选择HttpHandler之前进行处理。为什么不将其作为答案Ladislav发布,以便从中获得代表。感谢Jonas的扩展。我们决定将所有可能的Http处理程序的主列表作为每个应用程序实例的忽略路由,以避免这种行为(即使我们的一些应用程序实例不使用某些处理程序)。