web-dev-qa-db-fra.com

Dans ASP.NET Core SignalR, comment puis-je envoyer un message du serveur à un client?

J'ai correctement configuré un serveur et un client SignalR à l'aide de la nouvelle version d'ASP.NET Core 2.1. J'ai construit une salle de conversation en faisant ma ChatHub extend Hub: chaque fois qu'un message arrive d'un client, le serveur le rediffuse via Clients.Others.

Ce que je ne comprends pas encore, c'est comment envoyer un message aux clients pas en réponse à un message entrant. Si le serveur fonctionne et produit un résultat, comment puis-je accéder à la variable Hub afin d'envoyer un message à des clients particuliers? (Ou ai-je même besoin d'accéder à la Hub? Existe-t-il un autre moyen d'envoyer des messages?)

Il est difficile de rechercher ce problème car la plupart des résultats proviennent d'anciennes versions d'ASP.NET et de SignalR.

4
TheBuzzSaw

Vous pouvez injecter la classe IHubContext<T> dans un service et appeler les clients qui l'utilisent.

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

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

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

Maintenant, vous pouvez injecter la NotifyService dans votre classe et envoyer des messages à tous les clients:

public class SomeClass
{
    private readonly NotifyService _service;

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

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}
6
Simply Ged

Il existe désormais des documents Microsoft officiels pour SignalR HubContext qui répondent à votre question https://docs.Microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

Mais oui, comme d'autres l'ont souligné, vous devez obtenir une instance de IHubContext via une injection de dépendance pour accéder aux méthodes de hub en dehors du hub. 

1
Mikael Mengistu

Simple injecte le hubcontext dans la classe où vous utilisez le hubcontext. 

Les détails que vous trouverez ici:

Appelez la méthode SignalR Core Hub depuis Controller

0
Stephu