我正在使用带有 SQL 作为背板的 SignalR 1.1.2,并且经常(如 70% 的页面加载),SignalR 触发协商请求,该请求成功(不会失败)并且停止并且不再发生任何事情。我发现与 jquery.validation.js 存在一些冲突,所以我更新了:jquery、jquery 验证和 jquery unobtrusive ajax 到最新的可用版本,但它仍然会发生,,
其他时候,当它正常工作时,我可以看到很少的 XHR 请求:
谈判
连接
平
长轮询请求进一步
这是我的中心:
public class NotificationsHub : Hub
{
public override Task OnConnected()
{
Groups.Add(Context.ConnectionId, CurrentUser.UserId.ToString());
return base.OnConnected();
}
public override Task OnDisconnected()
{
Groups.Remove(Context.ConnectionId, CurrentUser.UserId.ToString());
return base.OnDisconnected();
}
}
我的客户代码:
$(document).ready(function () {
var nh = $.connection.notificationsHub;
nh.notify = function (notificationHtml) {
$('#notification-box').find('ul').prepend(notificationHtml);
$('#notification-bubble').text($('#notification-bubble').text() + 1);
};
$.connection.hub.start();
});
刷新页面时出现错误:
The connection to http://localhost:55087/signalr/connect?transport=serverSentEvents&connectionToken=FuqvvQJaxyCfy0dj2DEoZQFkBmthBk9LxU6ZEGZO4ypbSy8pUpzrvCKWTjykxp9E9GtMdwLI0sX_tWkvK1XfJaEtjFHOL3Qmeg2eILh4pTZnEzXDyq6KPuvPw_4kzj9VtNe89YsWW-3sstPwu_I60A2&connectionData=%5B%5D&tid=4 was interrupted while the page was loading.
然后遵循成功的 POST 请求:
http://localhost:55087/signalr/abort?transport=serverSentEvents&connectionToken=FuqvvQJaxyCfy0dj2DEoZQFkBmthBk9LxU6ZEGZO4ypbSy8pUpzrvCKWTjykxp9E9GtMdwLI0sX_tWkvK1XfJaEtjFHOL3Qmeg2eILh4pTZnEzXDyq6KPuvPw_4kzj9VtNe89YsWW-3sstPwu_I60A2
这是一个快速修复,但我想知道这是 SignalR 的错误还是正常行为:
更新 2:
从上面的修复工作,但长轮询 XHR 请求持续了几分钟,这对我来说似乎很奇怪,并且客户端在请求完成后几分钟后更新,这是不可接受的,所以我决定将 SignalR 升级到 2.0.0 beta2。
在那之后,我第一次运行应用程序 SignalR 无法连接(大约一秒后超时)。第二次一切正常,长轮询 XHR 在 2 秒内完成。 第三次回到第一步,没有 ping,没有连接,没有长轮询请求。但是当从服务器端触发某些东西时,它会立即更新,就像它通过 websockets 连接一样。我在调试窗口中唯一能看到的是:
[00:12:52 GMT+0200(中欧标准时间)] SignalR:在集线器“NotificationsHub”上触发客户端集线器事件“通知”。
这是我对 Hub 所做的更改,适用于 SignalR 2.0.0 beta2
public class NotificationsHub : Hub
{
public async override Task OnConnected()
{
var user = WebSecurity.GetUserId(Context.User.Identity.Name);
Groups.Add(Context.ConnectionId, user.ToString());
await base.OnConnected();
}
// OnDisconnected() was dropped thanks to N. Taylor Mullen
}
客户端:
$(document).ready(function () {
$.connection.notificationsHub.client.notify = function (notificationHtml) {
$('#notification-box').find('ul').prepend(notificationHtml);
$('#notification-bubble').text(parseInt($('#notification-bubble').text()) + 1);
};
$.connection.hub.logging = true; // optional, if you want to see what's going on
$.connection.hub.start();
});