【问题标题】:How to add additional handlers to an existing connection?如何向现有连接添加额外的处理程序?
【发布时间】:2019-05-22 11:33:54
【问题描述】:

在我的 MVC 5 应用程序中,我在页面加载时在客户端设置 Signal R 连接,这按预期工作。

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

页面加载时的连接设置

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

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

【问题讨论】:

  • 您是否尝试过在函数之外声明集线器,然后只声明一次,然后每次需要添加新客户端时使用它?而且 mybe 每次添加新客户时都需要停止 + 启动..

标签: javascript signalr


【解决方案1】:

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

何时使用生成的代理

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

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

注意

通常在调用 start 方法之前注册事件处理程序 建立连接。如果你想注册一些事件 建立连接后的处理程序,您可以这样做,但是您 在调用 启动方法。造成这种情况的一个原因是在一个 应用程序,但您不想触发 OnConnected 事件 每个集线器,如果您只使用其中一个集线器。当。。。的时候 连接建立后,Hub 上存在客户端方法 proxy 告诉 SignalR 触发 OnConnected 事件。如果你 在调用 start 方法之前不要注册任何事件处理程序,你 将能够调用集线器上的方法,但集线器的 OnConnected 方法不会被调用,也不会从客户端调用任何客户端方法 服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 2011-01-20
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多