ASP.NET Core 2.1 : 图解路由(2.1 or earler)
本文通过一张图来看一下路由的配置以及请求处理的机制。
一、概述
路由主要有两个主要功能:
将请求的URL与已定义的路由进行匹配,找到该URL对应的处理程序并传入该请求进行处理。
根据已定义的路由生成URL
这两个功能看起来这两个是相反的。
A.路由的配置
路由的两个功能都离不开一个基本的操作:路由的基本配置。在Startup中默认通过 routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}")定义,
当然我们还可以继续 routes.MapRoute(。。。); 这样就定义了一系列的路由匹配方式组成一个路由表,例如这样:
每一个MapRoute会生成一个Route,第二个MapRoute看起来有些特殊,我们可以传入一个自定义的RequestDelegate(本例为MyRouteHandler.Handler)来处理“flylolo/{code}/{name}”这样的请求,
它会被封装成一个RouteHandler(new RouteHandler(MyRouteHandler.Handler))赋值给Route的target属性,而对于另外两种没有指定的,Route的target属性默认会被指定为MvcRouteHandler ,如下图:
B.Handler的选择
当请求进入之后,根据此路由表对该URL进行逐一匹配,并将请求交给匹配到的路由的target(即MvcRouteHandler或RouteHandler),调用 <span class="cnblogs_code" style="margin-top: 5px;margin-bottom: 5px;padding: 3px;background-color: rgb(245, 245, 245);border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);overflow: auto;color: rgb(0, 0, 0);font-family: " !important;"="" courier="" 12px="">_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,对比着更容易理解。
下面通过一张图看一下路由配置和请求处理的流程。
二、流程及解析
为了方便查看,对几个“重点对象”做了颜色标识(点击图片可以看大图):
路由的初始化配置
一切从Startup开始,之前在中间件的文章中介绍过,一般是通过多个UseXXX的方式将多个中间件组成“请求处理管道”,而在这里通过UseMvc方法进行配置,传入routes.MapRoute(...)这样的一个或多个配置。
接下来会New一个
RouteBuilder
,顾名思义就是一个Route的创建者,通过调用传进来的一个或多个routes.MapRoute()方法生成多个Route,并配置默认的Handler。
①调用RouteBuilder的Build方法,生成一个RouteCollection。
②RouteCollection实现IRouteCollection和IRouter接口,他是在Startup中的配置组成的集合。
③RouterMiddleWare就是专门用于进行路由处理的中间件,在此将RouteCollection作为中间件RouterMiddleWare的参数,并将这个中间件插入管道中。
2. 请求处理流程
④请求的处理流程在RouterMiddleWare的invoke()方法中。
⑤请求首先会被封装成一个RouteContext,本质就是将httpContext、_router(也就是RouteCollection)包装到一个对象里。
⑥调用_router(也就是RouteCollection)的RouteAsync(context)方法,在其中遍历每一个路由
⑦若与请求URL匹配,则将对应的Handler赋值给context.Handler。
⑧在RouterMiddleWare的invoke()方法中,调用新赋值的context.Handler处理HttpContext;
三、其他
由于文章写的比较早各种原因一直没有写完,现在发现2.2版本之后,启用了新的路由方案,还是把这章完成了发出来,有愿意看的可以参考一下,下一篇文章介绍一下2.2版的新的路由方案,至于通过路由生成URL部分,就暂时不写了。
https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html
原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
ASP.NET Core 2.1 : 图解路由(2.1 or earler)相关推荐
- ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)
原文:ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) 本文通过一张图来看一下路由的配置以及请求处理的机制.(ASP.NET Core 系列目录) 一.概述 路由主要 ...
- ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)
ASP.NET Core 系列目录 本文通过一张图来看一下路由的配置以及请求处理的机制. 一.概述 路由主要有两个主要功能: 将请求的URL与已定义的路由进行匹配,找到该URL对应的处理程序并传入该请 ...
- ASP.NET Core Blazor Webassembly 之 路由
web最精妙的设计就是通过url把多个页面串联起来,并且可以互相跳转.我们开发系统的时候总是需要使用路由来实现页面间的跳转.传统的web开发主要是使用a标签或者是服务端redirect来跳转.那今天来 ...
- ASP.NET Core MVC 配置全局路由前缀
前言 大家好,今天给大家介绍一个 ASP.NET Core MVC 的一个新特性,给全局路由添加统一前缀.严格说其实不算是新特性,不过是Core MVC特有的. 应用背景 不知道大家在做 Web Ap ...
- 第十五节:Asp.Net Core MVC和WebApi路由规则的总结和对比-第二十节
一. Core Mvc 1.传统路由 Core MVC中,默认会在 Startup类→Configure方法→UseMvc方法中,会有默认路由:routes.MapRoute("defaul ...
- 使用SWAGGER和ASP.NET CORE设置可选路由参数
使用SWAGGER和ASP.NET CORE设置可选路由参数 根据OpenAPI 3.0,这是不可能的.但是,如果您真的希望成为现实呢?您是否必须解决并允许您的Swagger文档出错?我在这里向您展示 ...
- java grpc 服务路由_.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容
原标题:.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容 英文:devblogs.microsoft.com 来源:艾心 译文:cnblogs.com/ediso ...
- Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
1622219047536 写在前面 Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...
- ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
Blazor支持渐进式应用开发也就是PWA.使用PWA模式可以使得web应用有原生应用般的体验. 什么是PWA PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和 ...
最新文章
- 积木赛尔号机器人_《赛尔号大电影7》2019年暑期重磅回归 继《熊出没》之后再掀国产动画浪潮...
- Java反射中method.isBridge() 桥接方法
- P1507 NASA的食物计划
- 历史是“混合体”,也是“内幕”:说说《三国大传》
- 在linux下实现mysql自动备份数据
- 源码阅读 AtomicInteger
- 挂载nfs文件系统_综合架构-day38-NFS服务补充
- C++之类与对象(2)
- Linux加入Windows域
- ThinkPad T61 X61安装XP系统的方法及xp驅動下載
- 案例:理想主义的猪与结果导向的猪
- matlab速成学习
- 小白学 Python(2):基础数据类型(上)
- Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载
- 数值分析思考题(钟尔杰版)参考解答——第八章
- 快速一站式搭建免费个人网站/博客 /Blog
- java接口与抽象类异同分析
- java版本结巴分词算法bug
- 计算机科学中具有特殊含义或易误解混淆的术语辨析
- 家校互通平台“我的班”完成Pre-A 轮融资,弘帆资本投资...