从中间件排除路由-.net核心

时间:2018-09-15 19:01:56

标签: c# asp.net-core .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();       
}

但这不起作用。

3 个答案:

答案 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));
    }
}