这些委托将被调用
我是从.net 4.5直接跳到.net core 3.x的,觉得asp.net这套对象最初是从4.5中的owin形成的。
目前官方文档重点是讲路由,没有出格说明与传统路由的区别,本篇主要介绍终结点路由的相关观点和如何使用,不会详细介绍路由,这个参考官方文档就ok了。如果将来有机会研究到底层再深度分解。
参考:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-3.1
https://q.cnblogs.com/q/113644/
https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/
最初我们访谒 时,处事端是存在a.aspx这个文件的,处事端按照此文件帮我们创建一个对应类的实例措置惩罚惩罚请求。
后来需求越来越庞大,呈现了路由,目的是将请求地点与执行请求的措置惩罚惩罚器的直接关联,酿成映射关联,映射法则由我们本身配置。
在asp.net core 3.x之前这个路由系统是包罗在mvc内部的,.net framework时代有个特殊的HttpModule来实现mvc,路由系统也包罗此中。.net core是由有个特殊的中间件来实现mvc的,路由系统就包罗在这其中间件中。
这种方法有个问题,mvc只是一其中间件,路由系统包罗在此中,如果我们但愿在mvc中间件之后插手其它中间件,其它中间件是无法(也许是未便利)访谒路由相关信息的。
此外asp.net core并不是只有mvc,还有webapi、blazor、signlR、接入gRpc等,将来还有更多,我们的路由系统能否提出来,让所有框架都可以用?
因此呈现了终结点路由,我们说路由的根柢目的是将用户请求地点,映射为一个请求措置惩罚惩罚器,最简单的请求措置惩罚惩罚器可以是一个委托 Func<HttpCotnext,Task>,也可以是mvc/webapi中某个controller的某个action,所以从抽象的角度讲 一个终结点 就是一个措置惩罚惩罚请求的委托。由于mvc中action上还有很多attribute,因此我们的终结点还应该供给一个调集,用来存储与此请求措置惩罚惩罚委托的关联数据。
从抽象的角度可以简单理解为 一个终结点 = 措置惩罚惩罚请求的委托 + 与之关联的附加(元)数据。对应到mvc来理解的话 终结点 = action + 应用其上的attribute调集。但记住终结点是个抽象的观点,并不但处事于mvc,道理概略如下:
在措施启动前我们应该界说好措施中有哪些终结点,固然不是我们手动一个个界说,而是按照方针框架自动生成,针对mvc来说的话可以自动将措施中与路由匹配的action转换成对应的终结点,其它框架应该也有对应的方法,横竖最终我们所有用来措置惩罚惩罚请求的东东都酿成了终结点。这步是在界说路由时自动完成的
除了界说终结点我们还要界说 请求路径 与 终结点的对应关系,将来请求抵达时才华匹配找到合适的终结点来措置惩罚惩罚我们的请求,这步相当于界说路由
我们还需要界说一个解析器,当请求抵达时按照终结点与路径的对应关系找到终结点,微软已界说好对应的中间件来暗示这个解析器。
最后我们需要界说一其中间件,在上面的中间件执行后 我们可以拿到与当前请求匹配的终结点,最终挪用它的委托措置惩罚惩罚请求,这其中间件就是mvc中间件
到此asp.net core 3.x的中间件路由默认差不久不多就这样了,此时我们可以界说本身的中间件,放在法式3后面,拿到终结点做一些高级措置惩罚惩罚。微软界说的一些中间件也是这个套路
如何使用在通过vs默认模板创建asp.net core 3.x项目时,在startup中会看到这样的代码
1 app.UseRouting(); 2 app.UseEndpoints(endpoints => { 3 endpoints.MapControllerRoute( 4 name: "default", 5 pattern: "{controller=Home}/{action=Index}/{id?}"); 6 });
注册路由看代码的第2行。它有如下3个任务
创建终结点界说,针对mvc来说会自动将措施中与路由格局匹配上的action转换为终结点。在第5行之后可以调试不雅察看endpoints.DataSource属性,生成好的终结点就在里面
成立url与终结点的对应关系,这种关系存在哪?我也不晓得
注册mvc中间件(它在将来请求抵达,且之前有中间件解析得到与当前请求匹配的终结点后,开始mvc旅程)
这里路由跟以前的写法差不久不多,上面默认值啊、约束啊就去看官方文档吧。
创建终结点也会参照属性路由,微软保举webapi使用属性路由,mvc使用传统路由。你会看到创建默认webapi项目时这样的 endpoints.MapControllers();
默认情况下是按照界说的路由去找到匹配的action最后生成终结点,这个生成终结点的过程我们是可以参预的,具体步伐是通过endpoints.MapControllerRoute的返回东西上挪用相关扩展要领,素质上是向终结点的创建过程插手一些委托,将来创建终结点时,这些委托将被挪用,代码如下:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32733.html