ASP.NET MVC - 什么是UrlRoutingModule?

17

我正在阅读有关MVC中请求生命周期的内容。我在理解下面这句话时遇到了困难。

UrlRoutingModule拦截请求

问题 - 什么是UrlRoutingModule?

我在Google上搜索了很多,但没有找到任何有用的信息。

3个回答

28

ASP.NET MVC(Model-View-Controller)的Web应用程序会首先经过HTTP模块 UrlRoutingModule 对象进行请求。该模块解析请求并执行路由选择。 UrlRoutingModule 选择与当前请求匹配的第一个路由对象。(路由对象是实现了RouteBase接口的类,通常是Route类的实例。)如果没有任何路由匹配,则 UrlRoutingModule 不执行任何操作,并将请求回退到常规ASP.NET或IIS请求处理。

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

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

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

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

  • 调用控制器的Execute方法。

参考文献


UrlRoutingModule和Http Module之间有什么区别吗? - user2333922
1
@Amit: 正如你在第一句话中所说的,“向基于 ASP.NET MVC 的 Web 应用程序发出的请求首先通过 UrlRoutingModule 对象(它是一个 HTTP 模块)。”UrlRoutingModule 和 Http 模块之间有什么区别吗? - Imad Alazani
一个HTTP模块是一些代码的通用概念,当IIS处理请求时会执行。这是一个非常简单的描述,但更多的内容无法适合于注释,关于这个主题有很多阅读材料。在.Net中,它是实现了IHttpModule接口的类。System.Web.Routing.UrlRoutingModule是一个具体的类,实现了IHttpModule,这使它成为一个具体的HTTP模块,可以执行具体任务。在ASP.Net中有许多HTTP模块,任何人都可以创建自己的模块。 - user3285954

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处理程序。


0

再补充一些细节。
如@Ant P所述,以下代码用于注册路由:

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

实际上,MapRoute是路由集合上的扩展方法,它在内部实现如下。
注意:这只是我理解的伪代码。

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 的作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接