Hub dışından ileti göndermeSend messages from outside a hub

X MIKAEL Mengistu tarafındanBy Mikael Mengistu

SignalRHub, sunucuya bağlı istemcilere ileti göndermeye yönelik temel soyutlamadır SignalR .The SignalR hub is the core abstraction for sending messages to clients connected to the SignalR server. Ayrıca, hizmetini kullanarak uygulamanızdaki diğer yerlerden ileti göndermek de mümkündür IHubContext .It's also possible to send messages from other places in your app using the IHubContext service. Bu makalede, bir SignalR IHubContext hub dışından istemcilere bildirim göndermek üzere bir öğesine nasıl erişebileceğiniz açıklanır.This article explains how to access a SignalR IHubContext to send notifications to clients from outside a hub.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)View or download sample code (how to download)

Iubcontext 'in bir örneğini alGet an instance of IHubContext

ASP.NET Core SignalR , IHubContext bağımlılık ekleme aracılığıyla bir örneğine erişebilirsiniz.In ASP.NET Core SignalR, you can access an instance of IHubContext via dependency injection. IHubContextBir denetleyiciye, ara yazılıma veya diğer BIR dı hizmetine bir örneğini ekleyebilirsiniz.You can inject an instance of IHubContext into a controller, middleware, or other DI service. İstemcilere ileti göndermek için örneği kullanın.Use the instance to send messages to clients.

Not

Bu SignalR , ' ye erişim sağlamak Için GlobalHost kullanan ASP.NET 4. x öğesinden farklıdır IHubContext .This differs from ASP.NET 4.x SignalR which used GlobalHost to provide access to the IHubContext. ASP.NET Core, bu genel Singleton gereksinimini ortadan kaldıran bir bağımlılık ekleme çerçevesine sahiptir.ASP.NET Core has a dependency injection framework that removes the need for this global singleton.

Denetleyiciye bir ıubcontext örneği eklemeInject an instance of IHubContext in a controller

IHubContextYapıcısına ekleyerek bir denetleyiciye bir örneğini ekleyebilirsiniz: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;
    }
}

Artık bir örneğine erişimle, hub 'ın IHubContext kendisinde olduğu 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 içindeki bir ıubcontext örneği alınGet an instance of IHubContext in middleware

Şu IHubContext şekilde ara yazılım ardışık düzeninde erişin:Access the IHubContext within the middleware pipeline like so:

app.Use(async (context, next) =>
{
    var hubContext = context.RequestServices
                            .GetRequiredService<IHubContext<ChatHub>>();
    //...
    
    if (next != null)
    {
        await next.Invoke();
    }
});

Not

Hub yöntemleri, sınıf dışından çağrıldığında Hub , çağırma ile ilişkili bir arayan yoktur.When hub methods are called from outside of the Hub class, there's no caller associated with the invocation. Bu nedenle,, ve özelliklerine erişim yoktur ConnectionId Caller Others .Therefore, there's no access to the ConnectionId, Caller, and Others properties.

IHOST 'dan bir ıubcontext örneği alGet an instance of IHubContext from IHost

IHubContextWeb ana bilgisayarına erişmek, örneğin 3. taraf bağımlılığı ekleme çerçevelerini kullanarak ASP.NET Core dışındaki alanlarla tümleştirme için yararlıdır:Accessing an IHubContext from the web host is useful for integrating with areas outside of ASP.NET Core, for example, using 3rd party dependency injection frameworks:

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            var hubContext = host.Services.GetService(typeof(IHubContext<ChatHub>));
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder => {
                    webBuilder.UseStartup<Startup>();
                });
    }

Türü kesin belirlenmiş bir HubContext EkleInject a strongly-typed HubContext

Türü kesin belirlenmiş bir HubContext eklemek için hub 'ınızın öğesinden devralındığından emin olun Hub<T> .To inject a strongly-typed HubContext, ensure your Hub inherits from Hub<T>. Yerine arabirimini kullanarak ekleme IHubContext<THub, T> 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);
    }
}