ASP.NET Core 2.2中的Endpoint路由

在ASP.NET Core 2.2中,新增了一种路由,叫做Endpoint(终结点)路由。本文将以往的路由系统称为传统路由

本文通过源码的方式介绍传统路由和Endpoint路由部分核心功能和实现方法,具体功能上的差异见官方文档。

在升级到ASP.NET Core 2.2后,会自动启用Endpoint路由。如果要恢复以往的实现逻辑,需要加入以下代码:

services.AddMvc(options => options.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

本文分析的源代码基于ASP.NET Core 2.2.3版本的源代码。

Endpoint路由与传统路由的区别在于,传统路由UrlAction对应关系的处理是在UseMvc中做的。我们无法根据Url获取对应的Action然后进行处理。

Endpoint就是将UrlAction的映射关系从Mvc中拆离,作为独立使用的中间件。

由此带来的好处是我们可以在其他的中间件中使用ControllerAction上的一些信息,例如Attruibute

框架也提供了LinkGenerator类来直接根据Endpoint生成链接,不再需要HttpContext的信息。

另外也提升了一些RPS(Requests per Second)。

不过目前Endpoint依然是在UseMvc中调用,更多开放的使用方式会在ASP.NET Core 3.0中实现。

源代码见Github。也可以获取源代码到本地看。

MvcApplicationBuilderExtensions.cs文件72行的UseMvc方法中我们可以看到以下代码:

var options = app.ApplicationServices.GetRequiredService<IOptions<MvcOptions>>();

if (options.Value.EnableEndpointRouting)
{
...
}
else
{
...
}

if之中是Endpoint路由的逻辑,else是传统路由的逻辑。
MvcOptions的构造方法如下所示,EnableEndpointRouting是通过CompatibilitySwitch来控制默认值的,这就是CompatibilityVersion.Version_2_2启用Endpoint路由的原因。

public MvcOptions()
{

_enableEndpointRouting = new CompatibilitySwitch<bool>(nameof(EnableEndpointRouting));

}

MvcApplicationBuilderExtensions.cs文件的92-123行的代码是将所有的Controller中的Action转换成Endpoint

在129行的UseEndpointRouting中,添加了一个EndpointRoutingMiddleware的中间件,这个中间件就是从所有的Endpoint中找到当前路由对应的Endpoint,然后放到Feature集合中。

在132行的UseEndpoint中,添加了一个EndpointMiddleware中间件,这个中间件是将EndpointRoutingMiddleware中找到的Endpoint取出,根据其中的MetaData信息,找到对应的ControllerAction,并调用。

UseMvc方法里,UseEndpointRoutingUseEndpoint是连续的两个中间件,而UseEndpoint是请求的结束,这意味着我们自定义的中间件无法取得Endpoint信息。

但是通过手动调用UseEndpoint,我们还是可以拿到Endpoint路由信息的。

下面展示一个使用示例。

定义一个LogAttribute类,并包含一个Message属性,在Action上声明使用。

定义一个EndpointTestMiddleware中间件,输出LogAttributeMessage属性。

手动调用UseEndpointRouting,然后调用我们定义的EndpointTestMiddleware中间件。


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseEndpointRouting();

app.UseMiddleware<EndpointTestMiddleware>();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

public class EndpointTestMiddleware
{
private RequestDelegate _next;

public EndpointTestMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task Invoke(HttpContext httpContext)
{
var endpoint = httpContext.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint == null)
{
await _next(httpContext);
return;
}
var attruibutes = endpoint.Metadata.OfType<LogAttribute>();
foreach (var attribute in attruibutes)
{
Debug.WriteLine("------------------------------------------------------------------------");
Debug.WriteLine(attribute.Message);
Debug.WriteLine("------------------------------------------------------------------------");
}
await _next(httpContext);
}
}

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class LogAttribute : Attribute
{
public LogAttribute(string message)
{
Message = message;
}

public string Message { get; set; }
}

public class HomeController : Controller
{
[Log("Index")]
public IActionResult Index()
{
return View();
}

[Log("Privacy")]
public IActionResult Privacy()
{
return View();
}
}

这样的话,我们可以在我们自己的中间件中拿到Endpoint信息,然后找到Controller上的LogAttribute,然后输出Message

Endpoint是ASP.NET Core 2.2中一种新的路由机制,它解决了传统路由难以扩展的问题,解决了传统路由与MVC过于耦合的问题,并提升了一定的RPS。

本文介绍了Endpoint路由,简单分析了Endpoint的实现原理,并给出了一个使用的示例。

参考链接:

  1. [https://devblogs.microsoft.com/aspnet/asp-net-core-2-2-0-preview1-endpoint-routing/]

  2. [https://www.stevejgordon.co.uk/asp-net-core-first-look-at-global-routing-dispatcher]

  3. [https://rolandguijt.com/endpoint-routing-in-asp-net-core-2-2-explained/]


原文地址:https://www.cnblogs.com/Weilence/p/10616567.html

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

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

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

相关文章

AtCoder2063 [AGC005E] Sugigma The Showdown(博弈论)

problem 洛谷链接 solution 考虑一条 (u,v)(u,v)(u,v) 的红边&#xff0c;在蓝树上 u,vu,vu,v 两点距离 ≥3\ge 3≥3。 如果先手到达 u,vu,vu,v 其中任何一点且下一步后手行动无法抓住先手&#xff0c;那么这个游戏就将进入死循环了。 通过画图&#xff0c;你会发现这个结…

基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频Abp中文网(https://cn.abp.io/)提供翻译字幕基于ASP.NET Core的模块化设计: 虚拟文件系统简介创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样创建这样的模块化架…

[SDOI2012]吊灯(结论)

problem 洛谷链接 solution 显然&#xff0c;颜色相同的灯泡形成一个连通块&#xff0c;且连通块的大小 i∣ni\mid ni∣n。 这道题要能发现一个结论&#xff1a;一定至少存在一种颜色的连通块 满足该联通块内的任意一个节点 都不是异种颜色点 的父亲。 即&#xff0c;至少…

一文带你全面认识Excel催化剂系列功能

2018年1月1日决定打造一款Excel插件&#xff0c;取名为Excel催化剂&#xff0c;历时半年的时间&#xff0c;在努力打造出和传统插件有功能差异化的基础上&#xff0c;让大家可以真正得到一些有价值非鸡肋的功能&#xff0c;对开发什么样的功能也构思了许久&#xff0c;同时对免…

可持久化汇总(讲解+题目)

可持久化(一) 可持久化(二) 可持久化3–可持久化01Trie 可持久化4–可持久化并查集 各模块的例题都在各自讲解下面有写 下面是加强练习 练习题讲解——肖然老师的博客 练习题&#xff1a; P4137 Rmq Problem / mex P4587 [FJOI2016]神秘数 CF484E Sign on Fence CF1080F Katya …

[学习笔记] 乱世之神杀疯了 —— K-D tree

文章目录K-D tree建树合并插入删除查询(估价函数)旋转坐标系题目练习[SDOI2012]最近最远点对[Violet]天使玩偶/SJY摆棋子[CQOI2016]K远点对[国家集训队]JZPFARThe closest M points简单题巧克力王国[BOI2007]Mokia 摩基亚[CH弱省胡策R2]TATT[BZOJ3815]卡常数[NOI2019]弹跳A sim…

【春华秋实】.NET Core之只是多看了你一眼

技术学习是一件系统性的事情&#xff0c;如果拒绝学习&#xff0c;那么自己就会落后以至于被替代。.NET也是一样&#xff0c;当开源、跨平台成为主流的时候&#xff0c;如果再故步自封&#xff0c;等待.NET的就是死路一条&#xff0c;幸好.NET Core问世了&#xff0c;社区反响积…

[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架 题意&#xff1a; 一个R * C的矩阵&#xff0c;每个位置都有个数page[ij]&#xff0c;现在选定一个小矩阵范围(给左上角坐标&#xff0c;和右下角坐标)&#xff0c;问这个范围内的数总和是否大于h&#xff0c;如果大于h的话最少选几个数aij 对于50%的数…

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…

[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件&#xff1a; opopop 是一个满足结合律的二元运算&#xff0c;如 *&#xff0c;。GGG 是一个集合&#xff0c;存在单位元 eee。GGG 中所有元素都有逆元。即 GGG 对 opopop 运算封闭&#xff0c;封闭简单…

P2469 [SDOI2010]星际竞速

P2469 [SDOI2010]星际竞速 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;边是单向边(只能从小编号点到大编号点)&#xff0c;你也可以花费ai直接到达点i。问将1~n所有点都经过一边最小费用是多少&#xff1f; 题解&#xff1a; 最小费用最大流&#xff0c;网络流…

为什么从前那些.NET开发者都不写单元测试呢?

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

git 命令的使用

git 各个命令的详细使用方法参考git-docs。 Table of Contents git Table of Contents add archive blame branch checkout cherry-pick clone commit config diff fetch for-each-ref github init log & show merge mv pull push rebase remote r…

求和(莫比乌斯反演)

由于找不到提交网站&#xff0c;所以不保证正确性哦~ problem 已知积性函数 F(1)1&#xff0c;F(pk)pk1F(1)1&#xff0c;F(p^k)p^k1F(1)1&#xff0c;F(pk)pk1。&#xff08;ppp为质数&#xff0c;k∈Zk∈Z^k∈Z&#xff09; 给定 nnn&#xff0c;求 ∑i1nF(i)\sum_{i1}^n F…

P2467 [SDOI2010]地精部落

P2467 [SDOI2010]地精部落 题意&#xff1a; 有n个山脉高度分别是1到n&#xff0c;现在让你按照山峰山谷的顺序依次摆放(第一个可以是山峰也可以是山谷)&#xff0c;问有多少方案(答案mod p) 题解&#xff1a; dp&#xff0c;但是自己推不出来 这个博客讲的非常详细&#x…

使用 xUnit 编写 ASP.NET Core 单元测试

还记得 .NET Framework 的 ASP.NET WebForm 吗&#xff1f;那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训&#xff0c;在设计上考虑到了可测试性&#xff0c;就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入…

[刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新

文章目录信息汇总表格飞行员配对方案问题分配问题运输问题数字梯形问题最小路径覆盖问题魔术球问题圆桌问题试题库问题深海机器人问题航空路线问题火星探险问题太空飞行计划问题方格取数问题骑士共存问题最长不下降子序列问题孤岛营救问题汽车加油行驶问题[CTSC1999]家园 / 星际…

2021牛客暑期多校训练营5

2021牛客暑期多校训练营5 题号题目知识点AAway from CollegeBBoxes概率CCheating and StealingDDouble Strings线性dpEEert EsiwtibFFinding PointsGGreater Integer, Better LCMHHolding Two签到IInterval QueriesJJewels最小权匹配KKing of Range尺取法

记录使用 Cake 进行构建并制作 nuget 包

前段时间折腾了一下&#xff0c;总算是把我自己的图片缓存控件&#xff08;https://github.com/h82258652/HN.Controls.ImageEx&#xff09;发布到了 nuget 上&#xff0c;目前已经进入一个比较稳定的版本了&#xff0c;基本没有很严重的 bug 了。其实核心代码早就写完了&#…

2021牛客暑期多校训练营6

题号题目知识点AContracting Convex HullBDefend PonyvilleCDelete EdgesDGambling MonsterEGrowing TreeFHamburger SteakGHasse DiagramHHopping RabbitIIntervals on the RingJDefend Your CountryKStarch Cat