我正在使用SignalR(带有跨域请求),版本2.3.0用于集成到ASP.NET站点的webchat。一切都很好。但我发现SignalR连接的奇怪行为。当我从聊天选项卡中点击参考文件下载时,SignalR连接被中止,并且在我的Hub类中触发了onDisconnected方法。 FireBug向我展示下一个POST请求:
的http:// *:81 / signalr /中止运输= longPolling&安培; clientProtocol = 1.4&安培;标记= eUpLNitKcmR1d2JhTTRvcHNVZmEwcG1EKzYvMElZbmg4aE5yam9xM3k0dz0_IjAsNGJmOWNhODUtNDU2NS00NWExLWFjMTgtNzgyN2FhZDA2Njg1LGxvY2FsaG9zdCI1&安培;状态= 1&安培; connectionToken = hDXe9xIZtmrapjl1LRwtK9B%2BfYMoeuHka8ctBLaPa0YnjiN9iiFa%2BvFMBHIGpGH0h8qPEDgGZSRGwjMw3Wm1DJi6cUPtZjLca6%2FR2576SGksLAj3lnPN1JWIlxMsn8%2BF&安培; connectionData =%5B%7B %22name%22%3A%22c%22%7D%2C%7B%22name%22%3A%22voip%22%7D%5D,其中*是我的域名。
它在Mozilla Firefox(版本30.0)中用于LongPolling或Websocket传输。我该如何解决这个问题?或者它是SignalR或Firefox的错误?
答案 0 :(得分:5)
This bug最近已在GitHub上针对SignalR提起诉讼。基本思想是下载文件会导致Firefox触发window.onbeforeunload
事件,从而导致SignalR关闭任何正在进行的连接。
目前,解决方法是将处理程序附加到客户端的已断开连接的事件,该事件将在短$.connection.start
之后再次调用window.setTimeout
。
你也可以取消绑定SignalR的onbeforeunload处理程序:$(window).unbind("beforeunload")
。这样做的缺点是,当用户离开运行SignalR的页面时,Firefox可能无法正常断开连接。如果没有正常断开连接,SignalR将等待超过客户端超过30秒并调用OnDisconnected
或Hub
上的PersistentConnection
处理程序。
答案 1 :(得分:3)
我已设法使用halter73解释的工作流程,我解决了dudeNumber4所描述的问题,重置了disconnect事件中的connectionid,以便服务器根据他们的情况不断回调正确的用户connectionid,无需通过用户名或组名来解决它们。
$.connection.hub.disconnected(function () {
setTimeout(function () {
$.connection.hub.start().done(function () {
$("#mySignalRConnectionIdHidden").val($.connection.hub.id);
});
}, 3000);
});