asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
2021-05-04 05:28
标签:高级 自定义 abc 角度 关于 用户 重点 public oid 我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的。 参考: 最初我们访问 http://www.abc.com/a.aspx时,服务端是存在a.aspx这个文件的,服务端根据此文件帮我们创建一个对应类的实例处理请求。 因此出现了终结点路由,我们说路由的根本目的是将用户请求地址,映射为一个请求处理器,最简单的请求处理器可以是一个委托 Func 在通过vs默认模板创建asp.net core 3.x项目时,在startup中会看到这样的代码 看代码的第2行。它有如下3个任务 这里路由跟以前的写法差不多,上面默认值啊、约束啊就去看官方文档吧。 默认情况下是根据定义的路由去找到匹配的action最后生成终结点,这个生成终结点的过程我们是可以参与的,具体办法是通过endpoints.MapControllerRoute的返回对象上调用相关扩展方法,本质上是向终结点的创建过程加入一些委托,将来创建终结点时,这些委托将被调用,代码如下: app.UseEndpointsmvc时就说明了使用mvc和webapi了,默认情况下一个action会创建一个对应的终结点,请求抵达时匹配到终结点就直接执行了。但有时候我们希望自己控制一个请求过来时使用哪个controller的哪个action,具体做法: 这样将来请求抵达时,解析得到终结点时会调用我们的MyRouteValueTransformer,我们可以获取已解析得到的路有数据,然后选择替换/增加某些路由数据,从而达到定制化 默认情况下请求抵达时,若没有找到匹配的终结点,就直接404了,我们希望当没有匹配到任何终结点时直接执行某个默认的终结点,可以用如下方式: 当请求抵达时,如果没有匹配到任何终结点,则默认执行jjController.kkk方法。可以想象得到此功能可能是通过动态路由实现的 还有几个相关的扩展方法,有了上面的讲解,估计你也能猜出是干嘛用的了。关于路由注册就暂时说这么多 app.UseRouting();对应概述中的步骤3,此扩展方法内部会注册一个中间件,将来请求抵达时它会帮我们找到与当前请求匹配的终结点并存储在HttpContext中,且匹配过程中解析得到的路由数据在Request.RouteValues中。我们可以在它后面加入自己的中间件 asp.net core 3.x Endpoint终结点路由1-基本介绍和使用 标签:高级 自定义 abc 角度 关于 用户 重点 public oid 原文地址:https://www.cnblogs.com/jionsoft/p/12115417.html前言
目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结点路由的相关概念和如何使用,不会详细介绍路由,这个参考官方文档就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/概述
后来需求越来越复杂,出现了路由,目的是将请求地址与执行请求的处理器的直接关联,变成映射关联,映射规则由我们自己配置。
在asp.net core 3.x之前这个路由系统是包含在mvc内部的,.net framework时代有个特殊的HttpModule来实现mvc,路由系统也包含其中。.net core是由有个特殊的中间件来实现mvc的,路由系统就包含在这个中间件中。
这种方式有个问题,mvc只是一个中间件,路由系统包含在其中,如果我们希望在mvc中间件之后加入其它中间件,其它中间件是无法(也许是不方便)访问路由相关信息的。
另外asp.net core并不是只有mvc,还有webapi、blazor、signlR、接入gRpc等,将来还有更多,我们的路由系统能否提出来,让所有框架都可以用?
从抽象的角度可以简单理解为 一个终结点 = 处理请求的委托 + 与之关联的附加(元)数据。对应到mvc来理解的话 终结点 = action + 应用其上的attribute集合。但记住终结点是个抽象的概念,并不只服务于mvc,原理大概如下:
如何使用
1 app.UseRouting();
2 app.UseEndpoints(endpoints => {
3 endpoints.MapControllerRoute(
4 name: "default",
5 pattern: "{controller=Home}/{action=Index}/{id?}");
6 });
注册路由
创建终结点也会参照属性路由,微软推荐webapi使用属性路由,mvc使用传统路由。你会看到创建默认webapi项目时这样的 endpoints.MapControllers(); 终结点进一步定制
1 endpoints.MapControllerRoute(
2 name: "default",
3 pattern: "{controller=Home}/{action=Index}/{id?}").Add(endpointBuilder=> {
4 //通过endpointBuilder获取与action关联的数据,比如attribute和其它元数据
5 //通过endpointBuilder插入我们向放进终结点的数据
6 });
动态路由
定义一个类,继承DynamicRouteValueTransformer,并注册到ioc容器中,最后调用一个扩展方法,看代码: 1 class MyRouteValueTransformer : DynamicRouteValueTransformer
2 {
3 public override ValueTask
回退路由
endpoints.MapFallbackToController("{controller}/{action}/{id?}", "kkk", "jj");
自定义中间件提前拿到终结点数据
1 app.UseRouting();
2 app.Use((conttext,next)=> {
3 var endpoint = conttext.GetEndpoint();//拿到终结点
4 var routeData = conttext.Request.RouteValues;//拿到路由数据
//做些牛B的事
5 return next();
6 });
文章标题:asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
文章链接:http://soscw.com/index.php/essay/82127.html