You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:45:03