--- title: SignalR HubContext author: bradygaster description: Learn how to use the ASP.NET Core SignalR HubContext service for sending notifications to clients from outside a hub. monikerRange: '>= aspnetcore-2.1' ms.author: bradyg ms.custom: mvc ms.date: 11/12/2019 no-loc: [Home, Privacy, Kestrel, appsettings.json, "ASP.NET Core Identity", cookie, Cookie, Blazor, "Blazor Server", "Blazor WebAssembly", "Identity", "Let's Encrypt", Razor, SignalR, IHubContext] uid: signalr/hubcontext --- # Send messages from outside a hub By [Mikael Mengistu](https://twitter.com/MikaelM_12) The SignalR hub is the core abstraction for sending messages to clients connected to the SignalR server. It's also possible to send messages from other places in your app using the `IHubContext` service. This article explains how to access a SignalR `IHubContext` to send notifications to clients from outside a hub. [View or download sample code](https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/signalr/hubcontext/sample/) [(how to download)](xref:index#how-to-download-a-sample) ## Get an instance of IHubContext In ASP.NET Core SignalR, you can access an instance of `IHubContext` via dependency injection. You can inject an instance of `IHubContext` into a controller, middleware, or other DI service. Use the instance to send messages to clients. > [!NOTE] > This differs from ASP.NET 4.x SignalR which used GlobalHost to provide access to the `IHubContext`. ASP.NET Core has a dependency injection framework that removes the need for this global singleton. ### Inject an instance of IHubContext in a controller You can inject an instance of `IHubContext` into a controller by adding it to your constructor: [!code-csharp[IHubContext](hubcontext/sample/Controllers/HomeController.cs?range=12-19,57)] Now, with access to an instance of `IHubContext`, you can call hub methods as if you were in the hub itself. [!code-csharp[IHubContext](hubcontext/sample/Controllers/HomeController.cs?range=21-25)] ### Get an instance of IHubContext in middleware Access the `IHubContext` within the middleware pipeline like so: ```csharp app.Use(async (context, next) => { var hubContext = context.RequestServices .GetRequiredService>(); //... if (next != null) { await next.Invoke(); } }); ``` > [!NOTE] > When hub methods are called from outside of the `Hub` class, there's no caller associated with the invocation. Therefore, there's no access to the `ConnectionId`, `Caller`, and `Others` properties. ### Get an instance of IHubContext from IHost Accessing an `IHubContext` from the web host is useful for integrating with areas outside of ASP.NET Core, for example, using third-party dependency injection frameworks: ```csharp public class Program { public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); var hubContext = host.Services.GetService(typeof(IHubContext)); host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); } ``` ### Inject a strongly-typed HubContext To inject a strongly-typed HubContext, ensure your Hub inherits from `Hub`. Inject it using the `IHubContext` interface rather than `IHubContext`. ```csharp public class ChatController : Controller { public IHubContext _strongChatHubContext { get; } public ChatController(IHubContext chatHubContext) { _strongChatHubContext = chatHubContext; } public async Task SendMessage(string user, string message) { await _strongChatHubContext.Clients.All.ReceiveMessage(user, message); } } ``` See [Strongly typed hubs](xref:signalr/hubs#strongly-typed-hubs) for more information. ## Related resources * [Get started](xref:tutorials/signalr) * [Hubs](xref:signalr/hubs) * [Publish to Azure](xref:signalr/publish-to-azure-web-app)