Search code examples
c#asp.net-coreasp.net-core-signalr

In ASP.NET Core SignalR, how do I send a message from the server to a client?


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.


Solution

  • 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.SendAsync("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);
        }
    }