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



我正在转换一个Asp。Net Core 2.2 Mvc应用程序到3.0;当我尝试重构代码以使用UseEndpoints而不是UseMvc时,路由似乎无法识别。

以下是使用UseMvc 启动.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}",
new
{
Controller = "Grid",
Action = "View"
});
endpoints.MapControllerRoute("default", "{controller=Portal}/{action=Index}/{id?}");
});
}

当我使用UseEndpoints代码运行应用程序时,我从自定义AuthorizationHandler中得到一个错误,因为httpContextAccessor中没有值。HttpContext。要求RouteValues。如果我删除了Grid路由的MapControllerRoute代码,那么默认路由可以与AuthorizationHandler一起正常工作。使用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.配置服务:

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

最新更新