我需要计算会话次数,但是当我说会话数量是2然后做某事时它不起作用。以下示例是我的代码:
// count curent session in order to keep two player
if (HttpContext.Current.Session.Count == 2)
{
Response.Redirect("update.aspx");
}
我将上面的代码放在代码后面。还有其他任何方式我可以说:如果会话数量是2其他做某事......
答案 0 :(得分:2)
这是存储在该用户的会话中的会话变量计数(msdn reference)...而不是当前存在的用户会话数。
您需要将会话计数存储在会话本身之外...可能在缓存或应用程序缓存中。
以下是一些有助于实现此问题的SO问题:
答案 1 :(得分:0)
您可以使用WMI查询应用程序中的活动会话数。
答案 2 :(得分:0)
注意:此示例仅适用于新手程序员(不适用于ASP专家程序员)
1)转到Global.asax.cs文件并识别应用程序启动函数,然后添加会话计数器变量。像这样......
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
Application.Add("NOF_USER_SESSION", 0);
2)然后在同一个GLobal.asax.cs文件中继续分别在Session-Startup和Session-Endup函数中添加/减少用户数...就像这样......
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Application["NOF_USER_SESSION"] = (int)Application["NOF_USER_SESSION"] + 1;
..
..
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
Application["NOF_USER_SESSION"] = (int)Application["NOF_USER_SESSION"] - 1;
..
..
3)然后在程序中的任何位置使用此应用程序级变量(int)Application["NOF_USER_SESSION"]
。
答案 3 :(得分:0)
我发现Session_Start,Session_End有点不可靠,有时似乎未调用Session_End。这就是我所使用的,它维护着客户端IP地址和上次访问日期的字典,在20分钟后使“会话”超时。在这里,我将计数存储在从Controller派生的自定义基类中名为NumberOfSessions的静态属性中。
public void Application_BeginRequest()
{
Application.Lock();
string addr = Request.UserHostAddress;
Dictionary<string, DateTime> sessions = Application["Sessions"] as Dictionary<string, DateTime>;
sessions[addr] = DateTime.Now;
List<string> remove = new List<string>();
foreach(KeyValuePair<string, DateTime> kvp in sessions)
{
TimeSpan span = DateTime.Now - kvp.Value;
if (span.TotalMinutes > 20)
remove.Add(kvp.Key);
}
foreach (string removeKey in remove)
sessions.Remove(removeKey);
BaseController.NumberOfUsers = sessions.Count;
Application.UnLock();
}