SignalR为每个连接提供ConnectionId。为了找到哪个连接属于谁(用户),我们需要在连接和用户之间创建一个映射。这取决于您如何在应用程序中识别用户。
在SignalR 2.0中,这是通过使用inbuilt来完成的,inbuilt是IPrincipal.Identity.Name
在ASP.NET身份验证期间设置的登录用户标识符。
但是,您可能需要使用其他标识符而不是Identity.Name来映射与用户的连接。为此,此新提供程序可与您的自定义实现一起使用,以映射具有连接的用户。
使用IUserIdProvider将SignalR用户映射到连接的示例
假设我们的应用程序使用a userId
来标识每个用户。现在,我们需要向特定用户发送消息。我们有userId
和message
,但是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);
}
}
希望这可以帮助。