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

Blazor WebAssembly应用无法获取注入的IJSRuntime问题求助

解决Blazor中获取IJSRuntime时的作用域服务解析错误

错误原因

IJSRuntime是作用域服务,仅能在特定作用域(如组件上下文、请求上下文)中解析。你在Main方法中通过host.Services(根服务提供程序)直接获取它,而根容器仅支持解析单例服务,因此抛出Cannot resolve scoped service 'Microsoft.JSInterop.IJSRuntime' from root provider错误。

另外,应用启动阶段(Main方法执行时)还未建立与浏览器的JS连接,即便能获取到IJSRuntime,也无法正常调用JS方法。

解决方案

将获取文化并设置默认区域的逻辑移到组件初始化阶段,比如App.razor的初始化方法中,这里可以正常注入IJSRuntime并调用JS方法。

修改步骤

  1. 更新App.razor,注入IJSRuntime和NavigationManager,在初始化时处理区域设置:
@inject IJSRuntime JSRuntime
@inject NavigationManager NavigationManager
@using System.Globalization

<Router AppAssembly="@typeof(App).Assembly">
    <!-- 保留原有路由内容 -->
</Router>

@code {
    protected override async Task OnInitializedAsync()
    {
        // 调用JS方法获取存储的文化信息
        var storedCulture = await JSRuntime.InvokeAsync<string>("blazorCulture.get");
        
        // 确定要使用的区域
        var targetCulture = string.IsNullOrWhiteSpace(storedCulture) 
            ? new CultureInfo("en-US") 
            : new CultureInfo(storedCulture);

        // 设置默认线程区域
        CultureInfo.DefaultThreadCurrentCulture = targetCulture;
        CultureInfo.DefaultThreadCurrentUICulture = targetCulture;

        // 强制刷新页面以应用区域设置
        NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true);
    }
}
  1. 删除Main方法中的await app.SetDefaultCulture();调用,以及对应的WebAssemblyHostExtension类(该逻辑已迁移到组件中)。

补充说明

如果是Blazor Server应用,也可通过本地化中间件结合请求上下文处理区域设置,但核心逻辑一致:IJSRuntime必须在有活跃JS上下文的环境中使用,不能在应用启动的根容器中直接获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:28