Asp.net core asp.net核心中间件中Map和MapWhen分支的区别?

Asp.net core asp.net核心中间件中Map和MapWhen分支的区别?,asp.net-core,asp.net-core-middleware,Asp.net Core,Asp.net Core Middleware,在验证请求时,何时在asp.net核心中间件中使用Map和MapWhen分支 public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境) { app.Map(“,(appBuilder)=> { appBuilder.Run(异步(上下文)=>{ wait context.Response.WriteAsync(“”); }); }); app.MapWhen(context=>context.Request.Query.Contai

在验证请求时,何时在asp.net核心中间件中使用Map和MapWhen分支

public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
app.Map(“,(appBuilder)=>
{
appBuilder.Run(异步(上下文)=>{
wait context.Response.WriteAsync(“”);
});
});
app.MapWhen(context=>context.Request.Query.ContainsKey(“”),(appBuilder)=>
{
appBuilder.Run(异步(上下文)=>
{
wait context.Response.WriteAsync(“”);
});
});
}

Map
只能基于指定请求路径的匹配对请求进行分支
MapWhen
功能更强大,允许根据使用当前
HttpContext
对象操作的指定谓词的结果对请求进行分支。 由于
HttpContext
包含有关HTTP请求的所有信息,
MapWhen
允许您使用非常特定的条件来分支请求管道

任何
Map
调用都可以在
时轻松转换为
Map,但反之亦然。例如,此
Map
调用:

app.Map("SomePathMatch", (appBuilder) =>
{
    appBuilder.Run(async (context) => {

        await context.Response.WriteAsync("");
    });
});
app.MapWhen(context => context.Request.Path.StartsWithSegments("SomePathMatch"), (appBuilder) =>
{
    appBuilder.Run(async (context) =>
    {
        await context.Response.WriteAsync("");
    });
});
相当于以下调用时的
MapWhen
call:

app.Map("SomePathMatch", (appBuilder) =>
{
    appBuilder.Run(async (context) => {

        await context.Response.WriteAsync("");
    });
});
app.MapWhen(context => context.Request.Path.StartsWithSegments("SomePathMatch"), (appBuilder) =>
{
    appBuilder.Run(async (context) =>
    {
        await context.Response.WriteAsync("");
    });
});

因此,回答您的问题“何时使用Map和mapawhen branch”:当您仅基于请求路径对请求进行分支时,请使用
Map
。当您根据HTTP请求中的其他数据对请求进行分支时,请使用
MapWhen

接受的答案很有用,但并不完全准确。除了谓词逻辑之外,
Map
MapWhen
之间的主要区别在于
Map
将添加到管道中(请参阅),而
MapWhen
将添加到管道中(请参阅)。这样做的效果是,
Map
将更新
Request.Path
Request.PathBase
,以说明基于路径的分支(将匹配的路径段修剪掉
Request.Path
,并将其附加到
Request.PathBase
),而看似等价的
MapWnen
谓词则不会。这会影响使用路径的任何下游,例如路由

这应该是公认的答案。如果映射中的中间件需要路径的第一部分,则尤其如此。例如,如果
UseMvc()
需要路由中的前缀
/api
app.Map(“/api”,builder=>builder.UseMvc())
将不起作用。相反,最好使用
app.UseWhen(context=>context.Request.Path.StartsWithSegments(“/api”),…)
CodeFuller这并不完全正确,请参阅下面@alex lorimer的回答,并在我的评论中举例说明。