SignalR menyediakan ConnectionId untuk setiap koneksi. Untuk mengetahui koneksi mana yang dimiliki siapa (pengguna), kita perlu membuat pemetaan antara koneksi dan pengguna. Ini tergantung pada bagaimana Anda mengidentifikasi pengguna dalam aplikasi Anda.
Di SignalR 2.0, ini dilakukan dengan menggunakan inbuilt IPrincipal.Identity.Name
, yang merupakan pengenal pengguna yang masuk sebagaimana ditetapkan selama otentikasi ASP.NET.
Namun, Anda mungkin perlu memetakan koneksi dengan pengguna menggunakan pengenal yang berbeda daripada menggunakan Identity.Name. Untuk tujuan ini, penyedia baru ini dapat digunakan dengan implementasi kustom Anda untuk memetakan pengguna dengan koneksi.
Contoh Pemetaan Pengguna SignalR ke Koneksi menggunakan IUserIdProvider
Anggaplah aplikasi kita menggunakan a userId
untuk mengidentifikasi setiap pengguna. Sekarang, kita perlu mengirim pesan ke pengguna tertentu. Kami memiliki userId
dan message
, tetapi SignalR juga harus mengetahui pemetaan antara userId kami dan koneksi.
Untuk mencapai ini, pertama kita perlu membuat kelas baru yang mengimplementasikan IUserIdProvider
:
public class CustomUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// your logic to fetch a user identifier goes here.
// for example:
var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
return userId.ToString();
}
}
Langkah kedua adalah memberi tahu SignalR untuk menggunakan kami CustomUserIdProvider
alih - alih implementasi default. Ini dapat dilakukan di Startup.cs saat menginisialisasi konfigurasi hub:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new CustomUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
Sekarang, Anda dapat mengirim pesan ke pengguna tertentu menggunakan miliknya userId
seperti yang disebutkan dalam dokumentasi, seperti:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Semoga ini membantu.