是否存在app.UseWhenElse()替代方案?避免重复调用判断方法
解决方案:自行实现
UseWhenElse扩展方法 ASP.NET Core原生确实没有UseWhenElse方法,但自行实现它完全合理,不属于重复造轮子——因为原生UseWhen仅覆盖了条件为真的分支场景,而你的需求(一次性判断条件并处理两个分支)是原生功能的合理补充,且能避免条件方法被重复执行的问题。
实现代码
创建一个针对IApplicationBuilder的扩展方法,内部一次性判断条件后路由到对应的分支管道:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using System.Threading.Tasks; public static class ApplicationBuilderExtensions { public static IApplicationBuilder UseWhenElse( this IApplicationBuilder app, Func<HttpContext, bool> condition, Action<IApplicationBuilder> configureWhenTrue, Action<IApplicationBuilder> configureWhenFalse) { // 分别构建两个分支的中间件管道 var truePipeline = app.New(); configureWhenTrue(truePipeline); var trueBranch = truePipeline.Build(); var falsePipeline = app.New(); configureWhenFalse(falsePipeline); var falseBranch = falsePipeline.Build(); // 添加核心中间件,一次性判断条件后执行对应分支 return app.Use(async (context, next) => { bool conditionResult = condition(context); if (conditionResult) { await trueBranch(context); } else { await falseBranch(context); } // 执行后续中间件(与原生UseWhen行为保持一致) await next(); }); } }
使用方式
完全符合你理想中的用法:
app.UseWhenElse( context => context.Condition(), applicationBuilder => { /* 条件为true时的中间件配置 */ }, applicationBuilder => { /* 条件为false时的中间件配置 */ } );
优势说明
- 避免重复执行条件方法:仅在中间件内部执行一次
condition(context),解决了原写法中条件方法被调用两次的问题。 - 与原生行为对齐:保留了
UseWhen的核心特性——分支管道执行完成后会继续执行后续中间件(若不需要此行为,可移除await next();)。 - 代码更简洁:将两个分支的逻辑聚合在一处,比两次调用
UseWhen的写法更易读和维护。
内容的提问来源于stack exchange,提问作者Wim ten Brink
相关产品推荐
相关产品推荐

