Как в ASP.NET Core SignalR отправить сообщение с сервера клиенту?

Я успешно настроил сервер и клиент SignalR, используя недавно выпущенный ASP.NET Core 2.1. Я создал чат-комнату, заставив ChatHub расширить Hub: всякий раз, когда от клиента приходит сообщение, сервер отправляет его обратно через Clients.Others.

Я еще не понимаю, как отправлять сообщение клиентам не в качестве ответа на входящее сообщение. Если сервер работает и дает результат, как мне получить доступ к Hub, чтобы отправлять сообщения конкретным клиентам? (Или мне вообще нужен доступ к Hub? Есть ли другой способ отправлять сообщения?)

Поиск этой проблемы затруднен, поскольку большинство результатов поступает из старых версий ASP.NET и SignalR.


person TheBuzzSaw    schedule 10.06.2018    source источник
comment
Сам не пробовал, но это видео может быть тем, что вам нужно: Уведомление в реальном времени с помощью SignalR в asp net основное приложение mvc   -  person Peter B    schedule 11.06.2018
comment
github.com/aspnet/SignalR/issues/182   -  person Lex Li    schedule 11.06.2018


Ответы (3)


Вы можете внедрить класс IHubContext<T> в службу и с его помощью вызывать клиентов.

public class NotifyService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotifyService(IHubContext<ChatHub> hub)
    {
        _hub = hub;
    }

    public Task SendNotificationAsync(string message)
    {
        return _hub.Clients.All.SendAsync("ReceiveMessage", message);
    }
}

Теперь вы можете внедрить NotifyService в свой класс и отправлять сообщения всем клиентам:

public class SomeClass
{
    private readonly NotifyService _service;

    public SomeClass(NotifyService service)
    {
        _service = service;
    }

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}
person Simply Ged    schedule 11.06.2018
comment
Я могу быть немного наивным в отношении ASP, но как эта служба помогает мне отправлять сообщения? Если у меня есть какая-то HandleEvent функция в другом месте моего кода (за пределами большей части территории ASP), как мне получить доступ к этой службе, создать ее экземпляр и использовать? - person TheBuzzSaw; 14.06.2018
comment
Основываясь на вашем вопросе, я подумал, что вы пытаетесь отправить сообщение из другой части приложения ASP. Если вы пытаетесь сделать это из другого проекта / приложения, вам нужно будет вызвать API, чтобы отправить за вас сообщение. Если у вас есть пример кода того, что вы пытаетесь сделать, это может помочь прояснить ситуацию. - person Simply Ged; 15.06.2018
comment
Я исправил свое понимание того, как работают службы ASP.NET, и теперь этот ответ имеет значительно больший смысл. Думаю, это то, что мне нужно. - person TheBuzzSaw; 22.06.2018
comment
Пара изменений: InvokeAsync теперь SendAsync (github.com/aspnet/SignalR/issues/1300) и не забудьте добавить пространство имен using Microsoft.AspNetCore.SignalR;, чтобы получить необходимые методы расширения. См. Также github.com/aspnet/SignalR/issues/2239. - person Simon_Weaver; 06.06.2019

Просто вставьте hubcontext в класс, в котором вы используете hubcontext.

Подробности вы найдете там:

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

person Stephu    schedule 12.06.2018

Теперь есть официальные документы Microsoft для SignalR HubContext, которые отвечают на ваш вопрос https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

Но да, как указывали другие, вам нужно получить экземпляр IHubContext через внедрение зависимостей для доступа к методам концентратора за пределами концентратора.

person Mikael Mengistu    schedule 19.06.2018