0

我有大约 10 个会话变量,用于存储每个不同 10 个类别的文件下载计数。我不知道为什么?但是我设置为 Global.asax 的会话变量会自动重置。

因为,机器没有重新启动文件下载的计数器仍然会重置。任何的想法?请建议我任何解决方案。

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

4

3 回答 3

1

请参阅 MSDN 页面了解ASP.NET 应用程序状态

摘抄:

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

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

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

上面提到的两个值都可以通过在具体的应用程序池中inetmgr点击右键,点击Advanced Properties弹出相应的窗口来修改。

于 2012-08-11T08:04:27.207 回答
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]); 
}
于 2012-08-11T08:00:35.253 回答
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;
    }
于 2012-08-31T11:38:47.477 回答