在使用 MapWhen 进行分支时注册中间件,以便仅为一组端点运行它

Not*_*bad 4 c# asp.net-core asp.net-core-middleware

我需要为我的所有端点运行两个中间件,但 /accounts/* 下的那些。

我在 ConfigureServices 中使用它:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddControllers();
}
Run Code Online (Sandbox Code Playgroud)

和配置方法看起来像:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IUserService  userService)
{
    app.UseCors(builder => builder
        //.AllowAnyOrigin()
        .SetIsOriginAllowed((host) => true)
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());

    app.UseRouting();

    app.UseAuthentication();

    //THIS IS WHAT I JUST ADDED TO SUPPORT THE BRANCHING OF ROUTES
    app.MapWhen(context =>
    {
        return !context.Request.Path.StartsWithSegments("/accounts");
    }, appBuilder =>
    {
        appBuilder.UseMiddleware<TenantProviderMiddleware>();
        appBuilder.UseMiddleware<UserClaimsBuilderMiddleware>();
    });

    //app.UseMiddleware<TenantProviderMiddleware>();
    //app.UseMiddleware<UserClaimsBuilderMiddleware>();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<VehicleHub>("/vehicle-hub");
        endpoints.MapControllers();
    });

 }
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

System.InvalidOperationException:请求到达管道末端,但未执行端点:'WebAPI.Controllers.VehiclesController.Get (WebApi)'。如果使用路由,请使用“IApplicationBuilder.UseEndpoints(...)”注册 EndpointMiddleware。

从错误中我明白我应该在 MapWhen 方法中使用 UseEndpoints 而不是 UseMiddleware 但无法正确使用。

那么我应该如何注册中间件?

Kir*_*kin 7

看起来你需要UseWhen,根据文档

...根据给定谓词的结果分支请求管道。与 with 不同MapWhen,如果此分支不短路或不包含终端中间件,则会重新加入主管道

因为您正在使用MapWhen,UseAuthorization并且UseEndpoints对您的/accounts/路径没有影响。您显示的错误是因为 Endpoints 中间件没有在这种情况下运行。