Dalam versi terbaru Asp.Net SignalR, telah ditambahkan cara baru untuk mengirim pesan ke pengguna tertentu, menggunakan antarmuka "IUserIdProvider".
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Pertanyaan saya adalah: Bagaimana saya tahu kepada siapa saya mengirim pesan saya? Penjelasan tentang metode baru ini sangat dangkal. Dan draft Pernyataan SignalR 2.0.0 dengan bug ini dan tidak dapat dikompilasi. Adakah yang sudah menerapkan fitur ini?
Info Lebih Lanjut: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Pelukan.
Jawaban:
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 memilikiuserId
danmessage
, tetapi SignalR juga harus mengetahui pemetaan antara userId kami dan koneksi.Untuk mencapai ini, pertama kita perlu membuat kelas baru yang mengimplementasikan
IUserIdProvider
:Langkah kedua adalah memberi tahu SignalR untuk menggunakan kami
CustomUserIdProvider
alih - alih implementasi default. Ini dapat dilakukan di Startup.cs saat menginisialisasi konfigurasi hub:Sekarang, Anda dapat mengirim pesan ke pengguna tertentu menggunakan miliknya
userId
seperti yang disebutkan dalam dokumentasi, seperti:Semoga ini membantu.
sumber
app.MapSignalR();
global.asax sebelum otentikasi.Ini permulaannya .. Terbuka untuk saran / perbaikan.
Server
JavaScript
(Perhatikan bagaimana
addChatMessage
dansendChatMessage
juga metode dalam kode server di atas)Menguji
sumber
Beginilah cara menggunakan SignarR untuk menargetkan pengguna tertentu (tanpa menggunakan penyedia apa pun):
sumber
contextIdClient
tidak mengerti :(Lihat Tes SignalR untuk fitur tersebut.
Uji "SendToUser" mengambil secara otomatis identitas pengguna yang diteruskan dengan menggunakan pustaka otentikasi owin biasa.
Skenarionya adalah Anda memiliki pengguna yang telah terhubung dari beberapa perangkat / browser dan Anda ingin mengirim pesan ke semua koneksi aktifnya.
sumber
Utas lama, tetapi baru saja menemukan ini dalam sampel:
sumber