9

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

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

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

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

4

1 回答 1

2

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

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

于 2011-01-17T00:35:28.490 回答