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

Get Hub Context in SignalR Core from within another object


I am using Microsoft.AspNetCore.SignalR (latest release) and would like to get the hub context from within another object that's not a Controller. In the "full" SignalR, I could use GlobalHost.ConnectionManager.GetHubContext<MyCoolHub>();

I have seen a lot of examples of just adding Microsoft.AspNetCore.SignalR.IHubContext<MyCoolHub> as a parameter to the Ctor of a Controller, but no examples (that work) for otherwise.

ETA:

So, this is what I have working. Is this hacky?

public class MyHub : Hub
    public static IHubContext<MyHub> GlobalContext { get; private set; }
    public MyHub(IHubContext<MyHub> ctx){
        GlobalContext = ctx;
    }
}

Then I can call it as so:

await MyHub.GlobalContext.Clients.All.InvokeAsync(...)

Solution

  • Just set IHubContext<MyHub> hubContext on calling-side constructor.

    I would recommend using .net core default DI container mechanism, not creating static property.

    Please refer to How do I get a reference to a Hub?

    public class MyHub : Hub
    {
    }
    
    public class CallingSideClass
    {
        private readonly IHubContext<MyHub> _hubContext;
    
        public CallingSideClass(IHubContext<MyHub> hubContext)
        {
            _hubContext = hubContext;
        }
    
        public async Task FooMethod(...)
        {
            await _hubContext.Clients.All.InvokeAsync(...);
        }
    }
    
    public class Startup
    {...
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR();
            services.AddScoped<CallingSideClass>();
        }
        ... 
    }