从中间件中排除路由 - .net core

Thu*_*olt 3 c# .net-core asp.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();
}
Run Code Online (Sandbox Code Playgroud)

而配置方法是

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseRouter(BuildRouter(app));

    app.UseHttpsRedirection();
    app.UseMvc();       
}
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。

vgd*_*999 13

对于中间件,您应该使用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();       
}
Run Code Online (Sandbox Code Playgroud)


Kal*_*ten 7

您可以使用MapWhen带有否定谓词的扩展方法:

app.MapWhen(
    httpContext => !httpContext.Request.Path.StartsWithSegments("/pathtoexclude"),
    subApp => subApp.UseMyMiddleware()
);
Run Code Online (Sandbox Code Playgroud)

注意MapWhen将终止管道,因此如果您希望管道在此之后继续,您可以app.UseWhen改用。