C# 协商后信号机停止,不';t ping、连接或发出任何长轮询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

我使用Signalr1.1.2和SQL作为底板,并且经常(比如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
这里有一个快速解决方案,但我想知道这是一个错误还是信号员的正常行为:

更新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(),当我同时等待两者时,信号器无法连接,它在大约一秒钟后返回超时,请求失败。我没有机会对它进行更多的测试,所以我不能肯定这就是原因,但是上面的内容对我来说很有用。