リクエストの認証中に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("");
});
});
したがって、「MapとMapWhenブランチを使用する場合」という質問に答える:リクエストパスのみに基づいてリクエストをブランチする場合は、Map
を使用します。 HTTPリクエストの他のデータに基づいてリクエストを分岐する場合は、MapWhen
を使用します。
受け入れられた答えは役に立ちますが、完全に正確ではありません。述語論理とは別に、Map
とMapWhen
の主な違いは、Map
がパイプラインに MapMiddleware を追加することです( ここを参照) )、MapWhen
はパイプラインに MapWhenMiddleware を追加します( ここ を参照)。この効果は、Map
がRequest.Path
とRequest.PathBase
を更新して、パスに基づく分岐を考慮します(Request.Path
から一致したパスセグメントをトリミングしてRequest.PathBase
に追加します)が、一見同等のMapWnen
述語はしません。これは、ルーティングなど、パスを使用するダウンストリームに影響します。