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