Bagikan melalui


Mengirimkan pesan dari hub luar

Hub SignalR adalah abstraksi inti untuk mengirim pesan ke klien yang terhubung ke SignalR server. Anda juga dapat mengirim pesan dari tempat lain di aplikasi Anda menggunakan IHubContext layanan. Artikel ini menjelaskan cara mengakses SignalRIHubContext untuk mengirim pemberitahuan ke klien dari luar hub.

Catatan

IHubContext adalah untuk mengirim pemberitahuan ke klien, tidak digunakan untuk memanggil metode pada Hub.

Melihat atau mengunduh kode sampel (cara mengunduh)

Mendapatkan instans IHubContext

Di ASP.NET Core SignalR, Anda dapat mengakses instans IHubContext melalui injeksi dependensi. Anda dapat menyuntikkan instans IHubContext ke pengontrol, middleware, atau layanan DI lainnya. Gunakan instans untuk mengirim pesan ke klien.

Menyuntikkan instans IHubContext dalam pengontrol

Anda dapat menyuntikkan instans IHubContext ke pengontrol dengan menambahkannya ke konstruktor Anda:

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

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

Dengan akses ke instans IHubContext, panggil metode klien seolah-olah Anda berada di hub itu sendiri:

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

Mendapatkan instans IHubContext di middleware

IHubContext Akses dalam alur middleware seperti:

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

Catatan

Ketika metode klien dipanggil dari luar Hub kelas, tidak ada pemanggil yang terkait dengan pemanggilan. Oleh karena itu, tidak ada akses ke ConnectionIdproperti , , Callerdan Others .

Aplikasi yang perlu memetakan pengguna ke ID koneksi dan mempertahankan pemetaan tersebut dapat melakukan salah satu hal berikut:

  • Pertahankan pemetaan koneksi tunggal atau beberapa sebagai grup. Lihat Grup di SignalR untuk informasi selengkapnya.
  • Pertahankan informasi koneksi dan pengguna melalui layanan singleton. Lihat Menyuntikkan layanan ke hub untuk informasi selengkapnya. Layanan singleton dapat menggunakan metode penyimpanan apa pun, seperti:
    • Penyimpanan dalam memori dalam kamus.
    • Penyimpanan eksternal permanen. Misalnya, database atau penyimpanan Azure Table menggunakan paket NuGet Azure.Data.Tables.
  • Berikan ID koneksi antar klien.

Mendapatkan instans IHubContext dari IHost

IHubContext Mengakses dari host web berguna untuk mengintegrasikan dengan area di luar ASP.NET Core, misalnya, menggunakan kerangka kerja injeksi dependensi pihak ketiga:

    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>();
                });
    }

Menyuntikkan HubContext yang sangat ditik

Untuk menyuntikkan HubContext yang ditik dengan kuat, pastikan Hub Anda mewarisi dari Hub<T>. Suntikkan menggunakan IHubContext<THub, T> antarmuka daripada 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 user, string message)
    {
        await _strongChatHubContext.Clients.All.ReceiveMessage(user, message);
    }
}

Lihat Hub yang sangat ditik untuk informasi selengkapnya.

Gunakan IHubContext dalam kode generik

Instans yang disuntikkan IHubContext<THub> dapat ditransmisikan tanpa IHubContext jenis generik Hub yang ditentukan.

class MyHub : Hub
{ }

class MyOtherHub : Hub
{ }

app.Use(async (context, next) =>
{
    var myHubContext = context.RequestServices
                            .GetRequiredService<IHubContext<MyHub>>();
    var myOtherHubContext = context.RequestServices
                            .GetRequiredService<IHubContext<MyOtherHub>>();
    await CommonHubContextMethod((IHubContext)myHubContext);
    await CommonHubContextMethod((IHubContext)myOtherHubContext);

    await next.Invoke();
}

async Task CommonHubContextMethod(IHubContext context)
{
    await context.Clients.All.SendAsync("clientMethod", new Args());
}

Ini berguna ketika:

  • Menulis pustaka yang tidak memiliki referensi ke jenis tertentu Hub yang digunakan aplikasi.
  • Menulis kode yang umum dan dapat berlaku untuk beberapa implementasi yang berbeda Hub

Sumber Daya Tambahan: