Send signalr message from server to all clients

Viewed 29967

This is related to SignalR + posting a message to a Hub via an action method, but my question is a bit different:

I'm on version 0.5.2 of signalr, using hubs. In older versions, you were encouraged to create methods on the hub to send messages to all clients, which is what I have:

public class MyHub : Hub
{
    public void SendMessage(string message)
    {
        // Any other logic here
        Clients.messageRecieved(message);
    }

    ...
}

So in 0.5.2, I want to send a message to all the clients (say from somewhere in the controller). How can I get access to the MyHub instance?

The only way I've seen referenced is:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.messageRecieved("hello");

Which is fine, but I want to call the method on my hub.

3 Answers

Update for ASP.NET Core 2.x and 3.x:

You can easily access the Hub instance anywhere that you have Dependency Injection:

public class HomeController : Controller
{
    private readonly IHubContext<MyHub> _myHubContext;

    public HomeController(IHubContext<MyHub> myHubContext)
    {
        _myHubContext = myHubContext;
    }

    public void SendMessage(string msg)
    {
        _myHubContext.Clients.All.SendAsync("MessageFromServer", msg);
    }
}

If it gives you syntax errors, make sure you have:

using Microsoft.AspNetCore.SignalR;

and that you do NOT HAVE:

using Microsoft.AspNet.SignalR;
Related