我在应用程序中有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();
}
但这不起作用。
答案 0 :(得分:3)
您可以将MapWhen
扩展方法与否定谓词一起使用:
app.MapWhen(
httpContext => !httpContext.Request.Path.StartsWithSegments("/pathtoexclude"),
subApp => subApp.UseMyMiddleware()
);
答案 1 :(得分:1)
对于中间件,应该使用app.UseWhen
而不是app.MapWhen
,因为MapWhen
终止了管道。我是尝试使用其他答案的艰难方法。
已经有一段时间了,但是由于我偶然发现了其他人,也可能会。因此,以您的示例为例: 公共无效的Configure(IApplicationBuilder应用程序,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();
}
答案 2 :(得分:1)
对此处出色答案的简单调整可能是根据请求做出应用配置决定。就我而言,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));
}
}