【发布时间】:2013-08-11 13:34:46
【问题描述】:
我正在使用 SignalR 1.1.2 和 SQL 作为背板,并且经常(如 70% 的页面加载),SignalR 触发协商请求,该请求成功(不会失败)并且停止并且不再发生任何事情。我发现与 jquery.validation.js 有一些冲突 所以我更新了:jquery、jquery 验证和 jquery unobtrusive ajax 到最新的可用版本,但它仍然发生,
当它正常工作时,我可以看到很少的 XHR 请求:
协商
连接
ping
进一步的长轮询请求
这是我的中心:
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 的错误还是正常行为:
SignalR event becomes intermittent when deployed to a server
更新 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();
});
【问题讨论】:
-
您引用了我的问题并将其称为“快速修复”,但您使用了哪个修复?如前所述,我最初使用的是 Thread.Sleep (不好!),然后意识到 Groups.Add(...) 是异步的,需要“等待”。你在做这个吗?
-
@4imble 你可以在底部看到我的最终代码,我只在等待 base.OnConnected(),当我在等待两者时,SignalR 无法连接,它在一秒钟后返回超时并且请求失败。我没有机会对其进行更多测试,所以我不能肯定这是原因,但以上对我有用。
标签: c# asp.net-mvc signalr