ASP.NET Core 5异常过滤器如何访问Session或传递用户角色布尔值
解决方案
你可以直接通过ExceptionContext参数获取当前请求的HttpContext对象,进而访问Session读取对应标识值,无需额外做参数传递,操作步骤如下:
前置检查
首先确保你的项目已经正确配置Session服务与中间件:
- 在
Program.cs(.NET 5+)/Startup.cs中注册Session服务:
// 注册Session服务 builder.Services.AddSession(options => { // 可按需配置Session过期时间等参数 options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
- 确保中间件顺序正确,
UseSession要放在UseRouting之后、控制器/终结点执行之前:
app.UseRouting(); // 必须放在UseRouting之后,UseAuthorization、MapControllerRoute之前 app.UseSession(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
修改异常过滤器代码
直接在OnException方法中从上下文读取Session值即可:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class CustomExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { // 直接从上下文获取HttpContext var httpContext = context.HttpContext; // 读取Session存储的角色标识,注意替换为你实际使用的Session键名 bool isWebDeveloper = httpContext.Session.GetBoolean("IsWebDeveloper") ?? false; // 根据角色返回不同粒度的错误信息 if (isWebDeveloper) { // 开发者可见的完整错误信息 context.Result = new JsonResult(new { Code = StatusCodes.Status500InternalServerError, ErrorMessage = context.Exception.Message, StackTrace = context.Exception.StackTrace }) { StatusCode = StatusCodes.Status500InternalServerError }; } else { // 普通用户可见的友好错误 context.Result = new JsonResult(new { Code = StatusCodes.Status500InternalServerError, ErrorMessage = "系统暂时无法访问,请稍后重试" }) { StatusCode = StatusCodes.Status500InternalServerError }; } // 标记异常已处理,终止异常向上传递 context.ExceptionHandled = true; } }
补充说明
如果你存储Session时用的是字符串格式存储布尔值,也可以用以下方式读取:
bool isWebDeveloper = bool.TryParse(httpContext.Session.GetString("IsWebDeveloper"), out bool res) ? res : false;
如果你不想直接在过滤器中访问Session,也可以通过构造函数注入IHttpContextAccessor实现相同效果,不过上述直接从ExceptionContext读取的方案更简洁,不需要额外注册依赖。
内容的提问来源于stack exchange,提问作者Zoltan Hernyak
相关产品推荐
相关产品推荐

