SignalR cung cấp ConnectionId cho mỗi kết nối. Để tìm kết nối thuộc về ai (người dùng), chúng ta cần tạo ánh xạ giữa kết nối và người dùng. Điều này phụ thuộc vào cách bạn xác định người dùng trong ứng dụng của mình.
Trong SignalR 2.0, điều này được thực hiện bằng cách sử dụng sẵn có IPrincipal.Identity.Name
, là mã định danh người dùng đã đăng nhập được đặt trong quá trình xác thực ASP.NET.
Tuy nhiên, bạn có thể cần lập bản đồ kết nối với người dùng bằng một số nhận dạng khác thay vì sử dụng Identity.Name. Vì mục đích này, nhà cung cấp mới này có thể được sử dụng với triển khai tùy chỉnh của bạn để ánh xạ người dùng với kết nối.
Ví dụ về ánh xạ người dùng SignalR với kết nối bằng IUserIdProvider
Giả sử ứng dụng của chúng tôi sử dụng a userId
để xác định từng người dùng. Bây giờ, chúng ta cần gửi tin nhắn đến một người dùng cụ thể. Chúng tôi có userId
và message
, nhưng SignalR cũng phải biết ánh xạ giữa userId của chúng tôi và kết nối.
Để đạt được điều này, trước tiên chúng ta cần tạo một lớp mới triển khai 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();
}
}
Bước thứ hai là yêu cầu SignalR sử dụng của chúng tôi CustomUserIdProvider
thay vì triển khai mặc định. Điều này có thể được thực hiện trong Startup.cs trong khi khởi tạo cấu hình trung tâm:
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();
}
}
Bây giờ, bạn có thể gửi tin nhắn cho một người dùng cụ thể bằng cách sử dụng tin nhắn của họ userId
như đã đề cập trong tài liệu, như:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Hi vọng điêu nay co ich.