如何将其他处理程序添加到现有连接?

时间:2019-05-22 11:33:54

标签: javascript signalr

在我的MVC 5应用程序中,我正在页面加载时在客户端上建立Signal R连接,这可以按预期工作。

稍后,我想添加一个额外的处理程序并进行服务器端调用,我可以看到服务器接收到此调用,然后启动了一些客户端调用,客户端上的处理程序不会被调用。 / p>

页面加载时建立连接

function initialiseRealTimeDataRetrieval() {
    var hub = $.connection.autoGeneratedProxyForHub;

    hub.client.recieveRealTimeData = function (data) {
        //Do Stuff
    };

    $.connection.hub.start().done(function () {
        hub.server.getRealTimeData();
    });
}

稍后再打

function initialiseFeed () {
    var hub = $.connection.autoGeneratedProxyForHub;

    hub.client.recieveRealTimeDataFeed = function (data) {
        //Do stuff
    };

    if ($.connection.hub.state == $.connection.connectionState.connected) {
            hub.server.getRealTimeDataFeed();
    }
    else {
        $.connection.hub.start().done(function () {
            hub.server.getRealTimeDataFeed();
        });
    }
}

到目前为止,我已经尝试了以下方法:

  • 确保在服务器上正在调用从客户端到服务器的调用。
  • 如果将其他调用与在页面加载时执行的调用和处理程序一起进行,请确保它们能够按预期工作。
  • 已查看文档,以查看是否必须重新启动连接才能注册新的处理程序。
  • 尝试了添加新处理程序后重新启动连接的各种方法

以下对于其他调用可以正常工作,但是使页面加载时连接的所有工作都变得多余:

function initialiseFeed () {
    var hub = $.connection.autoGeneratedProxyForHub;

    hub.client.recieveRealTimeDataFeed = function (data) {
        //Do stuff
    };

    $.connection.hub.stop();
    $.connection.hub.start().done(function () {
       hub.server.getRealTimeDataFeed();
    });
}

通过调试器检查集线器对象确实表明所有客户端都已连接,包括其他客户端。

1 个答案:

答案 0 :(得分:0)

根据Signal R JS API Docs,针对集线器自动生成的代理不能用于注册多个事件处理程序:

  

何时使用生成的代理

     

如果要为一个客户端方法注册多个事件处理程序   服务器调用,您将无法使用生成的代理。除此以外,   您可以根据编码选择是否使用生成的代理   偏爱。如果您选择不使用它,则不必参考   客户代码中脚本元素中的“ signalr / hubs” URL。

要为现有连接注册新的处理程序,在建立连接之前,该连接必须至少具有一个与之关联的处理程序,注册新的处理程序后,您必须调用start()

  

注意

     

通常,您在调用start方法之前注册事件处理程序   建立连接。如果您想注册一些活动   处理程序建立连接后,您可以执行此操作,但是您   必须至少注册一个事件处理程序,然后才能调用   启动方法。原因之一是,一个   应用程序,但您不想在以下位置触发OnConnected事件   每个集线器(如果您只打算使用其中一个)。当。。。的时候   建立连接后,集线器的客户端方法的存在   代理告诉SignalR触发OnConnected事件。如果你   在调用start方法之前不要注册任何事件处理程序,   将能够调用集线器上的方法,但是集线器的OnConnected   方法不会被调用,并且不会从调用任何客户端方法   服务器。