Отправлять сообщения с сервера на клиент через SignalR в .NET Core - PullRequest
1 голос
/ 26 сентября 2019

Я хочу отправлять сообщения с сервера (из класса, а не из контроллера) через концентратор SignalR.

Концентратор работает для сообщений, исходящих от клиента, но не для сообщений от сервера.

Я пробовал несколько методов, которые, кажется, не работают.Например, я попытался извлечь контекст концентратора, используя: GlobalHost.ConnectionManager.GetHubContext<MyHub>(), но безуспешно.

Каков наилучший и современный способ сделать это в .NET Core?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вы можете добавить контекст в своем классе как сервис.Ваш класс должен быть инициализирован через DI и добавлен как сервис.Нет никакой разницы между классом или контроллером.

public class SomeClass
{
    public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; }

    public SomeClass(IHubContext<ChatHub, IChatClient> chatHubContext)
    {
        _strongChatHubContext = chatHubContext;
    }

    public async Task SendMessage(string message)
    {
        await _strongChatHubContext.Clients.All.ReceiveMessage(message);
    }
}

Вы также можете получить услугу, подобную следующей, добавив IHttpContextAccessor

var _strongChatHubContext = httpContextAccessor.HttpContext.RequestServices.GetRequiredService<IHubContext<ChatHub, IChatClient>>()

ссылка: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

0 голосов
/ 26 сентября 2019

Сначала вам нужно где-то создать экземпляр вашего хаба (обычно, когда ваше приложение загружается).

MyHub myHub = new MyHub();

Затем в вашем классе добавить контекст:

private readonly IHubContext<NotifyHub, ITypedHubClient> hubContext;

И в вашем классеметод просто вызвать концентратор:

hubContext.Clients.All.yourHubMethod(yourPayload);
...