Search code examples
asp.net-mvcactionmessagesignalrsignalr-hub

SignalR + posting a message to a Hub via an action method


I am using the hub- feature of SignalR (https://github.com/SignalR/SignalR) to publish messages to all subscribed clients:

public class NewsFeedHub : Hub
public void Send(string channel, string content)
{
    Clients[channel].addMessage(content);
}

This works fine when calling "Send" via Javascript, but I would also like the web application to publish messages (from within an ASP.NET MVC action method). I already tried instantiating a new object ob NewsFeedHub and calling the Send method, but this results in an error (as the underlying "Connection" of the Hub is not set). Is there a way to use the Hub without a connection?


Solution

  • Please note that the SignalR API has changed multiple times since this question was asked. There is a chance that some answers will become out of date.

    There is another updated answer for this, as seen in the SignalR Wiki

    c#

    public ActionResult MyControllerMethod()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.All.methodInJavascript("hello world");
        // or
        context.Clients.Group("groupname").methodInJavascript("hello world");
    }
    

    vb.net

    Public Function MyControllerMethod() As ActionResult
        Dim context = GlobalHost.ConnectionManager.GetHubContext(Of MyHub)()
        context.Clients.All.methodInJavascript("hello world")
        '' or
        context.Clients.Group("groupname").methodInJavascript("hello world")
    End Function
    

    Update

    This code has been updated. Follow http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server for changes.

    If you are using DI container

    If you are using a DI container to wire up your hubs, get IConnectionManager from your container, and call GetHubContext on that connectionManager.