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

时间:2017-12-27 18:41:00

标签: asp.net-core 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("");
            });

        });
    }

2 个答案:

答案 0 :(得分:9)

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("");
    });
});

回答您的问题"何时使用Map和MapWhen branch":当您仅根据请求路径分支请求时使用Map。根据HTTP请求中的其他数据分支请求时,请使用MapWhen

答案 1 :(得分:1)

可接受的答案很有帮助,但并不完全准确。除了谓词逻辑外,MapMapWhen之间的主要区别在于MapMapMiddleware添加到管道中(请参见here),而{{1 }}将MapWhenMiddleware添加到管道中(请参见here)。这样做的效果是MapWhen将更新MapRequest.Path以考虑基于路径的分支(将匹配的路径段从Request.PathBase删除,并将其附加到{{ 1}}),而看似等效的Request.Path谓词则不会。这会影响任何使用该路径的下游,例如路由!