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.
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);
}
}
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.
Simple injecte le hubcontext dans la classe où vous utilisez le hubcontext.
Les détails que vous trouverez ici: