Bir hub dışında ileti göndermeSend messages from outside a hub

Tarafından Mikael MengistuBy Mikael Mengistu

SignalR hub'ı, SignalR sunucuya bağlı istemcilere ileti göndermek için çekirdek soyutlamadır.The SignalR hub is the core abstraction for sending messages to clients connected to the SignalR server. Diğer yerlerden uygulama kullanarak ileti göndermek mümkündür IHubContext hizmeti.It's also possible to send messages from other places in your app using the IHubContext service. Bu makalede, bir SignalR erişmeye açıklanmaktadır IHubContext hub dışında istemcilere bildirimleri göndermek için.This article explains how to access a SignalR IHubContext to send notifications to clients from outside a hub.

Görüntüleme veya indirme örnek kodu (karşıdan yükleme)View or download sample code (how to download)

IHubContext örneğini alGet an instance of IHubContext

ASP.NET Core SignalR öğesinde bir örneğini erişebileceğiniz IHubContext aracılığıyla bağımlılık ekleme.In ASP.NET Core SignalR, you can access an instance of IHubContext via dependency injection. Örneği ekleyebilir IHubContext bir denetleyici, ara yazılım veya diğer DI hizmeti.You can inject an instance of IHubContext into a controller, middleware, or other DI service. İstemcilere göndermek için örneği kullanın.Use the instance to send messages to clients.

Not

Bu, ASP.NET tarafından farklıdır 4.x GlobalHost erişim sağlamak için kullanılan SignalR IHubContext.This differs from ASP.NET 4.x SignalR which used GlobalHost to provide access to the IHubContext. ASP.NET Core, bu genel tekil gereksinimini ortadan kaldırır, bir bağımlılık ekleme çerçeve vardır.ASP.NET Core has a dependency injection framework that removes the need for this global singleton.

Bir denetleyici IHubContext örneğinde eklemeInject an instance of IHubContext in a controller

Örneği ekleyebilir IHubContext , oluşturucuya ekleyerek bir denetleyici içinde:You can inject an instance of IHubContext into a controller by adding it to your constructor:

public class HomeController : Controller
{
    private readonly IHubContext<NotificationHub> _hubContext;

    public HomeController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}

Şimdi, örneğine erişimi olan IHubContext, hub içinde değilmiş gibi hub yöntemlerini çağırabilirsiniz.Now, with access to an instance of IHubContext, you can call hub methods as if you were in the hub itself.

public async Task<IActionResult> Index()
{
    await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
    return View();
}

Ara yazılım IHubContext örneğinde AlGet an instance of IHubContext in middleware

Erişim IHubContext ara yazılım ardışık düzenini içinde şu şekilde:Access the IHubContext within the middleware pipeline like so:

app.Use(async (context, next) =>
{
    var hubContext = context.RequestServices
                            .GetRequiredService<IHubContext<MyHub>>();
    //...
});

Not

Ne zaman hub yöntemleri çağrıldığında gelen dışında Hub çağırmayla ilgili hiçbir arayan olduğunda, sınıf.When hub methods are called from outside of the Hub class, there's no caller associated with the invocation. Bu nedenle, erişim yoktur ConnectionId, Caller, ve Others özellikleri.Therefore, there's no access to the ConnectionId, Caller, and Others properties.

Kesin türü belirtilmiş bir HubContext eklemeInject a strongly-typed HubContext

Hub'ınıza devraldığı kesin türü belirtilmiş bir HubContext eklemesine olun Hub<T>.To inject a strongly-typed HubContext, ensure your Hub inherits from Hub<T>. Kullanarak ekleme IHubContext<THub, T> arabirimi yerine IHubContext<THub>.Inject it using the IHubContext<THub, T> interface rather than IHubContext<THub>.

public class ChatController : Controller
{
    public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; }

    public ChatController(IHubContext<ChatHub, IChatClient> chatHubContext)
    {
        _strongChatHubContext = chatHubContext;
    }

    public async Task SendMessage(string message)
    {
        await _strongChatHubContext.Clients.All.ReceiveMessage(message);
    }
}