ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)

 本文通过一张图来看一下路由的配置以及请求处理的机制。(

app.UseMvc(routes => {     routes.MapRoute(name: "test", template: "Hello");     routes.MapRoute("flylolo/{code}/{name}", MyRouteHandler.Handler);     routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
复制代码

每一个MapRoute会生成一个Route,第二个MapRoute看起来有些特殊,我们可以传入一个自定义的RequestDelegate(本例为MyRouteHandler.Handler)来处理“flylolo/{code}/{name}”这样的请求,

复制代码
    public static class MyRouteHandler     {         public static async Task Handler(HttpContext context)         {             await context.Response.WriteAsync("MyRouteHandler");         }     }
复制代码

它会被封装成一个RouteHandler(new RouteHandler(MyRouteHandler.Handler))赋值给Route的target属性,而对于另外两种没有指定的,Route的target属性默认会被指定为MvcRouteHandler ,如下图:

B.Handler的选择

当请求进入之后,根据此路由表对该URL进行逐一匹配,并将请求交给匹配到的路由的target(即MvcRouteHandler或RouteHandler),调用 _target.RouteAsync(context); ,在这个方法中,若是MvcRouteHandler会对请求的Controller和Action验证,若验证成功,则对context(是一个RouteContext)的Handler属性赋值一个匿名方法;若是RouteHandler则会直接将其封装的RequestDelegate(本例为MyRouteHandler.Handler)赋值给RouteContext.Handler.

C.请求处理

经过Handler的选择后,若RouteContext.Handler不为空,则调用RouteContext.Handler(HttpContext)对请求进行处理。

D.其他

回想一下中间件,这个是不是和app.Map("/test", XXHandle)这样配置中间件的方式有点像,当请求路径是/test的时候,请求交由XXHandle处理,同样是Map,对比着更容易理解。

下面通过一张图看一下路由配置和请求处理的流程。

二、流程及解析

 点击看大图

  为了方便查看,对几个“重点对象”做了颜色标识(点击图片可以看大图):

 

  1. 路由的初始化配置
  2. 一切从Startup开始,之前在中间件的文章中介绍过,一般是通过多个UseXXX的方式将多个中间件组成“请求处理管道”,而在这里通过UseMvc方法进行配置,传入routes.MapRoute(...)这样的一个或多个配置。
    接下来会New一个

RouteBuilder

    ,顾名思义就是一个Route的创建者,通过调用传进来的一个或多个routes.MapRoute()方法生成多个Route,并配置默认的Handler。
复制代码
                var routes = new RouteBuilder(app)                 {                     DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),                 };                  configureRoutes(routes);//调用Startup中的routes.MapRoute(...)方法
复制代码

 

          ①调用RouteBuilder的Build方法,生成一个RouteCollection

复制代码
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信