ASP.NET Core3.X 终端中间件转换为端点路由运行
引言
前几天.NET Core3.1发布,于是我把公司一个基础通用系统升级了,同时删除了几个基础模块当然这几个基础模块与.NET Core3.1无关,其中包括了支付模块,升级完后静文(同事)问我你把支付删除了啊?我说是啊,没考虑好怎么加上(感觉目前不太好,我需要重新设计一下)。
故事从这开始
考虑支付的时候我考虑的是将支付sdk如何直接引入到系统,以及可以有一系列支付的路由,我需要考虑的是如果创建响应给指定的地址,so我开始想如何达到我的目的自定义个中间件,Use、Run、Map???
路由的进阶
路由负责将请求 URI 映射到终结点并向这些终结点调度传入的请求。 路由在应用中定义,并在应用启动时进行配置。 路由可以选择从请求包含的 URL 中提取值,然后这些值便可用于处理请求。 通过使用应用中的路由信息,路由还能生成映射到终结点的 URL。
在ASP.NET Core 2.1和更低版本中,路由是通过实现将IRouter传入的URL映射到处理程序的接口来处理的。通常,将直接依赖MvcMiddleware添加到中间件管道末端的实现,而不是直接实现该接口。一旦请求到达MvcMiddleware,便会应用路由来确定传入请求URL路径所对应的控制器和操作。
然后,该请求在执行处理程序之前经过了各种MVC筛选器。这些过滤器形成了另一条“管道”,让人联想到中间件管道,并且在某些情况下必须复制某些中间件的行为。一个典型的例子就是CORS政策。为了对每个MVC操作以及中间件管道的其他“分支”实施不同的CORS策略,内部需要进行一定程度的重复。
“分支”中间件管道通常用于“伪路由”。如Map()在中间件管道中的扩展方法,将允许您在传入路径具有给定前缀时有条件地执行某些中间件。
如下所示:
app.Map("/order", app => app.Run(async context =>
{
await context.Response.WriteAsync("Order");
})
);
在这种情况下,该Run()方法是“终端”中间件,因为它返回响应。但是从某种意义上说,整个Map分支对应于应用程序的“端点”.
在ASP.NET Core 2.2中,引入了终结点路由作为MVC控制器的新路由机制。此实现本质上是的内部实现MvcMiddleware .
在ASP.NET Core 2.x中使用Map()
下面我们自定义一个中间件,该中间件返回直接返回一个相应而不是继续往下执行调用_next委托,一个很基本的中间件。
public class ApiEndpointMiddleware
{
private readonly RequestDelegate _next;
public ApiEndpointMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
context.Response.StatusCode = 200;
await context.Response.WriteAsync("Order");
}
}
在ASP.NET Core 2.x中,可以通过使用扩展方法指定路由访问该中间件,从而将其包含在Startup.cs的中间件管道中
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.Map("/order", app => app.UseMiddleware<ApiEndpointMiddleware>()); versionApp.UseMiddleware<VersionMiddleware>());
app.UseMvcWithDefaultRoute();
}
当我们访问 /order 或者 /order/1 路由都会得到自定义中间件返回的相应。
将中间件转换为端点路由
在ASP.NET Core 3.0中,我们使用端点路由,因此路由步骤与端点的调用是分开的。实际上,这意味着我们有两个中间件:
- EndpointRoutingMiddleware 实际的路由,即计算将为指定的请求URL路径调用哪个端点。
- EndpointMiddleware 所有调用的端点。
它们在中间件管道中的两个不同点处添加,因为它们起着两个不同的作用。一般而言,我们想的是路由中间件提前在管道中,以便后续的中间件可以访问有关将执行的端点的信息。端点的调用应在管道的末端进行。
如下所示:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
该UseRouting()扩展方法添加EndpointRoutingMiddleware到管道,同时将UseEndpoints()扩展方法添加EndpointMiddleware到管道。UseEndpoints()实际上为应用程序注册所有端点的位置。
那么如何将我们自定义中间件使用端点路由来映射呢?
从概念上讲,我们UseEndpoints()使用/OrderURL作为匹配的路径,将“order”端点的注册移动到调用中:
endpoints.MapControllers();
endpoints.Map("/order",endpoints.CreateApplicationBuilder()
.UseMiddleware<ApiEndpointMiddleware>().Build()).WithDisplayName("order-api");
在我们上面针对ASP.NET Core 2.x的实现中,我们将匹配/order,/order/123等端点路由
例如:
endpoints.Map("/order/{action}",null);
这将同时匹配 /order /order/1,但不匹配/order/status/1。它比以前的版本功能强大得多.
在上一个示例中,我们提供了一个显示名称(主要用于调试目的),但是我们可以附加其他的信息,例如授权策略或CORS策略,其他中间件可以查询这些信息。例如:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.Map("/order/{action}",endpoints.CreateApplicationBuilder()
.UseMiddleware<ApiEndpointMiddleware>().Build()).WithDisplayName("order-api").RequireCors("AllowAllHosts")
.RequireAuthorization("AdminOnly");
});
我们向端点添加了CORS策略(AllowAllHosts)和授权策略(AdminOnly)。当到达端点的请求到达时,并在执行端点之前采取相应的措施。
参考
ASP.NET Core3.X 终端中间件转换为端点路由运行的更多相关文章
- ASP.NET Core 3.x 中间件流程与路由体系
中间件分类 ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源
配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端
配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...
- 探索Asp net core3中的 项目文件、Program.cs和通用host(译)
引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...
- ASP.NET Core端点路由 作用原理
端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民. Endpoint Routing的动机 在端点路由出现之前,我们 ...
- ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
- asp.net core 系列 15 中间件
一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件. 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作. 请求委托用于 ...
- ASP.NET Core 3.1 中间件
参考微软官方文档 : https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 ...
随机推荐
- SpringBoot正确打日志的姿势
前篇 Spring Boot 日志处理你还在用Logback? 本文简介 前篇侧重 Log4j2 的配置,本篇侧重统一日志处理的应用,以下包含 HTTP 请求的日志处理.Exception 异常日志处 ...
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- 7.30 NOIP模拟10
T1.辣鸡 考试的时候竟然被我以“麻烦”弃掉了,赛后发现这题好水啊,直接sort一下寻找四周即可. T2.模板 考试时期望得分70,实际得分5 首先看到这种题基本就是线段树,我们以时间为下标,对每一个 ...
- 零基础Linux入门之《Linux就该这么学》
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- Mac中的Python安装selenium,结合chrom及chromdriver使用
一.安装selenium 1.在终端通过命令安装 pip3 install -U selenium 二.准备环境 1.在电脑中安装谷歌浏览器chrom,和下载估计浏览器驱动chromdriver,以下 ...
- mjpg-stream 视频服务 (1)| 简介与配置树莓派使用
源码地址为:https://github.com/jacksonliam/mjpg-streamer Mjpg简介: (1)mjpg-streamer是一个命令行应用程序,它将JPEG帧从一个或多个输 ...
- TensorFlow2.0(10):加载自定义图片数据集到Dataset
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 微信小程序api封装(promise)
顺带这是我平时公司切换改变网络环境 直接上代码,我相信就可以懂了, //app.js function fetchApi(url, type, params, method) { return new ...
- 【笔记】vue和ssm开发接口联调跨域问题
爬了两个小时的大坑 前端在github上拉了个vue项目,由于从来没正式学过vue,跨域这个问题一直困扰了很久. 目前暂时能用的解决方案(开发环境)就是: 前端在vue.config.js中加入代理. ...
- nyoj 244-16进制的简单运算 (scanf("%x%c%x", &a, &b, &c); printf("%o", a ± b))
244-16进制的简单运算 内存限制:64MB 时间限制:1000ms 特判: No 通过数:12 提交数:13 难度:1 题目描述: 现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结 ...