在登录时存储用户然后按需按数据

所以我使用SignalR,它在我的网站上设置并正常工作。

假设用户A登录(我正在使用Membership API)。 当A登录时,我正在调用位于我的母版页中的.js的连接。 这将为此用户分配一个特定的userId。

假设现在用户B登录进行某些事件,该事件需要通过代码隐藏通知用户A.

所以我在这里要做的是通知用户B使用CodeBehind的A动作。 用户B如何知道用户A的ID以及整个工作如何运作? 我在文档中找不到帮助,因为它没有涉及到那种东西。

怎么能实现这一目标? 谢谢。

我意识到这已经得到了解答,但是人们可能会发现另一种选择。 我很难找到关于如何做到这一点的信息,所以希望这有助于其他人。

您可以覆盖SignalR ClientID生成并使其使用成员身份UserID。 这意味着您不必维护CleintID – > UserID映射。

为此,您需要创建一个实现IClientIdFactory接口的类。 你可以这样做:

public class UserIdClientIdFactory : IClientIdFactory { public string CreateClientId(HttpContextBase context) { // get and return the UserId here, in my app it is stored // in a custom IIdentity object, but you get the idea MembershipUser user = Membership.GetUser(); return user != null ? user.ProviderUserKey.ToString() : Guid.NewGuid().ToString(); } } 

然后在你的global.asax中:

 SignalR.Infrastructure.DependencyResolver.Register(typeof(IClientIdFactory), () => new UserIdClientIdFactory()); 

编辑 – 正如下面提到的nillls,在signalR版本0.4中发生了变化。 使用ConnectionId而不是ClientId:

 public class UserIdClientIdFactory : IConnectionIdFactory { public string CreateConnectionId(SignalR.Hosting.IRequest request) { // get and return the UserId here, in my app it is stored // in a custom IIdentity object, but you get the idea MembershipUser user = Membership.GetUser(); return user != null ? user.ProviderUserKey.ToString() : Guid.NewGuid().ToString(); } } 

并且DependencyResolver已经移动:

 SignalR.Hosting.AspNet.AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new UserIDClientIdFactory()); 

希望这有助于某人!

您的应用需要存储SignalR客户端(连接)ID到用户ID /名称的映射。 这样,您可以查找用户B的当前SignalR客户端ID,然后使用它直接向他们发送消息。 请查看https://github.com/davidfowl/JabbR上的聊天示例应用程序,以获取此示例。