Регистрация промежуточного программного обеспечения при использовании MapWhen для ветвления, чтобы запустить его только для набора конечных точек - PullRequest
1 голос
/ 19 апреля 2020

Мне нужно запустить два промежуточных ПО для всех моих конечных точек, но те, которые находятся в /accounts/*.

Я использую это в ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddControllers();
}

, и метод настройки выглядит следующим образом:

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();
    });

 }

Но я получаю следующую ошибку:

System.InvalidOperationException: запрос достиг конца конвейера без выполнения конечной точки: 'WebAPI.Controllers.VehiclesController .Get (WebApi) '. Пожалуйста, зарегистрируйте EndpointMiddleware, используя 'IApplicationBuilder.UseEndpoints (...)' при использовании маршрутизации.

Из ошибки я понимаю, что должен использовать UseEndpoints вместо UseMiddleware в методе MapWhen, но не могу сделайте все правильно.

Как мне зарегистрировать промежуточное программное обеспечение?

1 Ответ

0 голосов
/ 19 апреля 2020

Похоже, вам нужно UseWhen, которое в соответствии с документами :

... разветвляет конвейер запроса на основе результат данного предиката. В отличие от MapWhen, эта ветвь присоединяется к основному конвейеру, если она не закорачивается или не содержит промежуточное программное обеспечение терминала

Поскольку вы используете MapWhen, оба UseAuthorization и UseEndpoints не влияет на ваши /accounts/ пути. Ошибка, которую вы показали, заключается в том, что промежуточное программное обеспечение конечных точек не работает в этом сценарии.

...