0

我有大约10个会话变量用于存储每个不同的10个分类明智的文件下载计数。我不知道为什么?但是我的会话变量设置为Global.asax会自动获得RESET。如何防止asp.net中Global.asax文件的会话值重置?

因为机器没有重启仍然文件下载计数器得到重置。任何想法? 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,如果是该怎么办?我们的同事说,如果假设许多用户下载文件,并且如果两者都从文本文件访问相同的值,那么可能会出现不安。我很困惑......!帮助赞赏。

回答

1

请参阅MSDN页面ASP.NET Application State

节选:

由于应用程序状态存储在服务器内存中,因此应用程序停止或重新启动时,它会丢失 。例如,如果Web.config文件更改为 ,则应用程序将重新启动,并且除非应用程序状态值已将 写入非易失性存储介质(如数据库),否则所有应用程序状态都将丢失。

默认情况下,在IIS上运行的ASP.NET应用程序将在非活动期间关闭其应用程序池。我相信这个默认值是20分钟。同样默认情况下,应用程序池每1740分钟(29小时)就会被回收。

发生这种情况时,您将丢失Application[]集合中没有存储在更永久位置(如数据库)中的任何内容。

通过右键单击inetmgr中的特定应用程序池并单击Advanced Properties以调出相应的窗口,可以修改上述两个值。

+0

感谢@Joshua回复,那么我该怎么做才能避免这种情况呢?我应该写入textfile或sqlserver ..? – 2012-08-11 08:16:04

+0

我见过的大多数网站都直接将这种性质的东西存储到数据库中。我甚至会考虑将这种类型的数据缓存在应用程序状态中的唯一情况是,如果该网站收到大量的流量,并且该网站正在被数据库收缩。即使如此,我仍会直接将更改保存到数据库,并简单地更新缓存的结果。据我的理解,这给你两全其美。 – 2012-08-11 08:18:24

+0

好吧!非常感谢...!我会尝试存储到数据库..! – 2012-08-11 08:25:13

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]); 
} 
+0

感谢回复@eli但这是不正确的解决我的问题,我不明白你为什么减少SessionEnd()计数。我只在文件下载时递增计数..不满意你的建议..! – 2012-08-11 08:19:09

0

好,太好了,我回答这个Q,并尝试改变你的方法:

启动您的Web应用程序:

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); 
} 

,并改变了你的获取计数方法的基本原理:

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; 
    }