我有大约10个Session变量用于存储每个不同10个类别的文件下载计数。我不知道为什么?但我设置为Global.asax的会话变量会自动获得RESET。
因为机器未重启。 仍有文件下载计数器重置。任何的想法? Plz建议我任何解决方案。
在Global.asax中:
void Application_Start(object sender, EventArgs e)
{
Application.Add("MGM",0);
Application.Add("PC",0);
Application.Add("NC",0);
Application.Add("TC",0);
Application.Add("PGC",0);
}
The *shortCode* parameter is name of Global Session from Global.asax file. that i am passing to get the counter and increment accordingly.
In Download.aspx.cs Page:
private int GetCount(string shordCode)
{
int count=0;
count = Convert.ToInt32(Application[shortCode]);
lock (Application[shortCode])
{
Application[shortCode] = ++count;
}
return count;
}
我应该在文本文件中存储值并在某些计数后说500后相应更新。如果是,怎么办?我们的同事说,如果假设许多用户下载文件,并且如果两者都从文本文件访问相同的值,那么可能会发生cuncurency。我很困惑......!帮助感谢。
答案 0 :(得分:1)
摘录:
因为应用程序状态存储在服务器内存中,所以 应用程序停止或重新启动时会丢失。例如, 如果更改了Web.config文件,则重新启动应用程序 除非应用程序状态值具有,否则所有应用程序状 已被写入非易失性存储介质,如数据库。
默认情况下,在IIS上运行的ASP.NET应用程序将在不活动期间关闭其应用程序池。我相信这个默认值是20分钟。此外,默认情况下,应用程序池每1740分钟(29小时)回收一次。
当发生这种情况时,您将丢失未存储在更永久位置的Application[]
集合中的任何内容,例如数据库。
通过右键单击inetmgr
中的特定应用程序池并单击Advanced Properties
以显示相应的窗口,可以修改上述两个值。
答案 1 :(得分:0)
protected void Application_Start(object sender, EventArgs e)
{
Application.Add("MGM", 0);
}
protected void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["MGM"] = System.Convert.ToInt32(Application["MGM"]) + 1;
Application.UnLock();
}
protected void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["MGM"] = System.Convert.ToInt32(Application["MGM"]) - 1;
Application.UnLock();
}
protected void Application_End(object sender, EventArgs e)
{
Application.Clear();
}
你改变了方法:
private int GetCount(string shordCode)
{
return Convert.ToInt32(Application[shortCode]);
}
答案 2 :(得分:0)
好的,我很乐意回答这个问题,并尝试更改您的方法:
启动您的网络应用:
protected void Application_Start(object sender, EventArgs e)
{
Application.Add("MGM",0);
Application.Add("PC",0);
Application.Add("NC",0);
Application.Add("TC",0);
Application.Add("PGC",0);
}
并更改了get count方法逻辑:
private int GetCount(string shordCode)
{
//current app instance
var currentApp = HttpContext.Current.ApplicationInstance.Application;
//get item count
var count = Convert.ToInt32(currentApp[shordCode]);
//locking app for your asking count insrement
currentApp.Lock();
currentApp[shordCode] = ++count;
//unlock app
currentApp.UnLock();
return count;
}