web-dev-qa-db-ja.com

asp.netコアミドルウェアのMapとMapWhenブランチの違いは?

リクエストの認証中に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("");
        });

    });
}
7
Saineshwar

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ブランチを使用する場合」という質問に答える:リクエストパスのみに基づいてリクエストをブランチする場合は、Mapを使用します。 HTTPリクエストの他のデータに基づいてリクエストを分岐する場合は、MapWhenを使用します。

13
CodeFuller

受け入れられた答えは役に立ちますが、完全に正確ではありません。述語論理とは別に、MapMapWhenの主な違いは、Mapがパイプラインに MapMiddleware を追加することです( ここを参照) )、MapWhenはパイプラインに MapWhenMiddleware を追加します( ここ を参照)。この効果は、MapRequest.PathRequest.PathBaseを更新して、パスに基づく分岐を考慮します(Request.Pathから一致したパスセグメントをトリミングしてRequest.PathBaseに追加します)が、一見同等のMapWnen述語はしません。これは、ルーティングなど、パスを使用するダウンストリームに影響します。

6
Alex Lorimer