ASP.NET Core 5中UseWhen与MapWhen的差异及实际运行疑问
ASP.NET Core MapWhen与UseWhen行为疑问解答
核心原理澄清
你对两个分支中间件的默认行为的认知存在一个前提遗漏:MapWhen并不是天生就会短路管道不回到主分支,这个特性是有触发条件的。
- UseWhen的设计逻辑:断言匹配时,将分支管道插入当前执行点,分支执行完成后强制回到主管道执行后续中间件,和分支内是否调用next无关。
- MapWhen的设计逻辑:断言匹配时,进入分支管道执行,只有当分支管道的最后一个中间件没有调用next()时,才会短路管道不回到主分支,如果分支内显式调用了next,就会正常流转回主管道的后续逻辑。
现象原因说明
你提供的HandleBranch方法中,自定义中间件显式调用了await next.Invoke(),这里的next指向的就是分支管道末端连接主管道的入口,所以无论你把这个方法注册给UseWhen还是MapWhen,只要断言命中,执行完分支逻辑后都会继续走主管道的后续中间件,最终执行结果自然完全一致。
正确复现差异的方式
如果要验证MapWhen的默认短路行为,只需要把分支中间件改成不调用next的短路实现即可,示例如下:
private void HandleBranch(IApplicationBuilder app, ILogger<Startup> logger) { app.Run(async (context) => { logger.LogInformation("分支中间件执行"); await context.Response.WriteAsync("分支直接返回结果"); }); }
此时再次测试就能看到明显差异:
- UseWhen场景下,分支返回响应后,仍然会执行主管道后续的中间件(如果后续中间件尝试修改已发送的响应,会抛出响应已启动的异常)
- MapWhen场景下,分支执行完成后直接结束请求管道,不会回到主管道执行后续中间件。
内容的提问来源于stack exchange,提问作者Swanand Pangam
相关产品推荐
相关产品推荐

