在登录时存储用户然后按需按数据
所以我使用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上的聊天示例应用程序,以获取此示例。