I've successfully setup a SignalR server and client using the newly released ASP.NET Core 2.1. I built a chat room by making my ChatHub
extend Hub
: whenever a message comes in from a client, the server blasts it back out via Clients.Others
.
What I do not yet understand is how to send a message to clients not as a response to an incoming message. If the server is doing work and produces a result, how do I gain access to the Hub
in order to message particular clients? (Or do I even need access to the Hub
? Is there another way to send messages?)
Searching this issue is difficult as most results come from old versions of ASP.NET and SignalR.
You can inject the IHubContext<T>
class into a service and call the clients using that.
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);
}
}
Now you can inject the NotifyService
into your class and send messages to all clients:
public class SomeClass
{
private readonly NotifyService _service;
public SomeClass(NotifyService service)
{
_service = service;
}
public Task Send(string message)
{
return _service.SendNotificationAsync(message);
}
}