会话超时和表单身份验证超时会产生这种效果,我将如何更改它?

时间:2014-12-09 19:04:06

标签: c# asp.net session global-asax

我有Asp.net网站项目。我正在寻找使用Global.asax文件的活跃用户号码(活动会话);

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    Application["UsersOnline"] = 0;
}
void Session_Start(object sender, EventArgs e) 
{
}
void Session_End(object sender, EventArgs e) 
{
    Application.Lock();
    Application["UsersOnline"] = (int)Application["UsersOnline"] -1 ;
    Application.UnLock();
}

这是用户登录时增加应用程序状态的登录页面;

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
        {
            string connectionstring = WebConfigurationManager.ConnectionStrings["LocalSqlServerTracking"].ConnectionString;
            string sqlstring;
            sqlstring = "Select Name,Password,ID,SessionStateID from Employee where Name=@UserName and Password=@Password";

            SqlConnection con = new SqlConnection(connectionstring);
            SqlCommand command = new SqlCommand(sqlstring, con);

            command.Parameters.Add(new SqlParameter("@UserName", Login1.UserName));
            command.Parameters.Add(new SqlParameter("@Password", Login1.Password));
            System.Data.SqlClient.SqlDataReader reader;

            // open a connection with sqldatabase
            try
            {
                using (con)
                {
                    con.Open();

                    reader = command.ExecuteReader();

                   Boolean read= reader.Read();
                   online = Convert.ToInt32(reader["SessionStateID"]);
                    if (read)
                    {
                       Session["Name"] = Login1.UserName;
                        Session["Password"] = Login1.Password;
                        Session["ID"] = reader["ID"].ToString();
                        int ID = Convert.ToInt32(Session["ID"]);
                        var matches = from p in entities.Employees
                                      where p.ID ==ID
                                      select p;
                        // Execute the query and return the entity object.
                       Employee emp = matches.Single();
                        // Change the entity object.
                        emp.SessionStateID = 0;
                        // Commit the changes back to the database.
                        entities.SaveChanges();
                         Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
                        e.Authenticated = true;

                    }

                    else {

                            Label1.Text = "User not exist";
                            e.Authenticated = false;
                }

现在,如果我登录应用程序状态增加到1,则在注销并登录后仍为1,如果使用新标签使用同一用户登录另一个用户应用程序状态增加到2.哪个工作得很好。但是经过一段时间后我登录并看到负值-7。我唯一能想到的就是会话超时。如果我使用Session.Abandon(),会话超时会在一段时间后仍然有效吗?我将如何防止它,不应该是这种情况,或者如果有什么我看不出它会是什么?

   <forms loginUrl="login.aspx" defaultUrl="userHome.aspx" timeout="60" />
  <sessionState cookieless="true" cookieName="ASP.NET_SessionId" regenerateExpiredSessionId="false" timeout="5" mode="InProc"></sessionState>

1 个答案:

答案 0 :(得分:1)

您应该有两个不同的应用程序变量并相应增加:

Application["UsersOnline"]
Application["LoggedUsers"]

只要您登录的用户退出并且您的会话被放弃,您就会将此用户重定向到您网站中的另一个页面,对吧?如果是这样,ASP.NET可能会为同一个用户创建另一个会话并增加Application["UsersOnline"]

只会在20分钟内(或其他配置值)看到过期会话,不再提出请求的人员,帖子的减少。

如果您想跟踪Application["LoggedUsers"],请务必在用户登录时增加此号码,并在注销时减少。此外,请确保在Session_End上,您发现会话是否是已记录的用户。如果是,请减少Application["LoggedUsers"]

修改

完整的解决方案就是这样。

  1. 保持您的登录活动不变。

  2. 我不知道你是怎么做到的,但你的退出应该是这样的:

     public BtnLogout_Click(object sender, EventArgs e)
     {
         Session.Abandon();
     }
    
  3. 将您的Session_End更改为:

     void Session_End(object sender, EventArgs e) 
     {
        if(!String.IsNullOrEmpty((string)Session["Name"]))
        {
            Application.Lock();
            Application["UsersOnline"] = (int)Application["UsersOnline"] -1 ;
            Application.UnLock();
        }
     }
    
  4. 当您致电Session.Abandon()时,会话被标记为已删除,但不会立即删除。这意味着您可以在Session_End上执行一些清理工作。这正是我们正在做的事情。

    我们希望确保我们为仅登录的用户递减Application["UsersOnline"],而不是那些有会话的用户(实际上每个人都会调用该网站,这取决于您构建网页的方式)。这保证了我们只减少之前递增变量的用户。