Asp.net
SignalR - 使用 (IUserIdProvider) NEW 2.0.0 向特定使用者發送消息
在最新版本的 Asp.Net SignalR 中,添加了一種使用介面“IUserIdProvider”向特定使用者發送消息的新方法。
public interface IUserIdProvider { string GetUserId(IRequest request); } public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } }我的問題是:我怎麼知道我要向誰發送消息?這種新方法的解釋很膚淺。SignalR 2.0.0 的聲明草案存在此錯誤且無法編譯。有沒有人實現過這個功能?
擁抱。
SignalR 為每個連接提供 ConnectionId。要找到哪個連接屬於誰(使用者),我們需要在連接和使用者之間創建一個映射。這取決於您如何在應用程序中辨識使用者。
在 SignalR 2.0 中,這是通過使用內置的來完成的
IPrincipal.Identity.Name,它是在 ASP.NET 身份驗證期間設置的登錄使用者標識符。但是,您可能需要使用不同的標識符而不是使用 Identity.Name 來映射與使用者的連接。為此,此新提供程序可與您的自定義實現一起使用,以將使用者映射到連接。
使用 IUserIdProvider 將 SignalR 使用者映射到連接的範例
假設我們的應用程序使用 a
userId來辨識每個使用者。現在,我們需要向特定使用者發送消息。我們有userIdandmessage,但 SignalR 還必須知道我們的 userId 和連接之間的映射。為此,首先我們需要創建一個新類,它實現
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(); } }第二步是告訴 SignalR 使用我們的
CustomUserIdProvider而不是預設實現。這可以在初始化集線器配置時在 Startup.cs 中完成: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(); } }
userId現在,您可以使用文件中提到的特定使用者向特定使用者發送消息,例如:public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } }希望這可以幫助。