SignalR C#客户端无法接收消息,Javascript客户端可正常接收
SignalR C#客户端无法接收消息排查求助
我在Windows上运行一个C# .NET SignalR Hub,此前用Javascript客户端测试一切正常,但对应的C#客户端无法接收消息。
环境与Hub信息
- Hub使用WebSockets协议,会拒绝不包含WebSocket Upgrade请求头的连接;
- 采用HTTPS协议并使用自签名证书;
- Hub包含基础连通性检查方法,会向客户端回显纯文本测试消息,功能类似AspNetCore ChatHub示例应用。
客户端表现对比
- Javascript客户端:无论服务器托管在Visual Studio还是Windows Server 2019的IIS上,均可正常连接、发送和接收消息;
- C#客户端:可通过HTTPS正常连接(已忽略自签名证书校验),连接状态显示为Connected;发送的测试消息可在服务器日志中看到,但无法接收回显响应,客户端和服务器均无异常抛出。已排查方法名拼写问题,确认无错误。
代码对比
正常运行的Javascript客户端代码
connection.on("TestMessage", function (msg) { logMsg("TestMessage: " + msg); });
C#客户端对应代码(处理器从未被调用,已在hubConnection.StartAsync()前配置)
this.hubConnection.On<string, string>("TestMessage", (user, message) => { var newMessage = $"{user}: {message}"; this.Log(newMessage); });
排查方向建议
- 参数不匹配:JS客户端的
TestMessage仅接收1个参数,但C#客户端注册的是接收2个参数。Hub端发送TestMessage时的参数数量和类型必须与客户端注册的完全一致,C#作为强类型语言,参数不匹配会直接跳过回调执行,这是最可能的原因。 - 方法名大小写校验:虽然SignalR默认大小写不敏感,但如果自定义了协议配置,可能存在严格匹配的情况,确认Hub端发送消息的方法名与客户端注册的完全一致。
- 开启客户端详细日志:添加日志配置查看消息接收细节,确认客户端是否收到消息及未触发回调的原因:
hubConnection.LogLevel = Microsoft.Extensions.Logging.LogLevel.Trace; hubConnection.LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); - 验证WebSocket连接稳定性:虽然连接状态显示Connected,但可通过日志或工具确认WebSocket连接是否真的处于正常通信状态,排除自签名证书对消息传输的隐性影响。
内容的提问来源于stack exchange,提问作者Jon Stewart
相关产品推荐
相关产品推荐

