SignalR在协商后停止,不ping,连接或进行任何长轮询XHR请求

时间:2013-08-11 13:34:46

标签: c# asp.net-mvc signalr

我正在使用带有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 event becomes intermittent when deployed to a server

更新2:

从上面的工作修复,但长期调查XHR请求持续了几分钟,这对我来说似乎很奇怪,客户端在几分钟后更新请求已完成,这是不可接受的,所以我决定将SignalR升级到2.0.0 beta2

在我第一次运行应用程序后,SignalR无法连接(大约一秒钟后超时).. 第二次一切正常,长期民意调查XHR在2秒内完成。 第三次回到第一步,没有ping,没有connnect,没有长轮询请求。但是当从服务器端触发某些内容时,它会立即更新,就像它通过websockets连接一样..我只能在调试窗口中看到:

[00:12:52 GMT + 0200(中欧标准时间)] SignalR:在集线器'NotificationsHub'上触发客户端集线器事件'notify'。

以下是我对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();
});

1 个答案:

答案 0 :(得分: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.
}