Короткий ответ :
Да.Это будет работать, как вы ожидали.
На самом деле, когда мы 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.