SignalR JS事件无法触发问题求助
问题诊断与修复步骤
1. 修复JavaScript语法错误
你的$.connection.hub.error回调函数未正确闭合,导致chat.client.ReceiveMessage的绑定被嵌套在错误回调内部——只有SignalR发生错误时才会执行这个绑定,正常连接时根本不会触发事件!
修正后的JS代码:
var chat = $.connection.chatHub; $.connection.hub.logging = true; // 正确闭合error回调 $.connection.hub.error(function (error) { console.log('SignalR error:', error); }); // 客户端方法绑定(两种方式选一种即可,无需重复绑定) chat.client.ReceiveMessage = function (name, message, count) { console.log("proto message"); console.log(count + " " + name + ": " + message); }; // 或者使用on方法(推荐写法) chat.on("ReceiveMessage", (user, message, count) => { console.log(count); var encodedUser = $("<div />").text(user).html(); var encodedMessage = $("<div />").text(message).html(); var li = "<li><strong>" + encodedUser + "</strong>: " + encodedMessage + "</li>"; $("#messages").append(li); }); $.connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () { console.log("connected"); console.log($.connection.hub); });
2. 修正版本兼容性问题
你标注的版本存在混淆,这是核心问题之一:
- 服务器端用的是传统ASP.NET SignalR(基于Owin,继承
Hub),对应的NuGet包应为Microsoft.AspNet.SignalR,而非signalR.AspNet.Core(后者是ASP.NET Core专属SignalR,与传统版本完全不兼容) - 客户端需使用与服务器版本匹配的
jquery.signalr-x.x.x.min.js,如果服务器是2.4.3版本,客户端也应使用jquery.signalr-2.4.3.min.js,而非2.3.0
3. 确认参数与消息格式
从你提供的网络返回日志来看,服务器发送的参数顺序["ReceiveMessage", "psychuk", "testing", "41"]与客户端方法(user, message, count)的定义完全匹配,这部分无问题。
4. 验证代理脚本加载
确保页面中正确加载了SignalR自动生成的代理脚本:
<script src="/signalr/hubs"></script>
可在控制台打印$.connection,确认是否存在chatHub属性,若不存在则说明代理未正确加载。
额外调试技巧
- 在控制台执行
chat.client,查看是否存在ReceiveMessage方法,确认绑定是否成功 - 借助已开启的
$.connection.hub.logging = true,查看日志中是否有Invoking client method 'ReceiveMessage'条目,这能直接确认服务器消息是否被客户端接收
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

