Вызов клиентов-концентраторов SignalR из других мест системы - PullRequest
71 голосов
/ 03 октября 2011

Я установил концентратор SignalR для связи между сервером и клиентом.Код на стороне хаб-сервера хранится в классе Hooking.cs.Я хочу иметь возможность вызывать метод, определенный в Hooking.cs, чтобы позволить мне транслировать сообщения любым подключенным клиентам из любой точки моего приложения.Кажется, что новый экземпляр Hooking.cs создается для каждого вызова клиент / сервер, поэтому я надеялся, что смогу использовать что-то вроде

var hooking = new Hooking();
hooking.Test();

с методом Test (), определенным в Hooking.cs, такие как

public static void Test() {
    Clients.test()
}

и с клиентской стороны javascript

var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()

К сожалению, это не так просто, так как клиенты не являются статичными, поэтому не доступны изстатический метод.

Просматривая исходный код SignalR, я натолкнулся на метод, который выглядел многообещающе, Hubs.Invoke(string hubName, string method, params object[] args), поэтому я надеюсь, что смогу использовать что-то вроде Hubs.Invoke("Hooking", "Test"), но не могу заставить его работать.

Любая помощь с этим будет очень признателен

Ответы [ 4 ]

109 голосов
/ 06 июня 2012

Это правильный путь для SignalR 2.x:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);

По сути, вы можете использовать преобразователь зависимостей для текущего хоста для разрешения интерфейса IConnectionManager, который позволяет вам получить доступ кобъект контекста для концентратора.

Дополнительную информацию можно найти в официальной документации .

23 голосов
/ 07 февраля 2012

Hub.GetClients исчез в версии 0.4.0.

Из вики теперь вы можете использовать:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
6 голосов
/ 06 января 2017

Вы можете легко использовать концентратор , выполнив следующие 2 шага -

  1. Инстанцирование путем внедрения зависимостей, как это-

    public class ClassName
    {
        ........
        ........
        private IHubContext _hub;
    
        public BulletinSenderController(IConnectionManager connectionManager)
        {
            _hub = connectionManager.GetHubContext<McpHub>();
            ........
            ........
        }
    
        ............
        ............
    }
    

2.Используя подобный объект hub -

_hub.Clients.All.onBulletinSent(bulletinToSend);

Больше можно найти здесь .

Примеркод можно найти в этом репозитории .

1 голос
/ 03 октября 2011

Посмотрите, как это делается в Chat.cs в SignalR.Samples.Hubs.Chat из https://github.com/SignalR/SignalR.

Я вижу там, что статические Dictionary<TKey, TValue> создаются наверху, так что я думаю, что они тоже поддерживаются постоянно, либо с классом Chat, который является постоянным экземпляром (?), Или с тем, что массив обновляется как-то.

Проверьте это, Дэвид Фаулер, вероятно, будет лучшим в этом.

...