.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序。

回忆下在Web Forms应用程序中使用路由的方式:

640?wx_fmt=png

然后是MVC应用程序:

640?wx_fmt=png

再到了ASP.NET Core:

640?wx_fmt=png

还可以用更简单的写法:

640?wx_fmt=png

从源码上看这两个方法的实现是一样的。

640?wx_fmt=png

关键是内部UseMvc方法的内容:

640?wx_fmt=png

其中的处理过程,首先实例化了一个RouteBuilder对象,并对它的DefaultHandler属性赋值为MvcRouteHandler。接着以其为参数,执行routes.MapRoute方法。

MapRoute的处理过程就是为RouteBuilder里的Routes集合新增一个Route对象。

640?wx_fmt=png

有此一个Route对象仍不夠,程序里又插入了一个AttributeRoute。

随后执行routes.Build(),返回RouteCollection集合。该集合实现了IRouter接口。

640?wx_fmt=png

最终使用已完成配置的路由。

640?wx_fmt=png

于是又看到了熟悉的Middleware。它的核心方法里先调用了RouteCollection的RouteAsync处理。

640?wx_fmt=png640?wx_fmt=png

其内部又依次执行各个Route的RouteAsync方法。

640?wx_fmt=png

之前的逻辑中分别在RouteCollection里加入了AttributeRoute与Route。
*循环中会判断Handler是否被赋值,这是为了避免在路由已被匹配的情况下,继续进行其它的匹配。从执行顺序来看,很容易明白AttributeRoute比一般Route优先级高的道理。

先执行AttributeRoute里的RouteAsync方法:

640?wx_fmt=png

里面调用了TreeRouter的RouteAsync方法:

640?wx_fmt=png

如果所有AttributeRoute路由都不能匹配,则不会进一步作处理。否则的话,将继续执行Handler中的RouteAsync方法。这里的Handler是MvcAttributeRouteHandler。

640?wx_fmt=png

该方法内部的处理仅是为RouteContext的Handler属性赋值。实际的操作则是要到RouterMiddleware中Invoke方法的context.Handler(context.HttpContext)这一步才被执行的。

至于Route里的RouteAsync方法:

只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。

protected override Task OnRouteMatched(RouteContext context){context.RouteData.Routers.Add(_target);    return _target.RouteAsync(context);
}

此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。

640?wx_fmt=png

只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。

protected override Task OnRouteMatched(RouteContext context){context.RouteData.Routers.Add(_target);    return _target.RouteAsync(context);
}

此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。

640?wx_fmt=png

处理过程与MvcAttributeRouteHandler相似,一样是要在RouterMiddleware的Invoke里才执行Handler的方法。

以一张思维导图可以简单概括上述的过程。

640?wx_fmt=png

或者用三句话也可以描述整个流程。

  • 添加路由

  • 匹配地址

  • 处理请求

原文地址:https://www.cnblogs.com/kenwoo/p/9484499.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单调栈】奶牛的歌声(jzoj 1256)

奶牛的歌声 jzoj 1256 题目大意 有n头牛,每头牛的声音可以被两边第一头比他高的牛所听到,音量为S,问听到声音的音量之和最大的牛听到的音量之和是多少 输入样例 3 4 2 3 5 6 10输出样例 7样例解释 队伍中有3头奶牛,第1头牛…

P3168-[CQOI2015]任务查询系统【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3168 题目大意 nnn个任务(si,ei,ti)(s_i,e_i,t_i)(si​,ei​,ti​)表示从si∼eis_i\sim e_isi​∼ei​的任务优先级为tit_iti​。 然后每次询问一个时刻前kkk小的优先级任务优先级和。 解题思路 开主席树,在sis…

相反数

A 相反数 传送 题意&#xff1a; 一个数加上他的相反数 题解&#xff1a; 用字符串存数&#xff0c;分出求出本身和相反数的值&#xff0c;然后相加输出&#xff0c;注意判断相反后出现0的情况 代码 #include<bits/stdc.h> using namespace std; int main() {str…

博客开通

开通博客第一天&#xff0c;纪念一下——

.NetCore Cap 结合 RabbitMQ 实现消息订阅

开源分布式消息框架 Cap 可以在GitHub上拉也可以通过nuget添加上一篇博文写了 Windows RabbitMQ的安装使用 Cap支持事务&#xff0c;通过捕获数据库上下文连接对象实现 消息事务&#xff0c;消息持久化怎么来实现消息订阅 消费&#xff1f;使用起来非常简单&#xff0c;主要通过…

SAM学习小记

前言 只是一个小记&#xff0c;不是算法详解 参考资料 史上最通俗的后缀自动机详解 广义SAM模板题解 正题 概念 定义 简单的&#xff0c;一个有向无环图&#xff0c;边有字母&#xff0c;满足起点开始的每一条路径都是原串的一个子串。 并且保证复杂度在O(n)O(n)O(n)级别内…

【DP】滑雪场的缆车(jzoj 1257)

滑雪场的缆车 jzoj 1257 题目大意 给你一座山的图&#xff08;有n个间隔相同的点&#xff09;&#xff0c;现在让你从第一个点连到最后一个点&#xff0c;一条线的两个端点的水平距离不能大于m&#xff0c;且线不能通过地面&#xff0c;最多挨着地面&#xff0c;现在问你最少…

小H和游戏

文章目录题目描述题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小H正在玩一个战略类游戏&#xff0c;她可以操纵己方的飞机对敌国的N座城市(编号为1~N…

Top Secret Task(dp+滚动数组)

传送门&#xff1a; 题目 dp[i][j][k] 表示 考虑到第i个数 计算前j个数的和 进行了k次操作 则有 若不把第i个数放入前j个数中 dp[i][j][k] dp[i-1][j][k] 若把第i个数放入前j个数中 至少需要把第i个移到第j个&#xff0c;即进行i-j次操作if(k > i-j) dp[i][j][k…

asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

在 asp.net core 发布时&#xff0c;本人先后产生了3个疑问。1、发布的程序为什么不能在docker容器中运行当时在window开发环境中发布后&#xff0c;dotnet xxx.dll可以正常运行&#xff1b;但放入docker容器后就报 *.*.deps.json not found 的错误。后根据下面的文章解决了问题…

[2020.11.25NOIP模拟赛]出租车【dp】

正题 题面链接:https://www.luogu.com.cn/problem/U142298?contestId37766 题目大意 nnn个人有起点和终点&#xff0c;按顺序上车&#xff0c;但下车可以任意顺序&#xff0c;车最多同时只能载444个人。求车的最短路程。 解题思路 显然我们需要把上次上车的人&#xff0c;现…

纪中B组模拟赛总结(2019.12.21)

&#xff08;因为是两人一号&#xff0c;所以不方便显示成绩就不打了&#xff09; 总结&#xff1a; 今天竟有四道题&#xff01;&#xff01;&#xff01; T1看过之后&#xff0c;想了大概10分钟然后想了出来&#xff0c;就是一个单调栈&#xff0c;不算特别难 T2一开始想到…

水题(water)(非详细解答)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 其中&#xff0c;f(1)1;f(2)1;Z皇后的方案数&#xff1a;即在ZZ的棋盘上放置Z个皇后&#xff0c;使其互不攻击的方案数。…

网络流小结

最大流&#xff1a; EK算法&#xff1a; #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int inf0x7fffffff; const int maxn10010; struct node{int u,v,f,next; }edge[300050]; int s,t,cnt,…

.NET MVC CSRF/XSRF 漏洞

最近我跟一个漏洞还有一群阿三干起来了……背景&#xff1a;我的客户是一个世界知名的药企&#xff0c;最近这个客户上台了一位阿三管理者&#xff0c;这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍。由于我们的客户关系维护的非常好&#xff0c;直接对口人提前透…

jzoj5057-[GDSOI2017模拟4.13]炮塔【网络流,最大权闭合图】

正题 题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军&#xff0c;每个炮可以攻击在它方向上一个敌军&#xff0c;但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路 我们先把炮分成两类&#xff0c;一类是横着打&a…

【最大流】牛棚安排(jzoj 1259)

牛棚安排 jzoj 1259 题目大意&#xff1a; 有nnn头牛和mmm个牛棚&#xff0c;每头牛有自己第1喜欢&#xff0c;第2喜欢……第mmm喜欢的牛棚&#xff08;开心度分别为m,m−1,m−2……1m,m-1,m-2……1m,m−1,m−2……1&#xff09;&#xff0c;然后读入mmm个数表示第iii个牛棚…

牛客算法周周练2

文章目录A 相反数B Music ProblemC 完全平方数D 小H和游戏E 水题(water)A 相反数 题解 B Music Problem 题解 C 完全平方数 题解 D 小H和游戏 题解 E 水题(water) 题解

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

正文ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性&#xff0c;今天主角就是 ApiControllerAttribute。0. ApiControllerAttribute 继承自 ControllerAttributeASP.NET Core MVC 已经有了ControllerAttribute&#xff0c;这个用来标注一个类型是否是Controller。…

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来&#xff0c;.NET就支持应用程序自动升级。在ClickOnce模型中&#xff0c;WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是&#xff0c;由于微软试图模仿iOS应用商店模型&#xff0c;所以&#xff0c;该模型未能延续到UWP。微…