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

如何在不刷新页面丢失数据的前提下自动重连Blazor Server应用?

Blazor Server 无刷新自动重连实现方案

以下方案可实现无需刷新页面的自动重连,同时避免用户输入内容丢失:

  • 自定义客户端重连逻辑
    覆盖Blazor默认的强制刷新逻辑,自定义重连规则,在_Layout.cshtml(.NET 6+)或index.html的blazor.server.js加载前添加如下配置:
<!-- 关闭blazor自动启动,自定义配置后手动启动 -->
<script src="_framework/blazor.server.js" autostart="false"></script>
<script>
Blazor.start({
  reconnectionOptions: {
    maxRetries: 30, // 最大重试次数,可根据场景调整
    retryIntervalMilliseconds: 2000, // 每次重试间隔2秒
  },
  reconnectionHandler: {
    onConnectionDown: () => {
      // 此处可添加前端弱提示,告知用户连接断开正在重连
      console.log("连接断开,正在尝试恢复");
    },
    onReconnectionFailed: async () => {
      try {
        // 重试失败后主动触发重新连接逻辑,不跳转刷新
        await Blazor.defaultReconnectionHandler._reconnect();
      } catch (e) {
        // 极端情况重连失败时再提示用户,不自动刷新
        alert("连接长时间无法恢复,请保存已输入内容后手动刷新");
      }
    }
  }
});
</script>

该配置兼容.NET 5及以上版本的Blazor Server

  • 客户端输入状态持久化兜底
    即便是极端场景下服务端释放了旧连接,也可以通过本地存储自动回填用户已输入内容,避免丢失,表单组件示例代码如下:
public partial class EditFormComponent : IDisposable
{
    private string _formInput;
    private const string _storageKey = "EditForm_InputCache";

    [Inject]
    private IJSRuntime JSRuntime { get; set; }

    protected override async Task OnInitializedAsync()
    {
        // 组件初始化时读取本地缓存的输入内容
        var cachedInput = await JSRuntime.InvokeAsync<string>("sessionStorage.getItem", _storageKey);
        if (!string.IsNullOrWhiteSpace(cachedInput))
        {
            _formInput = cachedInput;
        }
    }

    private async Task HandleInputChange(ChangeEventArgs e)
    {
        _formInput = e.Value?.ToString();
        // 输入实时同步到本地sessionStorage,页面关闭自动清除,不会永久留存
        await JSRuntime.InvokeVoidAsync("sessionStorage.setItem", _storageKey, _formInput);
    }

    private async Task HandleSubmit()
    {
        // 表单提交成功后清除本地缓存
        await JSRuntime.InvokeVoidAsync("sessionStorage.removeItem", _storageKey);
        // 其余提交逻辑
    }

    public async void Dispose()
    {
        // 组件销毁时同步清除缓存
        await JSRuntime.InvokeVoidAsync("sessionStorage.removeItem", _storageKey);
    }
}
  • 调整服务端断开连接保留时长
    默认服务端会保留断开的连接上下文300秒,可根据用户后台停留的实际场景调整时长,在Program.cs中配置:
builder.Services.AddServerSideBlazor(options =>
{
    // 调整断开连接的上下文最长保留时间,最长可设置到24小时
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromHours(4);
    // 调整最大保留的断开连接数量,根据服务端内存资源调整
    options.DisconnectedCircuitMaxRetained = 200;
});

以上方案组合使用可覆盖绝大多数用户后台停留后切回的场景,无需刷新页面即可恢复连接,即使极端情况需要手动刷新,本地缓存也会自动回填用户已输入内容,不会造成数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:39:03