SignalR for each 连接提供ConnectionId.要找出哪个连接属于谁(用户),我们需要在连接和用户之间创建一个映射.这取决于您如何在应用程序中标识用户.
在SignalR 2.0中,这是通过使用内置IPrincipal.Identity.Name
来实现的,它是在ASP.NET身份验证期间设置的登录用户标识符.
但是,您可能需要使用不同的标识符而不是身份来映射与用户的连接.名称为此,此新提供程序可与自定义实现一起使用,用于将用户映射到连接.
使用IUserIdProvider将信号器用户映射到连接的示例
假设我们的应用程序使用userId
来标识每个用户.现在,我们需要向特定用户发送消息.我们有userId
和message
,但信号器还必须知道我们的用户ID和连接之间的映射.
要实现这一点,首先需要创建一个实现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();
}
}
第二步是告诉Signal使用我们的CustomUserIdProvider
,而不是默认实现.这可以在启动时完成.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);
}
}
希望这能帮上忙.