C# 协商后信号机停止,不';t ping、连接或发出任何长轮询XHR请求
我使用Signalr1.1.2和SQL作为底板,并且经常(比如70%的页面加载)SignalR触发协商请求,该请求成功(没有失败),只是停止,不再发生任何事情。我发现与jquery.validation.js存在一些冲突 所以我将jquery、jquery验证和jquery unobtrusive ajax更新到了最新的可用版本,但它仍然存在 其他时候,当它正常工作时,我可以看到很少有XHR请求:C# 协商后信号机停止,不';t ping、连接或发出任何长轮询XHR请求,c#,asp.net-mvc,signalr,C#,Asp.net Mvc,Signalr,我使用Signalr1.1.2和SQL作为底板,并且经常(比如70%的页面加载)SignalR触发协商请求,该请求成功(没有失败),只是停止,不再发生任何事情。我发现与jquery.validation.js存在一些冲突 所以我将jquery、jquery验证和jquery unobtrusive ajax更新到了最新的可用版本,但它仍然存在 其他时候,当它正常工作时,我可以看到很少有XHR请求: 协商 连接 平 长轮询请求,请继续 这是我的中心: public class Notifica
- 协商
- 连接
- 平
- 长轮询请求,请继续
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
这里有一个快速解决方案,但我想知道这是一个错误还是信号员的正常行为:
更新2:
上面的修复工作正常,但长轮询XHR请求持续了几分钟,这对我来说似乎很奇怪,当请求完成时,客户端在几分钟后被更新,这是不可接受的,所以我决定将SignalR升级到2.0.0 beta2
在第一次运行应用程序之后,信号器无法连接(大约在第二秒后超时)。。
第二次一切顺利,长投票XHR在2秒内完成。
第三次返回第一步,无ping、无连接、无长轮询请求。但是,当服务器端触发某些内容时,它会立即更新,就像通过WebSocket连接一样。。我在调试窗口中看到的唯一内容是:
[00:12:52 GMT+0200(中欧标准时间)]信号器:在hub“NotificationsHub”上触发客户端hub事件“notify”
以下是我对使用SignalR 2.0.0 beta2的Hub所做的更改
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();
});
您的连接中断应通过重新连接事件解决。然而,这似乎没有发生。您的中心存在一些问题,请将其修改为:
public class NotificationsHub : Hub
{
public override Task OnConnected()
{
// Ensure that the group is added before completing OnConnected
return Groups.Add(Context.ConnectionId, CurrentUser.UserId.ToString());
}
// Never remove from group in OnDisconnected, ConnectionId's are auto-removed from groups when they disconnect.
}
@马伦,我试过了,没用,但谢谢你提醒我,你提到了我的问题,称之为“快速修复”,但你使用了哪种修复?如前所述,我最初使用了Thread.Sleep(不太好!),然后意识到Groups.Add(…)是异步的,需要“等待”。您正在这样做吗?@4imble您可以在底部看到我的最终代码,我只在等待base.OnConnected(),当我同时等待两者时,信号器无法连接,它在大约一秒钟后返回超时,请求失败。我没有机会对它进行更多的测试,所以我不能肯定这就是原因,但是上面的内容对我来说很有用。