我正在阅读 MVC 中的请求生命周期。我陷入了对以下行的理解。
UrlRoutingModule 拦截请求
查询 - 什么是 UrlRoutingModule?
我在谷歌上搜索了很多,但找不到任何有用的
我正在阅读 MVC 中的请求生命周期。我陷入了对以下行的理解。
UrlRoutingModule 拦截请求
查询 - 什么是 UrlRoutingModule?
我在谷歌上搜索了很多,但找不到任何有用的
对基于 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 路由。
UrlRoutingModule
和MvcRouteHandler
类是 ASP.NET MVC 框架的入口点。他们执行以下操作:
在 MVC Web 应用程序中选择适当的控制器。
获取特定的控制器实例。
调用控制器的Execute
方法。
如果您查看 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 处理程序。
只是为了添加更多细节。
正如@Ant P 提到的,下面的代码用于注册路由
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
实际上MapRoute
是一个Extension method
on 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