MVC中从路由到Controller运行机制

下图中每个箭头的左侧对应的右侧方法为对象调用方法的过程:

由于UrlRoutingModule这个HttpModule被注册到Web应用中,所有对每个抵达的请求来说,当代表当前应用的HttpApplication对象的PostResolveRequestCache事件被触发的时候,UrlRoutingModule会利用RouteTable表示的路由表(实际上RouteTable的静态属性Routes返回的RouteCollection对象代表这个路由表)针对当前请求实施路由解析。

具体来说,UrlRoutingModule会调用路由表的RouteCollection对象的GetRouteData方法,如果定义在某个Route对象上的路由规则与当前请求相匹配,那么该方法执行结束自后会返回一个包含目标Controller和Action名称的路由变量的RouteData对象。

接下来UrlRoutingModule通过RouteData对象那个的RouteHandler属性得到匹配Route对象采用的RouteHandler对象,默认情况下这是一个MvcRouteHandler对象。UrlRoutingModule就调用这个MvcRouteHandler对象的GetHttpHandler方法得到一个MvcHandler对象。UrlRoutingModule随之调用当前HttpContext的RemapHandler方法对得到的HttpHandler(MvcHandler)对象实施映射,那么此HttpHandler将最终接管当前请求的处理。

对于MvcHandler来说,当它被用来处理当前请求的时候,它会利用RouteData对象得到目标Controller的名称,并借助于主场的ControllerFactory来激活对应的Controller对象。目标Controller被激活之后,它的Execute方法被MvcHandler调用。

如果被激活的Controller对象的类型是ControllerBase的子类,当它的Execute方法被执行的时候,它会调用ActionInvoker对象的InvokeAction方法来执行目标Action方法并对当前请求予以响应。默认采用的ActionInvoker是一个ControllerActionInvoker对象,当它的InvokeAction方法被执行的时候,它会利用注册的ModelBinder采用Model绑定的方式生成目标Action方法的参数列表,并利用ActionExecutor对象以“表达式树”的方式执行目标Action方法。

目标Action方法执行之后总是会返回一个ActionResult(对于返回类型不是ActionResult的Action方法来说,ASP.NET MVC总是会将执行的结果转换成一个ActionResult对象),ControllerActionInvoker会通过执行此ActionResult对象来对请求作最终的响应。

原文地址:https://www.cnblogs.com/Vam8023/p/8453088.html

时间: 2024-10-04 11:50:24

MVC中从路由到Controller运行机制的相关文章

.NetCore MVC中的路由(2)在路由中使用约束

.NetCore MVC中的路由(2)在路由中使用约束 0x00 路由模板中的约束 在配置路由模板时,除了以静态字符和变量的形式外,还可以通过配置对变量进行约束.实际如果不嫌麻烦的话在路由到的Action中对变量进行检查也是一种方法,不过对于变量的通用的约束当然是放在路由层面更加合适.而且这样做会简化Action的代码,使Action更加专注于自身业务,符合AOP的思路.这篇文章主要介绍路由模板中的约束. 0x01 在路由模板中使用约束 在路由模板中使用约束是很简单的,如下所示: {contro

.Net MVC中的路由

MVC中的URL也就是路由,不用通过路径访问实际的物理文件而达到向用户展示界面. URL的路由功能 一方面正向 映射到Controller和Action,根据用户输入的URL触发相应的控制器和对应方法,另一方面则反向映射并构造出URL,根据控制器和行为构造出URL以供程序调用. 系统首次启动将会加载Global.asax文件的Application_Start方法并去执行RegisterRoutes()构造器 protected void Application_Start() { AreaRe

MVC中的路由

authour: chenboyi updatetime: 2015-05-02 16:10:04 friendly link:   目录 1,思维导图 2,MVC处理机制简图(讲解路由解析) 3,默认路由规则 4,忽略路由 5,路由规则参数约束 6,命名空间约束 7,利用RouteDegger.dll来查看匹配的路由 1,思维导图: 2,MVC处理机制简图(讲解路由解析): 3,默认路由规则 在项目的App_Start文件夹下的RouteConfig.cs中进行修改 1 //MVC默认的路由规

ASP.NET MVC教程五:ASP.NET MVC中的路由

一.概述 在ASP.NET MVC架构中,控制器在3大核心构件中处于中心地位,通过控制器支配模型和视图,然而从浏览器发出的请求到控制器还需要路由的协助,路由将特定的请求和控制器的动作对应起来. 在ASP.NET MVC程序中,路由主要有两方面的职责: 与入站的请求相匹配,将这些请求映射到控制器的动作中. 构造出站的URL,这些URL可以响应控制器的动作. 二.路由原理 1.注册路由 先看Global.asax中的代码: 网站启动的时候执行Application_Start方法,通过RouteCo

Spring MVC中基于注解的 Controller

终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMethodNameResolver) 就已经可以在很大程度上帮助我们省去不少的 XML 配置,谁让

ASP.NET MVC 中的路由

普通的路由 在以前版本的ASP.NET MVC里,这些规则会被定义在RouteConfig.cs文件,也有Routing Assistant扩展可以实现基于特性的路由,不过是收费滴,另外还有一个扩展:http://attributerouting.net/ ,也很不错:理论上ASP.NET MVC 中要实现任意的规则URL 应该是没有问题的. 比如配置的酒店详情页路由 //HOTEL DETAIL routes.MapRoute(name: "HotelDetail", url: &q

MVC中url路由规则

Routing:首先获取视图页面传过来的请求,并接受url路径中的controller和action以及参数数据,根据规则将识别出来的数据传递给某controller中的某个action方法 MapRoute()有6个方法可以重载 方法1:系统提供的默认路由规则格式 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); r

ASP.NET MVC 中实现View与Controller分离

一.开篇题外话 我经常会在博客园逛来逛去,看过很多大牛们的Blog,我很少在这块技术天地活动,之前有发表过几篇日志,好像大部分是和电商有关,作为一个多年的开发人员,很少在这里分享,之前一直在CSDN上活动,因为我的Blog在那上边的排名1000多名,我想好好维护好CSDN,但是我发现越来越多的同行们都转战博客园.所以我也跟风来到此块宝地,我来了,你在哪? 二.分离的优点 1.松耦合:耦合是指一个系统的组件之间的相关程度.越少的组件相互依赖,那么这个系统的重用性和灵活性就越好. 2.更好的团队分工

【Web API系列教程】2.2 — ASP.NET Web API中的路由和动作选择机制

这篇文章描述了ASP.NET Web API如何将HTTP请求路由到控制器上的特定动作. 备注:想要了解关于路由的高层次概述,请查看Routing in ASP.NET Web API. 这篇文章侧重于路由过程的细节.如果你创建了一个Web API项目并且发现一些请求并没有按你预期得到相应的路由,希望这篇文章有所帮助. 路由有以下三个主要阶段: 将URI匹配到路由模板 选择一个控制器 选择一个动作 你可以用自己的习惯行为来替换其中一些过程.在本文中,我会描述默认行为.在结尾,我会指出你可以自定义