ASP.NET Core – Middleware
前言
MIddleware 就是中间件, ASP.NET Core 是用来处理 http request 的.
当 request 抵到 server 就进入了 Middleware pipe. 每个 pipe 会有不同职责 (比如验证 athen, autho, routing 等)
然后依据 request 的 information, 最终输出 response.
主要参考
执行顺序
一张图胜过千言万语.

Run
撇开 routing, razor pages 这些, 最简单的就是定义一个 Run, 它就可以处理所有的 request 了. 统统返回 Hello World text.
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
Run 属于 terminal middleware 终点站, 也就是说, 即便它后续还有其它的 Middleware 通通不会被执行了.
我们一般上很少会用这个.
Use
app.Use(async (context, next) =>
{
// do something before next
await next.Invoke();
// do something after next
});
Use 就是最常使用的 Middleware 了, 它可以是 terminal 也可以不是, 取决于你有没有调用 next.Invoke
比如 authen, 在 before next 之前就可以从 request 中获取 token 然后做验证. 如果失败就返回 401 成功就 next.
比如 压缩, 在 after next 的时候对 response 进行压缩.
UseWhen
UseWhen 就只是多了一个判断, 看要不要跑 Run 或 Use 而已.
常用的情况比如, WebAPI 和 Razor Page 都用同一个 Application 的话, 就可以通过 request starts with /api 来决定用什么配置 (比如 UseExceptionHandler)
app.UseWhen(context => context.Request.Query.ContainsKey("branch"), appBuilder =>
{
appBuilder.Use(async (context, next) =>
{
// do something before next
await next.Invoke();
// do something after next
});
});
还有一个叫 MapWhen 它和 UseWhen 的区别是它里面是 Run, 而 UseWhen 里面是 Use.
Middleware Pipe 之间沟通
middleware 要通信, 一般上会使用 Request Features, 类似全局变量吧.
context.Features.Set<string>("dada");
var value = context.Features.Get<string>();
注: 它是用类似作为 key 的哦,
Build-in Middleware

MVC and Razor Page

ASP.NET Core – Middleware的更多相关文章
- ASP.NET Core Middleware 抽丝剥茧
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道pipeline中用于处理请求和操作响应的组件. 每个组件是pipeline 中的一环. 自行决定是否将请求传递给下一 ...
- ASP.NET Core Middleware (转载)
What is Middleware? Put simply, you use middleware components to compose the functionality of your A ...
- Prerender Application Level Middleware - ASP.NET Core Middleware
In the previous post Use Prerender to improve AngularJS SEO, I have explained different solutions at ...
- [ASP.NET Core] Middleware
前言 本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 在ASP.NET Core ...
- ASP.NET Core Middleware管道介绍
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Use(async (context, ne ...
- 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...
- [转]Publishing and Running ASP.NET Core Applications with IIS
本文转自:https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications- ...
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...
- 极简版ASP.NET Core学习路径及教程
绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...
- asp.net core中写入自定义中间件
首先要明确什么是中间件?微软官方解释:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnet ...
随机推荐
- Swift开发基础05-可选项
可选项定义 可选项,一般也叫可选类型,它允许将值设置为nil 在类型名称后面加个问号? 来定义一个可选项 var name: String? = "Jack" name = nil ...
- Java21的虚拟线程Virtual Thread初体验
我们之前使用的是操作系统平台的线程,就称之为"系统线程"吧.虚拟线程是JDK维护的,原理跟WebFlux的底层实现差不多,都是工作线程分离. 要使用虚拟线程,需要使用JDK21以上 ...
- ECMAScript 是什么?
ECMAScript 是什么 简介 Ecma 标准定义了 ECMAScript 语言 ECMAScript 基于多种原始技术,最著名的是 JavaScript (Netscape) 和 JScript ...
- 【Java】Vue-Element-Admin 嵌入Druid监控面板
我看到若依做了Druid面板的嵌入,我自己的项目干脆也做一个 一.后台服务SpringBoot: Druid配置项: spring: datasource: url: jdbc:mysql://127 ...
- 【C】Re01
一.GCC分步编译 xxx.c文件经历的一系列编译过程: #include <stdio.h> int main() { printf("Hello, World!\n" ...
- 蔡磊公布渐冻症诊断报告 5月住进ICU一度考虑气切
原文地址: https://baijiahao.baidu.com/s?id=1801485780372006198
- 如何安装废弃版本的Jax —— pypi服务器上不保存的python包应该如何安装
python的公开扩展包的存储是在网站: http://pypi.org/ 一般情况下,这是没有问题的,但是对于一些更新版本比较多的扩展包就出现了问题,因为pypi的服务器对每个项目(扩展包)都是由存 ...
- (待续)【转载】 Deep Reinforcement Learning Doesn't Work Yet(这里有一篇深度强化学习劝退文)
原文: https://www.alexirpan.com/2018/02/14/rl-hard.html ============================================== ...
- 【金猿人物展】白鲸开源CEO郭炜:数据要素是未来数据“新能源”产业么?
纵观2023年中国数据行业发展与2024年数据产业趋势,就不得不提到2023年全年国家全年强调的数据要素的概念以及在2023年12月中国国家数据局等17个部门联合印发了<"数据要素×& ...
- 获取客户端真实IP备忘
出于安全考虑,近期在处理一个记录用户真实IP的需求.本来以为很简单,后来发现没有本来以为的简单.这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后, ...