如何在asp.net中防止Global.asax文件的会话值重置?

时间:2012-08-11 07:49:19

标签: asp.net global-variables session-variables reset global-asax

我有大约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。我很困惑......!帮助感谢。

3 个答案:

答案 0 :(得分:1)

请参阅ASP.NET Application State

的MSDN页面

摘录:

  

因为应用程序状态存储在服务器内存中,所以   应用程序停止或重新启动时会丢失。例如,   如果更改了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;
    }