【问题标题】:SignalR changing hub subscriptionSignalR 更改集线器订阅
【发布时间】:2016-11-25 08:56:03
【问题描述】:

我有一个简单的应用程序,它显示可用 signalR 集线器的列表。用户选择一个集线器并将其连接到它,这会订阅一个事件以将消息添加到页面上的表中。然后,用户可以向该集线器发送消息,该集线器还将触发订阅,将该消息添加到表中。这一切都很好。

现在,如果用户选择另一个中心,应用程序会连接并设置新订阅,但原始订阅仍会触发,从而导致重复消息添加到表中。每次更改集线器时,都会添加更多订阅,从而导致一次发送导致表中出现许多消息。

我已尝试断开集线器、处置集线器并尝试使用 hubProxy.off(eventName) 删除订阅,但除了重新加载页面外,似乎没有任何效果。

这是我刚刚添加了 onHub 更改函数的代码,因为这是所有事情发生的地方。

任何想法表示赞赏。 :)

function HubViewModel() {
    var self = this;
    self.hubConnection = '';
    self.hub = '';

    $.getScript("../signalR/hubs");

    self.hubs = ko.observableArray();
    self.selectedHub = ko.observable();
    self.messageText = ko.observable();
    self.messageCollection = ko.observableArray();

    self.hubChanged = function () {

        // Setup hub connection.
        $.connection.hub.url = "../signalR";
        self.hubConnection = $.hubConnection();

        // Get the selected hub name.
        var selectedHubName;
        _.each(self.hubs(), function(item) {
            if (item.hubId == self.selectedHub()) {
                selectedHubName = item.hubName;
            }
        });

        // Check for a selected connection
        if (self.selectedHub()) {

            // Create proxy.
            self.hub = self.hubConnection.createHubProxy(selectedHubName);

            // Remove any existing listener(s).
            self.hub.off('addNewMessageToPage');

            // Setup listener.
            self.hub.On('addNewMessageToPage', function (sender, message) {
                self.messageCollection().push({ hubName: selectedHubName, name: selectedHubName, message: message, dateTime: new Date().toLocaleString() });
                $('#hubMessageGrid').dxDataGrid('instance').refresh();
            });

            // start connection.
            self.hubConnection.start()
                .done(function() {
                    toastr.success('hub connected');
                    $('#sendMessageButton').click(function() {
                        self.hub.invoke('sendAll', 'hub management page', self.messageText());
                        self.messageText('');
                    });

                })
                .fail(function(error) {
                    toastr.error('hub connection ' + error);
                });
        }
    };

【问题讨论】:

    标签: javascript c# asp.net signalr


    【解决方案1】:

    您可以通过调用 self.hub.stop(); 先断开集线器的连接;功能

    【讨论】:

      【解决方案2】:

      取消订阅时,您需要传递完全相同的处理程序实例。传递不同的实例(即使函数体相同)不会删除处理程序。 见https://docs.microsoft.com/en-us/javascript/api/@microsoft/signalr/hubconnection?view=signalr-js-latest#off-string---args--any-------void-

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2015-08-22
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        相关资源
        最近更新 更多