Несколько шаблонов маршрутов контроллера с ядром asp.net 3 UseEndpoints - PullRequest
0 голосов
/ 07 ноября 2019

Я конвертирую приложение Asp.Net Core 2.2 Mvc в 3.0;когда я пытаюсь реорганизовать код для использования UseEndpoints вместо UseMvc, маршруты не распознаются.

Ниже приведен рабочий код файла startup.cs, использующий UseMvc

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/EventLog/Error");
            app.UseHsts();
        }

        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSession();
        app.UseRequestLocalization();
        app.UseAuthentication();

        app.UseMvc(endpoints =>
        {

            endpoints.MapRoute("Grid", "Grid/{action}/{view}",
                new
                {
                    Controller = "Grid",
                    Action = "View"
                });

            endpoints.MapRoute("default", "{controller=Portal}/{action=Index}/{id?}");
        });
    }
* 1005. * И это переработанный код для UseEndpoints
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/EventLog/Error");
            app.UseHsts();
        }

        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSession();
        app.UseRequestLocalization();
        app.UseAuthentication();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute("Grid", "Grid/{action}/{virtualAction}",
                new
                {
                    Controller = "Grid",
                    Action = "View"
                });

            endpoints.MapControllerRoute("default", "{controller=Portal}/{action=Index}/{id?}");
        });
    }

Когда я запускаю приложение с кодом UseEndpoints, я получаю сообщение об ошибке из своего пользовательского AuthorizationHandler, поскольку в httpContextAccessor.HttpContext.Request.RouteValues ​​нет значений. Если я удаляю код MapControllerRoute для маршрута Grid, маршруты по умолчанию будут работать с AuthorizationHandler. Можно ли использовать несколько шаблонов маршрутов контроллера при использовании UseEndpoints?

1 Ответ

0 голосов
/ 11 ноября 2019

Я попробовал ваш код в приведенном ниже примере, и он хорошо работает, чтобы получить значение IHttpContextAccessor:

1. Мой пользовательский обработчик авторизации

public class MinimumAgeRequirement : IAuthorizationRequirement
{
    public int MinimumAge { get; }

    public MinimumAgeRequirement(int minimumAge)
    {
        MinimumAge = minimumAge;
    }
}

public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
{
    IHttpContextAccessor _httpContextAccessor = null;

    public MinimumAgeHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   MinimumAgeRequirement requirement)
    {
        var data = _httpContextAccessor.HttpContext.Request.RouteValues;
        //...
    }
}

2.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
    {

        services.AddAuthorization(options =>
        {
            options.AddPolicy("AtLeast21", policy =>
                policy.Requirements.Add(new MinimumAgeRequirement(21)));
        });
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();

    }

3. Контроллер

[Authorize(Policy = "AtLeast21")]
public class GridController : Controller
...