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 ConnectionId
properti , , Caller
dan 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:
ASP.NET Core