使用asp.net核心的多个控制器路由模式3 UseEndpoints

我正在将Asp.Net Core 2.2 Mvc应用程序转换为3.0;当我尝试重构代码以使用UseEndpoints代替UseMvc时,似乎无法识别路由。

以下是使用UseMvc的startup.cs中的工作代码

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?}");
        });
    }

这是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}",action = "View"
                });

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

当我使用UseEndpoints代码运行应用程序时,我从自定义AuthorizationHandler中收到错误消息,因为httpContextaccessor.HttpContext.Request.RouteValues中没有值。如果删除Grid路由的MapControllerRoute代码,则默认路由可以与AuthorizationHandler一起正常工作。使用UseEndpoints时可以有多个控制器路由模式吗?

wwwqq20010 回答:使用asp.net核心的多个控制器路由模式3 UseEndpoints

我在下面的示例中尝试了您的代码,它很好地获得了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.Controller

[Authorize(Policy = "AtLeast21")]
public class GridController : Controller
本文链接:https://www.f2er.com/3143508.html

大家都在问