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

Blazor持久化组件状态存储位置及预渲染数据库访问咨询

问题

我正在使用微软官方的Blazor组件状态持久化方案,当前在预渲染模式下组件会两次初始化:首次从数据库获取数据,第二次从ApplicationState读取。我想确认以下两个问题:

  • 该持久化的ApplicationState是存储在服务端还是客户端?
  • 是否会导致浏览器再次向服务器请求内容,产生双重流量?还是状态保存在用户本地,二次初始化时无需调用服务器?

实现代码如下:

@code {
    public string bgcolor { get; set; } = "#2F4858";
    public Website? Website { get; set; }
    private PersistingComponentStateSubscription _subscription;


    protected override async Task OnInitializedAsync()
    {
        _subscription = ApplicationState.RegisterOnPersisting(PersistWebsite);

        if (ApplicationState
           .TryTakeFromJson<Website>("Website", out var storedWebsite))
        {
            Website = storedWebsite;
        }
        else
        {
            Website = websiteService.GetWebsite(MyNavigationManager.Uri);            
        }
    }

    private Task PersistWebsite()
    {
        ApplicationState.PersistAsJson("Website", Website);
        return Task.CompletedTask;
    }

    void IDisposable.Dispose()
    {
        _subscription.Dispose();
    }
}
解答
  • ApplicationState的存储逻辑:它本质是服务端在预渲染阶段临时保存的状态,当预渲染完成后,框架会将持久化的状态序列化为JSON,嵌入到返回给浏览器的HTML页面中(通常是一个隐藏的表单元素)。客户端Blazor应用启动(二次初始化)时,直接从本地的HTML内容中读取该状态,而非从服务端拉取。
  • 流量与请求情况:不会产生双重流量。二次初始化时,组件直接复用嵌入在HTML里的状态数据,不需要再次向服务器发起请求或调用数据库,完全避免了重复的数据获取操作。

这个机制的核心价值在于:既保留了预渲染带来的SEO优势,又通过状态复用避免了客户端启动后的重复数据请求,平衡了首屏渲染性能与用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:15:36