Як використовувати екземпляр концентратора SignalR поза межами лінії hubpipleline


81

Я використовую SignalR для трансляції повідомлень усім своїм клієнтам. Мені потрібно ініціювати трансляцію за межами мого класу-концентратора, тобто щось подібне нижче:

var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat");

Я отримую повідомлення про помилку як:

Використання екземпляра концентратора, не створеного HubPipeline, не підтримується.

Відповіді:


140

Вам потрібно використовувати GetHubContext:

var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");

Це більш докладно описано на http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub .


4
"context.Clients.All.Send" не транслюється назад до абонента, лише до інших. будь-які ідеї?
user384080

4
Якщо ви використовуєте GetHubContext, немає абонента, оскільки він призначений для використання поза хабом. Clients.Allповинен звертатися до кожного клієнта, який наразі підключений до концентратора.
halter73

5
У мене такий самий код, але метод Send або будь-який інший метод не буде викликаний.
nAviD

5
Це не дає вам екземпляра концентратора, воно дає вам екземпляр IHubContext. Ви не можете використовувати це для виклику методів концентратора.
Джордж Мауер

4
Це спрацювало для мене з ОДНОЮ зміною: context.Clients.All.broadcastMessage("Admin", "stop the chat"); Використовуйте трансляціюMessage замість Send.
Wheel Builder

4

Невелике оновлення для тих, хто, можливо, цікавиться, куди GlobalHostподілося. SignalR повністю переписаний для ядра .net. Отже, якщо ви використовуєте пакет SignalR.Core ( різниця між версіями SignalR ), ви отримуєте екземпляр контексту концентратора SignalR, вводячи його у свою службу:

public class MyNeedyService
{
    private readonly IHubContext<MyHub> ctx;

    public MyNeedyService(IHubContext<MyHub> ctx)
    {
        this.ctx = ctx;
    }

    public async Task MyMethod()
    {
        await this.ctx.All.SendAsync("clientCall");
    }
}

І в Startup.cs:

services.AddSignalR()/*.AddAzureSignalR("...")*/;

Документ Microsoft тут: надсилайте повідомлення SignalR з-поза центру .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.