[英]Exclude route from middleware - .net core
我在應用程序中有 2 個中間件。 我想從這些中間件中排除一條路線。 我嘗試過的是創建一個 BuildRouter 函數並通過它應用中間件,但這不起作用。
public IRouter BuildRouter(IApplicationBuilder applicationBuilder)
{
var builder = new RouteBuilder(applicationBuilder);
builder.MapMiddlewareRoute("/api/", appBuilder => {
appBuilder.ApplyKeyValidation();
appBuilder.ApplyPolicyValidation();
});
return builder.Build();
}
而配置方法是
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseRouter(BuildRouter(app));
app.UseHttpsRedirection();
app.UseMvc();
}
但這是行不通的。
您可以使用帶有否定謂詞的MapWhen
擴展方法:
app.MapWhen(
httpContext => !httpContext.Request.Path.StartsWithSegments("/pathtoexclude"),
subApp => subApp.UseMyMiddleware()
);
注意: MapWhen
將終止管道,因此如果您希望管道在此之后繼續,您可以改用app.UseWhen
。
對於中間件,你應該使用app.UseWhen
而不是app.MapWhen
因為MapWhen
終止管道。 我在嘗試使用其他答案時艱難地學到了這一點。
已經有一段時間了,但既然我偶然發現了這個,其他人也可能如此。 因此,對於您的示例: public void Configure(IApplicationBuilder app, IHostingEnvironment env)
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseWhen(
context => !context.Request.Path.StartsWithSegments("/api"),
appBuilder =>
{
appBuilder.ApplyKeyValidation();
appBuilder.ApplyPolicyValidation();
}
);
app.UseHttpsRedirection();
app.UseMvc();
}
對這里精彩答案的簡單改編可能是根據請求做出應用程序配置決策。 就我而言,Blazor 的后備頁面似乎正在處理對 Swagger 和 Hangfire 等中間件的所有請求。
有條件地調用endpoints.MapFallbackToPage("/_Host");
將為通過以/api
開頭的路由訪問的所有中間件恢復默認支持。 下面是一個簡化的例子:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) => ConfigureServer(app, env);
void ConfigureServer(IApplicationBuilder app, IWebHostEnvironment env, bool isApiBound = true)
{
//...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
if (!isApiBound)
{
endpoints.MapRazorPages();
endpoints.MapFallbackToPage("/_Host");
}
});
//...
if (isApiBound)
{
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"),
builder => ConfigureServer(builder, env, false));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.