0

それぞれの異なる 10 カテゴリのファイル ダウンロード数を格納するための約 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と言った後にそれに応じて更新する必要がありますか? はいの場合、どうすればよいですか? 私たちの同僚は、多くのユーザーがファイルをダウンロードすると仮定し、両方がテキストファイルから同じ値にアクセスすると、最新の状態が発生する可能性があると言っています.私は混乱しています...!助けてくれてありがとう.

4

3 に答える 3

1

ASP.NET アプリケーションの状態については、MSDN ページを参照してください。

抜粋:

アプリケーションの状態はサーバー メモリに格納されるため、アプリケーションが停止または再起動されるたびに失われます。たとえば、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

わかりました、私はこの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);
}

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 に答える