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

如何在Blazor中实现会话(Session)处理?

Blazor的会话状态管理方案

Blazor并非没有会话状态管理机制,只是它的实现逻辑和传统PHP/ASP.NET的Server-Side Session有差异——这是由Blazor的两种运行模式(Server/WASM)决定的,下面给你梳理几种实用的轻量方案:

1. Blazor Server模式:直接复用ASP.NET Core Session

Blazor Server本身依托ASP.NET Core运行,完全可以使用原生的Session机制,步骤很简单:

  • 首先在Program.cs中配置Session服务:
    builder.Services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置会话超时时间
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
    
    // 注意要在app.UseRouting()之后、app.MapBlazorHub()之前添加
    app.UseSession();
    
  • 在组件中通过依赖注入ISession来读写会话数据:
    @inject ISession Session
    
    @code {
        private string? _userName;
    
        protected override void OnInitialized()
        {
            // 读取Session中的数据
            _userName = Session.GetString("UserName");
        }
    
        private void SaveUserInfo()
        {
            // 写入数据到Session
            Session.SetString("UserName", "Maik");
        }
    }
    

2. Blazor WebAssembly模式:客户端存储方案

WASM模式下代码运行在浏览器端,没有服务器端Session,可使用以下两种常用方式:

  • 浏览器Storage(sessionStorage/localStorage):通过IJSRuntime调用JS API实现,适合存储轻量会话数据:
    @inject IJSRuntime JSRuntime
    
    @code {
        private async Task SaveUserId()
        {
            await JSRuntime.InvokeVoidAsync("sessionStorage.setItem", "UserId", "123");
        }
    
        private async Task<string?> GetUserId()
        {
            return await JSRuntime.InvokeAsync<string>("sessionStorage.getItem", "UserId");
        }
    }
    
    注意sessionStorage会在浏览器标签页关闭后清空,localStorage则会持久化存储到本地。
  • PersistentComponentState:Blazor官方提供的组件状态持久化工具,适合跨页面跳转或刷新后恢复组件状态:
    @inject PersistentComponentState State
    @implements IDisposable
    
    @code {
        private string? _userData;
        private IDisposable? _subscription;
    
        protected override void OnInitialized()
        {
            // 尝试从持久化状态恢复数据
            if (State.TryTakeFromJson<string>("UserData", out var data))
            {
                _userData = data;
            }
            // 订阅状态持久化事件
            _subscription = State.RegisterOnPersisting(PersistUserData);
        }
    
        private async Task PersistUserData()
        {
            // 将数据持久化
            State.PersistAsJson("UserData", _userData);
        }
    
        public void Dispose()
        {
            _subscription?.Dispose();
        }
    }
    

避坑提醒

  • 绝对不要用静态变量存储会话数据:静态变量是全局共享的,所有访问应用的用户都会共用同一份数据,会导致严重的逻辑混乱。
  • 网上的复杂教程往往针对分布式场景或大型应用的状态管理(比如Redux、Blazor State等),普通业务场景用上面的轻量方案完全足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:06