webapi中间件没有使用终结点中间件时的注意事项
最小webapi
最小webapi默认的中间件配置是这样的
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
最小webapi没有使用app.UseRouting()和app.UseEndpoints。
这种情况下我们添加的所有中间件其实都是位于终结点路由中间件EndpointRoutingMiddleware和终结点中间件EndpointMiddleware之间的中间件。
也就是说这些中间件全都执行了之后,Action才会执行。
加入我们写了一个自定义404页面的中间件,并把它注册进去。
app.Use(async (context, next) =>
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.WriteAsync("来到了知识的荒原");
await next(context);
});
这个中间件不会以我们预料的方式运行,他会在每次请求中都被调用,而不是找不到路由时才调用。
就是因为没有注册app.UseEndpoints的终结点中间件时,不存在终结点之后的中间件。而终结点之后的中间件才会在找不到路由,找不到终结点时被调用。
终结点中间件应该是在找到了终结点时会短路管道,找不到时调用next(context)。
所以我们必须显式调用app.UseEndpoints,然后再到后面再注册我们的404中间件。这才会达到我们的预期。
必须注意的的是如果app.UseEndpoints被调用,那么app.UseRouting()也必须被调用。
所以这种情况下正确的写法是
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.UseEndpoints(endpoints=>{});
app.Use(async (context, next) =>
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.WriteAsync("来到了知识的荒原");
await next(context);
});
app.Run();
检验
我们可以取一下终结点信息看看是不是这样
app.Use(async (context, next) =>
{
var endpoint = context.GetEndpoint();
await next(context);
});
把这个中间件添加到app.UseRouting()之前,app.UseRouting()之后,再加一个到app.UseEndpoints之后。
我们能发现只有再app.UseRouting()和app.UseRouting()之间的那个中间件才能取到终结点信息,其他的两个里面终结点endpoint = null
MSDN
最小webapi中的默认情况下,我们的中间件就在图中Custom middlewares的地方。我们改了之后就能同时在Endpoint之后加中间件了。
webapi中间件没有使用终结点中间件时的注意事项的更多相关文章
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- 自定义Django中间件(登录验证中间件实例)
前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- express中的中间件(middleware)、自定义中间件、静态文件中间件、路由中间件
express文档地址 什么是中间件呢(middleware)?它是谁的中间件呢? 首先我们需要了解到请求和响应, 请求就是客户端发送请求给服务器, 响应就是,服务器根据客户端的请求返回给客户端的数据 ...
- 什么是django中间件?(七个中间件-自定义中间件)
目录 一:django中间件 1.什么是django中间件 2.django请求生命周期流程图 二:django自带七个中间件 1.研究django中间件代码规律 2.django支持程序员自定义中间 ...
- Python:list 和 array的对比以及转换时的注意事项
Python:list 和 array的对比以及转换时的注意事项 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-6-4 ...
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...
- SSH框架整合jar包时的注意事项
SSH框架整合jar包时的注意事项: 在将三个框架所需的jar整合到一起后,要看一下有没有相同类型但是版本不同的jar包,如果有的话,需要把低版本的jar包删除掉,否则会报错.我这里整合的时候java ...
- No known class method for selector 'setImage:andName:'错误分析.//删除.h与.m文件时的注意事项
CHENYILONG Blog No known class method for selector 'setImage:andName:'错误分析.//删除.h与.m文件时的注意事项 ...
- 在win7系统上搭建django+oracle 11g时,注意事项
在win7系统上搭建django+oracle 11g时,注意事项[示例用的是python 2.7]: 重要:python.oracle.oracle client这三个的OS bit 一定一定要相同 ...
随机推荐
- OpenAtom OpenHarmony分论坛,今天14:00见!附大事记精彩发布
2022开放原子全球开源峰会 OpenAtom OpenHarmony分论坛 万物互联,使能千行百业 整装待发!精彩今日揭晓与您相约7月27日 14:00
- 如何保存/同步多架构容器 Docker 镜像
前言 随着容器.芯片技术的进一步发展,以及绿色.节能.信创等方面的要求,多 CPU 架构的场景越来越常见.典型的应用场景包括: 信创:x86 服务器 + 鲲鹏 ARM 等信创服务器: 个人电脑:苹果 ...
- sql 语句系列(月份的第一天和最后一天)[八百章之第二十章]
前言 插播一个,从给定日期值里面提取年月日时分秒. 之所以写这个是因为使用频率太高. mysql: select DATE_FORMAT(CURRENT_TIMESTAMP,'%k') hr, DAT ...
- mysql 在c# EF 中无法生成对象
正文 1. 创建个vs2013项目,导入EntityFramework.dll. MySql.Data.dll. MySql.Data.Entity.EF6.dll 2. 工具 -> 扩展和更新 ...
- ARMS实践|日志在可观测场景下的应用
简介: 在实际生产中,通过灵活组合文内几种使用方式,运维团队可以很好地排除日常观测.故障定位过程中的干扰因素,更快的定界甚至定位问题根因. 作者:陈陈 日志在可观测场景下的应用 随着 IT 架 ...
- 测试环境不稳定&复杂的必然性及其对策
简介: 为什么测试环境的不稳定是必然的,怎么让它尽量稳定一点?为什么测试环境比生产环境更复杂,怎么让它尽量简单一点?本文将就这两点进行分享.同时,还会谈一谈对测试环境和生产环境的区别的理解. 作者 | ...
- 怀里橘猫柴犬,掌上代码江湖——对话阿里云 MVP郭旭东
简介: 跟郭旭东聊过之后,我对程序员的敬佩又多一分.这个92年的开发者,难能可贵地兼备朝气蓬勃的技术能量与长远深刻的行业洞见.独自承担DevOps平台从0到1的所有工作,我打趣说超级开发者不过如此,他 ...
- 终于要跟大家见面了,Flink 面试指南
面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂.但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒? 之前社区帮大家汇总了目前 ...
- 滴滴 Flink-1.10 升级之路
简介: 滴滴实时计算引擎从 Flink-1.4 无缝升级到 Flink-1.10 版本,做到了完全对用户透明.并且在新版本的指标.调度.SQL 引擎等进行了一些优化,在性能和易用性上相较旧版本都有很大 ...
- 技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘
简介: 阿里云RDS PostgreSQL是一款兼容开源PostgreSQL的全托管云数据库产品,自2015年首次发布以来,根据用户需求不断升级迭代,已支持9.4.10.11.12等多个版本,覆盖了高 ...