ASP.NET Core 系列目录

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

一、概述

路由主要有两个主要功能:

  1. 将请求的URL与已定义的路由进行匹配,找到该URL对应的处理程序并传入该请求进行处理。
  2. 根据已定义的路由生成URL

这两个功能看起来这两个是相反的。

A.路由的配置

路由的两个功能都离不开一个基本的操作:路由的基本配置。在Startup中默认通过 routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}")定义,

当然我们还可以继续 routes.MapRoute(。。。);  这样就定义了一系列的路由匹配方式组成一个路由表,例如这样:

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

    1. 接下来会New一个

RouteBuilder

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

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

        public IRouter Build(){var routeCollection = new RouteCollection();foreach (var route in Routes){routeCollection.Add(route);}return routeCollection;}

②RouteCollection实现IRouteCollection和IRouter接口,他是在Startup中的配置组成的集合。

③RouterMiddleWare就是专门用于进行路由处理的中间件,在此将RouteCollection作为中间件RouterMiddleWare的参数,并将这个中间件插入管道中。

    public class RouterMiddleware{private readonly IRouter _router; //就是RouteCollectionpublic async Task Invoke(HttpContext httpContext);}

  2. 请求处理流程

        ④请求的处理流程在RouterMiddleWare的invoke()方法中。

      ⑤请求首先会被封装成一个RouteContext,本质就是将httpContext、_router(也就是RouteCollection)包装到一个对象里。

  var context = new RouteContext(httpContext);context.RouteData.Routers.Add(_router);

public class RouteContext
{private RouteData _routeData;public RequestDelegate Handler ;public HttpContext HttpContext;//简单的赋值public RouteData RouteData;
}

⑥调用_router(也就是RouteCollection)的RouteAsync(context)方法,在其中遍历每一个路由

⑦若与请求URL匹配,则将对应的Handler赋值给context.Handler。

        public async virtual Task RouteAsync(RouteContext context){// 快照备份var snapshot = context.RouteData.PushState(null, values: null, dataTokens: null);//遍历for (var i = 0; i < Count; i++){var route = this[i];context.RouteData.Routers.Add(route);try{await route.RouteAsync(context);//若匹配,则给context.Handler赋值if (context.Handler != null){break;}}finally{if (context.Handler == null){snapshot.Restore();//通过快照还原}}}}

⑧在RouterMiddleWare的invoke()方法中,调用新赋值的context.Handler处理HttpContext;

httpContext.Features[typeof(IRoutingFeature)] = new RoutingFeature()
{RouteData = context.RouteData,
};await context.Handler(context.HttpContext);

三、其他

由于文章写的比较早各种原因一直没有写完,现在发现2.2版本之后,启用了新的路由方案,还是把这章完成了发出来,有愿意看的可以参考一下,下一篇文章介绍一下2.2版的新的路由方案,至于通过路由生成URL部分,就暂时不写了。

ASP.NET Core 系列目录

原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html

转载于:https://www.cnblogs.com/NetPig/p/10671288.html

ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)相关推荐

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

    原文:ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) 本文通过一张图来看一下路由的配置以及请求处理的机制.(ASP.NET Core 系列目录) 一.概述 路由主要 ...

  2. ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

    ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 ASP.NET Core 从2.2版本开始 ...

  3. ASP.NET Core MVC 从入门到精通之路由

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用 ...

  4. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二--添加一个实体 学习ASP.NET ...

  5. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  6. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案(转)

    ASP.NET Core 系列目录 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大,但从内部运行方式上来说,差别还是很大的.上一 ...

  7. ASP.NET Core 2.2中的Endpoint路由

    Endpoint路由 在ASP.NET Core 2.2中,新增了一种路由,叫做Endpoint(终结点)路由.本文将以往的路由系统称为传统路由. 本文通过源码的方式介绍传统路由和Endpoint路由 ...

  8. ASP.NET Core 2.1 : 十.升级现有Core2.0 项目到2.1

    .NET Core 2.1 终于发布了, 赶紧升级一下. 一. 安装SDK 首先现在并安装 SDK(64-bit) 安装完毕后如果新建项目可以看到已经有2.1的选项了 二. 更新现有2.0项目到2.1 ...

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

    本文通过一张图来看一下路由的配置以及请求处理的机制. 一.概述 路由主要有两个主要功能: 将请求的URL与已定义的路由进行匹配,找到该URL对应的处理程序并传入该请求进行处理. 根据已定义的路由生成U ...

最新文章

  1. 机械转嵌入式还是it?学嵌入式好还是java好?
  2. 清除vs2003-vs2008起始页最近打开项目
  3. 配置Vm box虚拟机
  4. Java BigInteger类| 带示例的shiftLeft()方法
  5. nohup命令让Linux程序永远在后台执行
  6. php内核介绍及扩展开发指南 pdf vp进,PHP内核介绍及扩展开发指南—Extensions 的编写...
  7. 构建项目时发生错误 - 错误:CS0006“... \ Assembly-CSharp-firstpass.dll”找不到
  8. 逻辑斯蒂回归与最大熵模型---最大熵模型
  9. HDU-4145 A Simple Problem 简单数论
  10. allennlp使用
  11. 火狐浏览器去除广告插件
  12. 中科探海的海底掩埋物三维实时成像声呐
  13. jquery中的mouseover、mouseout 和 mouseenter 、 mouseleave的区别
  14. 计算机usb无法识别网络连接,打印机安装出现“跟这台计算机连接的一个USB设备运行不正常,windows无法识别”解决方法...
  15. 黑龙江省力推互联网与畜牧产业深度融合 打造大数据中心
  16. 2018年HBase生态社群画像
  17. 阿里云——OSS的创建和使用
  18. 颜色之ARGB与RGB、RGBA的区别与介绍
  19. mysql表关联_MySQL表关联的几种常用方式
  20. Javaweb零基础学习(壹)

热门文章

  1. windows2003+PHP-5.3.8+IIS6.0的安装配置
  2. 引用用户控件图片无法
  3. 轻松实现Access数据导入Oracle!
  4. java hibernate错误org/dom4j/DocumentException、org/jboss/logging/BasicLogger、org/apache/lucene/index...
  5. 8086汇编复习1 - 并使用emu8086模拟器查看效果
  6. OO Unit4 UML
  7. POJ 3177 Redundant Paths (边双连通+缩点)
  8. 正则化方法:防止过拟合,提高泛化能力
  9. 记录一次阿里云服务器升级报错
  10. PHP基础--mySQL数据库