【问题标题】:Why does ASP.NET Routing take precendence over web.config Http Handlers section?为什么 ASP.NET 路由优先于 web.config Http Handlers 部分?
【发布时间】:2011-05-14 12:38:55
【问题描述】:

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

真的有必要在我们的 global.asax 中添加显式的 Ignore Routes 以便运行时能够尊重我们在 web.config 中定义的处理程序吗?我原以为 Web.Routing 会在 在 system.webServer\handlers 中定义的处理程序被检查(而不是相反)之后被调用。

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

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

【问题讨论】:

  • 路由是作为 HttpModule 实现的,所以总是在选择 HttpHandler 之前进行处理。
  • 您为什么不将其发布为拉迪斯拉夫的答案,以便您从中获得代表。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢 Jonas 的扩展。我们决定堆积所有可能的 Http 处理程序的主列表作为每个应用程序实例的忽略路由以避免这种行为(即使我们的一些应用程序实例不使用某些处理程序)。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多