Вызов клиентов-концентраторов SignalR из других систем

Я установил концентратор 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"), но я не могу заставить его работать.

Любая помощь с этим была бы чрезвычайно оценена

Ответ 1

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

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

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

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

Ответ 2

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

В wiki вы можете использовать:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();

Ответ 3

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

  • Инициирование путем инъекции зависимостей, как это -

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

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

_hub.Clients.All.onBulletinSent(bulletinToSend);

Подробнее можно найти здесь.

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

Ответ 4

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

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

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

Ответ 5

Это изменилось в .NET Core 2, теперь вы можете использовать внедрение зависимостей следующим образом:

    private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;

    public MyController(MyHub,IMyHubInterface hubContext)
    {
        _hubContext = hubContext;
    }

    public bool SendViaSignalR()
    {
        _hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
        return true;
    }