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
相关产品推荐
相关产品推荐

