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

SignalR客户端调用服务端方法偶发报错:方法不存在

问题描述

我有一个运行Hub类的C#服务端,Hub类代码如下:

public class HothHub : Hub
{
  public async Task AddSingleUserGroup(string name)
  {
    await Groups.AddToGroupAsync(Context.ConnectionId, name);
  }
}

同时我有一个JavaScript客户端,通过以下代码连接Hub:

var connection;

async function signalRStart() {
    connection = new signalR.HubConnectionBuilder()
        .withUrl("https://somesignalrurl.com/hothhub", { withCredentials: false })
        .withAutomaticReconnect()
        .configureLogging(signalR.LogLevel.Information)
    .build();

    connection.on("hothHubToHothUpdate", () => {
        console.log("Called by the server!");
    });

    connection.onreconnecting(error => {
        console.log("Connection lost due to error " + error + ". Reconnecting.");
    });

    // Start the connection.
    await start();
}

async function start() {
    try {
        await connection.start();
        connection.invoke("addSingleUserGroup", "someUniqueUserName");
    } catch (err) {
        console.log(err);
        setTimeout(start, 5000);
    }
};

客户端能成功建立SignalR连接,首次调用connection.invoke("addSingleUserGroup", "someUniqueUserName")时服务端方法能正常触发,但后续调用偶发失败,客户端报错:

Uncaught (in promise) Error: Failed to invoke 'addSingleUserGroup' due to an error on the server. HubException: Method does not exist.
    at _callbacks.<computed> (signalr.js:1252:36)
    at HubConnection._processIncomingData (signalr.js:1364:33)
    at HubConnection.connection.onreceive (signalr.js:985:52)
    at webSocket.onmessage (signalr.js:2236:30)

已排查方法名大小写错误、参数类型不匹配问题,均不符合当前场景,想请教可能的原因及排查方向。

可能的原因及排查方向
  • 自动重连后连接状态未校验:客户端启用了withAutomaticReconnect(),重连过程中或重连未完成时调用invoke,会导致请求失效。后续调用前必须检查连接状态,确保处于Connected状态:
    if (connection.state === signalR.HubConnectionState.Connected) {
        await connection.invoke("addSingleUserGroup", "someUniqueUserName");
    }
    
  • Hub实例生命周期配置错误:如果服务端错误地将Hub注册为单例,会导致后续请求无法正确解析方法。检查Program/Startup.cs中的注册代码,确保是默认的瞬时实例配置:builder.Services.AddSignalR().AddHub<HothHub>()。
  • 方法名映射的隐性歧义:虽然排查过大小写,但SignalR的序列化配置可能导致方法名解析不一致。可以在服务端显式指定方法名,消除歧义:
    [HubMethodName("addSingleUserGroup")]
    public async Task AddSingleUserGroup(string name)
    {
      await Groups.AddToGroupAsync(Context.ConnectionId, name);
    }
    
  • 重连后连接实例异常:自动重连后,原连接的某些状态可能未正确重置。检查是否在onreconnected事件中做了必要的初始化操作,比如重新调用加入组的方法,同时确保没有代码在重连过程中覆盖connection变量。
  • 服务端路由或Hub注册冲突:确认服务端的端点映射是否正确,没有多个Hub使用同一路由:app.MapHub<HothHub>("/hothhub"),避免请求被路由到错误的Hub实例。
  • 版本不兼容:客户端(@microsoft/signalr)和服务端(Microsoft.AspNetCore.SignalR)的主版本号必须一致,版本差异可能导致方法解析逻辑出错,检查双方版本并统一。
  • 服务端日志排查:开启SignalR的详细日志,查看报错时服务端的具体日志信息,比如请求是否到达正确的Hub、方法查找失败的具体原因。在Program.cs中添加日志配置:
    builder.Logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:19