同时登录用户信号器中的问题

时间:2016-01-16 14:22:17

标签: signalr signalr-hub

我正在使用ASP.NET和signalr在社交网络上工作。我有一个简单的登录页面,如果它在数据库中找到用户它创建一个Application变量并将用户重定向到配置文件页面,在这个页面中我调用我的hub类中声明的Connect方法,这个方法将用户ID放在会话,它给这个用户的朋友列表。当两个或多个用户在不同时间登录时,这非常有用。问题是,当两个或多个用户同时登录时,我的集线器中声明的connect方法将获取存储在Application变量中的最后一个用户ID,并为最后一个用户ID提供朋友列表并将其发送给所有用户ID用户连接。

我无法找到正确的方法。

登录页面代码:

protected void btn_login_Click(object sender, EventArgs e)
{
    Tbl_User user = new Tbl_User();
    user = FonctionCommun.Login(txt_UserName.Text , txt_PassWord.Text);
    if (user != null)
    {
        Application["UserID"] = user.UserID.ToString();    
        Response.Redirect("Profile.aspx");
    }
    else {
        Label1.Visible = true;
    }
}

我的连接方法代码:

public void connect()
{           
 UserID = Guid.Parse(HttpContext.Current.Application["UserID"].ToString());

 string OutPut = "";

 if (ListOnlineUser.Count(x => x.UserID == UserID) == 0)
 {
 ListOnlineUser.Add(new OnlineUsers { UserID = UserID, ConnetionID = Guid.Parse(Context.ConnectionId) });
                objchat.SetOnline(UserID);     
                ListFriends = objchat.GetFriendLoginStatus(UserID);
            }
            foreach (Tbl_User item in ListFriends)
            {
                if (item.Status == "1")
                {
                    OnlineUsers onlineFriend = ListOnlineUser.FirstOrDefault(x => x.UserID == Guid.Parse(item.UserID.ToString()));
                    if (onlineFriend != null)
                    {
                        using (FIESTA_ADVISOREntities BD = new FIESTA_ADVISOREntities())
                        {
                            Tbl_User Obj_User = BD.Tbl_User.Where(o => o.UserID == UserID).FirstOrDefault();
                            if (Obj_User.ProfileImage != null)
                            {
                                string ext = BD.Assets.Where(o => o.url == Obj_User.ProfileImage).Select(o => o.MimeType).FirstOrDefault();
                                UserDetaille res = new UserDetaille() { UserID = Guid.Parse(Obj_User.UserID.ToString()), Username = Obj_User.UserName, ProfileImage = Obj_User.ProfileImage.ToString(), Ext = ext };
                                 OutPut = JsonConvert.SerializeObject(res);
                            }
                            else { 
                                UserDetaille res = new UserDetaille() { UserID = Guid.Parse(Obj_User.UserID.ToString()), Username = Obj_User.UserName, ProfileImage = "111", Ext = "png" }; 
                                OutPut = JsonConvert.SerializeObject(res); }

                            Clients.Client(onlineFriend.ConnetionID.ToString()).OnNewUserConnect(OutPut);
                        }
                    }
                }
            }
            Clients.Caller.ShowFriends(ListFriends);
        }

2 个答案:

答案 0 :(得分:0)

尝试会话变量而不是应用程序变量。应用程序变量通过应用程序工作共享所以每当新用户这是覆盖。但是如果你使用永远不会被任何其他用户覆盖的会话变量

答案 1 :(得分:0)

此外,您可以在signalr中使用查询字符串,您可以在其中将userid作为查询字符串传递,因此在每个请求中,userid将位于查询字符串中

 $.connection.hub.qs = 'userid=' + "UserId"; 
相关问题