几分钟后,信号器停止进行回调

时间:2012-02-16 18:22:58

标签: asp.net signalr

我在aspx-Page上使用signalr 0.4,

var hub = $.connection.FooHub;

hub.disconnected(function () {                
            log("Server has disconnected");
        });

hub.ShowInfo = function (Info) { .... }

$("#Button1").click(function () {
            hub.FooFunction('foo');
        });

$.connection.hub.start();

Hub定义为:

public class FooHub : Hub, IDisconnect
{    
    ~FooHub()
    {
        log.Debug("FooHub Destroy");
    }
    public FooHub()
    {
        log.Debug("FooHub Startup");
    }    
    public bool FooFunction(string stuff)
    {
        log.Debug("Hub FooFunction");
        Clients.ShowInfo(someInfo);
        return true;
    }
    public Task Disconnect()
    {
        // Query the database to find the user by it's client id etc. etc.
        MyController.Disconnect(Context.ConnectionId);
        log.Debug("Hub Disconnnect " + Context.ConnectionId);
        return null;
    }
   ......
}

当我打开页面并立即点击Button1时 它调用Hub,后者又调用页面上的ShowInfo函数 使用Firebug,我可以看到信号器正在使用长轮询进行通信。 所以一切都按预期工作。

但是当我等了几分钟时 我明白了

  • FooHub被销毁
  • 在集线器中调用断开连接,

然而在页面上没有新的连接
Firebug显示旧的仍在执行中 然后当我点击按钮 -

  • 调用FooFunction(我在firebug中看到一个新连接)
  • 创建了FooHub
  • FooFunction在Hub中执行(日志中有一行)
  • 但未执行ShowInfo

这是SignalR中的错误还是我必须做其他事情才能获得ShowInfo调用?

更新(可能的答案):

它使用了Forever-Frame而不是长轮询。

此外,问题似乎主要发生在使用移动互联网(usb-stick)和Firefox时。

将传输更改为long-Polling似乎可以解决此问题。

2 个答案:

答案 0 :(得分:1)

你提到切换到长轮询而不是使用永久帧,但没有说明如何做到这一点。您可以指定在启动连接时尝试的传输。

connection.start({ transport: ['longPolling','webSockets'] });

有关更多选项,请参阅https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client

答案 1 :(得分:0)

你看过这个https://github.com/SignalR/SignalR/wiki/Configuring-SignalR 试试看吧。根据你的代码对我来说,每件事似乎都没问题。你也可以在Chrome中测试它,看看发生了什么。