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

Blazor Web App调用Session.SetString时触发空引用异常求助

解决Blazor Web App中Session.SetString的NullReferenceException问题

这个问题我之前踩过坑,核心原因是在Blazor的组件生命周期里,IHttpContextAccessor.HttpContext并不是一直可用的——尤其是Blazor Server模式下,只有初始HTTP请求阶段存在HttpContext,后续通过SignalR进行的交互环节中,HttpContext已经被释放,自然会返回null导致报错。

下面给你一步步的解决方案:

1. 先确认基础服务的正确配置

首先检查你的Program.cs有没有完成Session和HttpContextAccessor的注册,这是一切的前提:

// 注册HttpContextAccessor服务
builder.Services.AddHttpContextAccessor();

// 注册Session服务并配置参数
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 添加Session中间件,注意位置要正确!
app.UseSession(); // 必须放在app.UseRouting()之后,app.UseAuthorization()之前

2. 避免在Blazor非初始交互阶段使用HttpContext

如果你的MessageRepository是在Blazor组件(.razor文件)中调用的,那么在组件OnInitializedAsync之后的生命周期方法(比如OnAfterRenderAsync)或者用户交互事件(比如按钮点击)里调用SetMessage,都会因为HttpContext不存在而触发空引用异常。

更靠谱的替代方案:用Blazor状态管理传递组件数据

Blazor本身设计了更适合组件间数据传递的方案,完全不需要依赖Session:

  • 创建一个自定义的状态服务:
public class MessageState
{
    private readonly Dictionary<string, string> _messageStore = new();

    public void SetMessage(string key, string value)
    {
        if (_messageStore.ContainsKey(key))
            _messageStore[key] = value;
        else
            _messageStore.Add(key, value);
    }

    public string GetMessage(string key)
    {
        _messageStore.TryGetValue(key, out var value);
        return value;
    }
}
  • 在Program.cs里将其注册为Scoped服务:
builder.Services.AddScoped<MessageState>();
  • 最后在Repository和组件里注入这个服务替代HttpContextAccessor:
public class MessageRepository : IMessageRepository { 
    private readonly MessageState _messageState; 
    public MessageRepository (MessageState messageState) { 
        _messageState = messageState; 
    } 
    public void SetMessage(string key, string value) { 
        _messageState.SetMessage(key, value); 
    } 
}

这种方式在Blazor的整个生命周期里都能稳定工作,不管是初始渲染还是后续的用户交互。

3. 必须用Session的特殊场景处理

如果确实需要和传统MVC/Razor Page共享Session数据,那只能在初始HTTP请求阶段操作Session:

  • 可以在布局组件的OnInitializedAsync方法里处理;
  • 或者创建一个Razor Page作为入口,在Page里设置Session后再跳转到Blazor页面;
  • 也可以通过自定义Middleware在请求到达Blazor之前完成Session数据的设置。

总结一下:Blazor的交互模型和传统ASP.NET Core MVC差异很大,别在Blazor的实时交互环节硬套HttpContext和Session,用Blazor原生的状态管理方案才是正确的思路。

内容的提问来源于stack exchange,提问作者001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:37:57