我正在使用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);
}
答案 0 :(得分:0)
尝试会话变量而不是应用程序变量。应用程序变量通过应用程序工作共享所以每当新用户这是覆盖。但是如果你使用永远不会被任何其他用户覆盖的会话变量
答案 1 :(得分:0)
此外,您可以在signalr中使用查询字符串,您可以在其中将userid作为查询字符串传递,因此在每个请求中,userid将位于查询字符串中
$.connection.hub.qs = 'userid=' + "UserId";