SignalR одно соединение, несколько концентраторов, несколько обработчиков - PullRequest
0 голосов
/ 29 марта 2020

В идеале я надеюсь получить одно соединение с несколькими концентраторами, НО иметь клиентские обработчики, которые должны быть обработаны после начала соединения.

Что работает:

  • с несколькими подключениями в концентратор и регистрация обработчиков перед подключением - я хочу обрезать как можно больше соединений, а также, возможно, не знаю / не хочу заранее регистрировать все обработчики
  • необходимость останавливаться и запускаться каждый раз при регистрации нового - это проблематично c, как вы могли бы потенциально прервать другое сообщение в другом месте
        //multiple connections method = works
        var _page_connection = $.hubConnection();
        var _page_connection2 = $.hubConnection();
        function connectionOne() {
            var proxy1 = _page_connection.createHubProxy('hub_Echo');
            if (_page_connection && _page_connection.state === $.signalR.connectionState.disconnected) {
                proxy1.on('echo', function (msg) { console.log('Echo1: ' + msg); });
                _page_connection.start()
                    .done(function () { console.log('Now connected, connection ID=' + _page_connection.id); })
                    .fail(function () { console.log('Could not connect'); });
            } else {
                console.log('Already connected, connection ID=' + _page_connection.id);
                proxy1.on('echo', function (msg) { console.log('Echo1: ' + msg); });
                _page_connection.start()
                    .done(function () { console.log('Connected again, connection ID=' + _page_connection.id); })
                    .fail(function () { console.log('Could not connect'); });
            }
            $('#btn_echosend').on('click', function () {
                proxy1.invoke('echo', 'marco');
            });
        }

        function connectionTwo() {
            var proxy2 = _page_connection2.createHubProxy('hub_Echo2');
            if (_page_connection2 && _page_connection2.state === $.signalR.connectionState.disconnected) {
                proxy2.on('echo2', function (msg) { console.log('Echo2: ' + msg); });
                _page_connection2.start()
                    .done(function () { console.log('Now connected, connection ID=' + _page_connection2.id); })
                    .fail(function () { console.log('Could not connect'); });
            } else {
                console.log('Already connected, connection ID=' + _page_connection.id);
                proxy2.on('echo2', function (msg) { console.log('Echo2: ' + msg); });
                _page_connection2.start()
                    .done(function () { console.log('Connected again, connection ID=' + _page_connection2.id); })
                    .fail(function () { console.log('Could not connect'); });
            }
            $('#btn_echosend2').on('click', function () {
                proxy2.invoke('echo2', 'polo');
            });
        }

Что не работает:

  • Использование официальной документации «Определить метод на клиенте (без сгенерированный прокси или при добавлении после вызова метода start) "https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#how -to-get-a-proxy-for-a-hub-class - это работает, только если обработчик добавлен в тот же соединение с концентратором, которое уже было запущено ранее. Если вы начинаете подключение к новому концентратору, новый обработчик не будет регистрироваться, поскольку ранее концентратор не имел обработчика, подключенного к OnConnect
  • Наткнулся на @ Steve Greatrex сайт об этом та же проблема но его реализация тоже не сработала. Возможно, я что-то сделал неправильно
        function SignalRClient(methods) {
            this._handlers = {};
            methods.forEach(this.registerHandler.bind(this));
        }

        SignalRClient.prototype.invokeHandler = function (name) {
            var handler = this._handlers[name];
            if (handler) {
                var handlerArgs = Array.prototype.slice.call(arguments, 1);
                handler.apply(this, handlerArgs);
            }
        };

        SignalRClient.prototype.registerHandler = function (name) {
            var getter = this.invokeHandler.bind(this, name);
            Object.defineProperty(this, name, {
                enumerable: true,
                get: function () {
                    return getter;
                },
                set: function (value) {
                    this._handlers[name] = value;
                }.bind(this)
            });
        };
        function connectionTwo() {             
            $.connection.hub_Echo2.client = new SignalRClient(['echo', 'echo2']);                        
            $.connection.hub_Echo2.connection.start().done(function () { console.log('Now connected, connection ID=' + $.connection.hub.id); })                    
            $.connection.hub_Echo2.client.echo = function (data) { console.log('Echo2: ' + data); };
            $('#btn_echosend2').on('click', function () {
                $.connection.hub_Echo2.server.echo('Polo');
            });
        }
        function connectionOne() {                        
            $.connection.hub_Echo.client = new SignalRClient(['echo', 'echo2']);
            $.connection.hub_Echo.connection.start().done(function () { console.log('Now connected, connection ID=' + $.connection.hub.id); })                    
            $.connection.hub_Echo.client.echo = function (data) { console.log('Echo: ' + data); };
            $('#btn_echosend').on('click', function () {
                $.connection.hub_Echo.server.echo('Marco');
            });
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...