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

Blazor Server中Scoped服务为何每页重复实例化?求排查

问题根源与解决方案:Blazor Server Scoped服务页面导航时重建

核心原因

你遇到的问题并非Scoped服务注册错误,而是使用了触发全页面刷新的导航方式,导致Blazor Server的Circuit(浏览器标签会话)被重建,进而Scoped服务重新实例化。

Blazor Server服务生命周期回顾

  • AddScoped:服务实例与单个Circuit绑定,同一个浏览器标签内的所有页面/组件共享同一实例,正常客户端导航不会重建Circuit,服务实例保持不变。
  • AddSingleton:服务实例全局唯一,所有Circuit(多标签/多用户)共享,因此你观察到多标签仅一个实例的现象符合预期。

问题排查与修复

  1. 检查导航方式
    如果你使用原生HTML <a> 标签导航(如下),点击时会触发浏览器全页面刷新,直接断开当前Circuit并创建新会话:

    <a href="/TestPage">跳转到测试页</a>
    
  2. 替换为Blazor客户端导航
    使用Blazor提供的客户端路由方式,避免全页面刷新:

    • 方式一:使用NavLink组件(支持路由高亮)
      <NavLink href="/TestPage" class="nav-link">跳转到测试页</NavLink>
      
    • 方式二:通过NavigationManager编程式导航
      @inject NavigationManager NavManager
      
      <button @onclick="NavigateToTest">跳转到测试页</button>
      
      @code {
          private void NavigateToTest()
          {
              NavManager.NavigateTo("/TestPage");
          }
      }
      
  3. 验证修复效果
    修改导航方式后,再次测试页面切换:TestService的构造函数只会在首次打开标签时调用一次,后续页面导航不会触发重新实例化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:03