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

difference between Map and MapWhen branch in asp.net core Middleware?

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Map("", (appBuilder) =>
    {
        appBuilder.Run(async (context) => {
            await context.Response.WriteAsync("");
        });
    });

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

    });
}

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

任何 Map 调用都可以轻松转换为 MapWhen,但反之则不然。例如这个 Map 调用:

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

        await context.Response.WriteAsync("");
    });
});

等同于下面的MapWhen调用:

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

所以回答你的问题"When to use Map and MapWhen branch":当你只根据请求路径分支请求时使用Map。当您根据来自 HTTP 请求的其他数据分支请求时使用 MapWhen

已接受的答案很有帮助,但并不完全准确。除了谓词逻辑之外,MapMapWhen 之间的主要区别在于 Map 将添加 MapMiddleware to the pipeline (see here), while MapWhen will add MapWhenMiddleware to the pipeline (see here)。这样做的效果是 Map 将更新 Request.PathRequest.PathBase 以说明基于路径的分支(修剪匹配的路径段 Request.Path 并将其附加到 Request.PathBase),而看似等价的 MapWhen 谓词则不会。这会影响使用该路径的任何下游,例如路由!