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

Blazor Server中JS调用.NET静态服务方法报指定调度器未设置错误

解决Blazor Server中JS调用.NET静态服务方法时的"No call dispatcher has been set"错误

核心问题分析

这个错误主要来自两个关键问题:

  • invokeMethodAsync的第一个参数传错(用了类全名而非程序集名称)
  • JS代码执行时机过早(Blazor运行时未完成初始化)
  • JS调用时未传递必要参数

分步解决方案

1. 修正invokeMethodAsync的参数格式

window.DotNet.invokeMethodAsync的第一个参数必须是程序集名称(而非类的全名),第二个参数是[JSInvokable]标记的方法名称。

修改后的JavaScript代码:

function setupLogging() {
    debugger; // 仅调试时使用       
    window.dotnetLogger = window.dotnetLogger || {};
    window.dotnetLogger.writeInfo = function (message) {
        // 第一个参数为程序集名称(与项目属性中的程序集名称一致)
        return window.DotNet.invokeMethodAsync('MyNamespace', 'WriteInfo', message);
    };   
}

如何确认程序集名称?右键项目 → 属性 → 应用程序 → 程序集名称,确保此处名称与JS中传入的一致。

2. 确保JS代码在Blazor初始化完成后执行

Blazor Server的window.DotNet对象虽然在页面加载时可见,但调用调度器需要等Blazor运行时完全初始化完成。因此需要在组件的OnAfterRenderAsync生命周期中调用setupLogging:

在MainLayout.razor中添加代码:

@inject IJSRuntime JS

@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            // 仅在组件首次渲染完成后初始化JS方法
            await JS.InvokeVoidAsync("setupLogging");
        }
    }
}

3. 验证静态类初始化(保持现有代码即可)

确保JsHelperService.Init()已在Program.cs中调用,保证静态类被加载:

var builder = WebApplication.CreateBuilder(args);

// ... 其他服务注册代码 ...

// 初始化静态服务类
MyNamespace.Utility.JsHelperService.Init();

var app = builder.Build();

// ... 中间件配置代码 ...

验证要点

  • 确认[JSInvokable("WriteInfo")]的名称与JS中调用的方法名完全一致
  • 检查Logger.Instance是否已正确初始化,避免在WriteInfo方法内部抛出其他异常
  • 如果程序集名称包含特殊字符或后缀,需严格匹配项目属性中的值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:45:01