1 回答
TA贡献1815条经验 获得超10个赞
简短的回答:
是的。它将按您的预期工作。
实际上,当我们Use()一系列中间件的时候,我们就是在注册一系列中间件,这些中间件在处理请求时会依次调用。
该MapWhen()方法只不过是调用Use(). 什么MapWhen(predicate,configFn)是注册运行如下的东西:
if (predicate(context)){
await branch(context);
} else {
await _next(context);
}
结果,当我们调用 时MapWhen(),我们正在注册另一个分支处理的中间件。
例如 :
app.UseMiddleware<AlwaysUseThisMiddleware>();
app.MapWhen(ctx=>ctx.Request.Query["a"]=="1", appBuilder =>{
appBuilder.UseMiddleware<SometimesUseThisOne>();
});
app.MapWhen(ctx=>ctx.Request.Query["b"]=="1", appBuilder =>{
appBuilder.UseMiddleware<SometimesUseThisOtherOne>();
})
// ...
基本上,此代码以以下方式运行:
call `AlwaysUseThisMiddleware`;
////////////////////////////////////
if (ctx.Request.Query["a"]=="1"){
call SometimesUseThisOne ;
} else {
//------------------------------------------
if (ctx.Request.Query["b"]=="1"){
call SometimesUseThisOtherOne ;
} else {
//##################################################
await _next(context); // call other middlewares ...
//##################################################
}
//-----------------------------------------
}
////////////////////////////////////
或者,如果您愿意,也可以将其重写如下:
call `AlwaysUseThisMiddleware` middleware
if(ctx.Request.Query["a"]=="1") // go to branch 1
call `SometimesUseThisOne` middleware
else if (ctx.Request.Query["b"]=="1") // go to branch 2
call `SometimesUseThisOtherOne` middleware
else :
...
注意这里是一个分支else if而不是if. 并且中间件AlwaysUseThisMiddleware 总是在 branch1 & branch2 之前调用。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
