我有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>
答案 0 :(得分:1)
您应该有两个不同的应用程序变量并相应增加:
Application["UsersOnline"]
Application["LoggedUsers"]
只要您登录的用户退出并且您的会话被放弃,您就会将此用户重定向到您网站中的另一个页面,对吧?如果是这样,ASP.NET可能会为同一个用户创建另一个新会话并增加Application["UsersOnline"]
。
只会在20分钟内(或其他配置值)看到过期会话,不再提出请求的人员,帖子的减少。
如果您想跟踪Application["LoggedUsers"]
,请务必在用户登录时增加此号码,并在注销时减少。此外,请确保在Session_End
上,您发现会话是否是已记录的用户。如果是,请减少Application["LoggedUsers"]
。
修改强>
完整的解决方案就是这样。
保持您的登录活动不变。
我不知道你是怎么做到的,但你的退出应该是这样的:
public BtnLogout_Click(object sender, EventArgs e)
{
Session.Abandon();
}
将您的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();
}
}
当您致电Session.Abandon()
时,会话被标记为已删除,但不会立即删除。这意味着您可以在Session_End
上执行一些清理工作。这正是我们正在做的事情。
我们希望确保我们为仅登录的用户递减Application["UsersOnline"]
,而不是那些有会话的用户(实际上每个人都会调用该网站,这取决于您构建网页的方式)。这保证了我们只减少之前递增变量的用户。