Blazor WASM应用启动阶段初始化上下文数据的实现方案问询
答案
完全可以在影响初始渲染的阶段发起异步WebApi请求拉取上下文,这是解决你这个场景的标准方案,具体实现根据Blazor部署模式不同略有区别:
Blazor WebAssembly 实现
在Program.cs中完成接口请求、Culture设置后再启动应用宿主,此时的异步操作会阻塞应用挂载,所有设置都会作用于首屏渲染:
var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); builder.RootComponents.Add<HeadOutlet>("head::after"); // 构造临时HttpClient拉取启动上下文 var tempClient = new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }; // 等待接口返回,拿到包含mandate信息、用户名、语言的上下文 var appContext = await tempClient.GetFromJsonAsync<AppUserContext>("api/startup/context"); // 设置全局Culture,此时设置会影响所有后续组件的渲染逻辑 if (!string.IsNullOrWhiteSpace(appContext?.LanguageCode)) { var targetCulture = new CultureInfo(appContext.LanguageCode); CultureInfo.DefaultThreadCurrentCulture = targetCulture; CultureInfo.DefaultThreadCurrentUICulture = targetCulture; } // 将上下文注册为全局单例服务,后续所有组件注入即可直接使用 builder.Services.AddSingleton(appContext ?? new AppUserContext()); // 所有前置准备完成后再启动应用 await builder.Build().RunAsync();
Blazor Server 实现
Blazor Server是多租户架构,每个用户连接对应独立会话,需要在初始HTTP请求管道阶段完成上下文拉取:
- 在Program.cs的中间件管道中,Blazor端点匹配前新增自定义中间件,针对应用首页的初始请求拉取用户上下文
- 拉取完成后设置
Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture,同时将上下文存入HttpContext.Items或Cookie - 后续Blazor组件注入
IHttpContextAccessor即可直接读取预加载的上下文数据
注意不要在Blazor Server的宿主构建阶段拉取用户上下文,宿主是全局单例,会导致所有用户共用同一份上下文数据。
补充说明
- 该方案会小幅延长首屏加载的等待时间,建议对上下文接口做性能优化,也可以在index.html中添加静态加载占位符,避免用户感知到白屏
- 相较于在App.razor的
OnInitializedAsync中加载的方案,该阶段执行的所有配置都会作用于首屏渲染,不会出现先以错误语言渲染再切换的问题
内容的提问来源于stack exchange,提问作者Pascal Mathys
相关产品推荐
相关产品推荐

