0

我正在使用带有 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 的错误还是正常行为:

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();
});
4

1 回答 1

1

您的连接中断应该通过重新连接事件来解决。然而,这似乎并没有发生。您的 Hub 中存在一些问题,请将其修改为:

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.
}
于 2013-08-11T19:12:57.480 回答