16

我正在阅读 MVC 中的请求生命周期。我陷入了对以下行的理解。

UrlRoutingModule 拦截请求

查询 - 什么是 UrlRoutingModule?

我在谷歌上搜索了很多,但找不到任何有用的

4

3 回答 3

26

对基于 ASP.NET MVC 的 Web 应用程序的请求首先通过UrlRoutingModule对象,该对象是一个 HTTP 模块。该模块解析请求并执行路由选择。该UrlRoutingModule对象选择与当前请求匹配的第一个路由对象。(路由对象是一个实现 的类,RouteBase通常是Route该类的一个实例。)如果没有匹配的路由,该UrlRoutingModule对象什么也不做,让请求回退到常规的 ASP.NET 或 IIS 请求处理。

从选定的Route对象中,该UrlRoutingModule对象获得一个实现该IRouteHandler接口并与该对象相关联的Route对象。通常,在 MVC 应用程序中,这将是MvcRouteHandler类的一个实例。该MvcRouteHandler实例创建一个MvcHandler实现IHttpHandler接口的对象。然后MvcHandler对象选择最终处理请求的控制器。有关详细信息,请参阅 ASP.NET 路由。

UrlRoutingModuleMvcRouteHandler类是 ASP.NET MVC 框架的入口点。他们执行以下操作:

  • 在 MVC Web 应用程序中选择适当的控制器。

  • 获取特定的控制器实例。

  • 调用控制器的Execute方法。

参考

于 2013-05-20T07:38:37.020 回答
3

如果您查看 MVC 项目的 Global.asax 内部,您将看到一个名为RegisterRoutes. 在此,您将看到“默认”的 ASP.NET MVC 路由:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

此路由指定 URL 请求的格式以及应如何将其映射到控制器操作,即路由的第一部分标识控制器,第二部分标识操作等。您可以为此添加其他自定义路由,这允许您使用不同格式的 URL。

UrlRoutingModule只是负责获取传入请求 URL 并将其与这些路由之一匹配的类,因此执行正确的控制器操作。

来自MSDN

UrlRoutingModule 类将 HTTP 请求与 ASP.NET 应用程序中的路由匹配。该模块遍历 RouteCollection 属性中的所有路由,并搜索具有与 HTTP 请求格式匹配的 URL 模式的路由。当模块找到匹配的路由时,它会检索该路由的 IRouteHandler 对象。从路由处理程序中,模块获取一个 IHttpHandler 对象并将其用作当前请求的 HTTP 处理程序。

于 2013-05-20T07:35:04.183 回答
0

只是为了添加更多细节。
正如@Ant P 提到的,下面的代码用于注册路由

    routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

实际上MapRoute是一个Extension methodon Routes 集合,它在内部实现如下。
注意:根据我的理解,它只是一个伪代码。

var url = "{controller}/{action}/{id}";

        var defaults = new RouteValueDictionary();
        defaults.Add("controller", "Home");
        defaults.Add("action", "Index");
        defaults.Add("id", UrlParameter.Optional);

        var routeHandler = new MvcRouteHandler();

        var Default = new Route(url,defaults,routeHandler);

        routes.Add(Default);

MvcRouteHandler 的GetHttpHandler()方法返回一个类的实例MvcHttpHandler,它在内部处理进一步的请求。

希望这将有助于理解UrlRoutingModule

于 2014-02-23T07:04:37.947 回答