0

私はWin7 64ビットを使用しています。これはかなり厄介な問題です。これを再現する手順は次のとおりです。

  1. Visual Studio で新しい C# Asp.Net プロジェクトを作成します (私は VS 2010 を使用していますが、これが問題になるかどうかはわかりません)。

  2. Default.aspx のコード ビハインドで、このコードをPage_Loadメソッドに追加します。

    HttpRuntime.Cache.Insert("foo", "test", null, DateTime.Now.AddMinutes(30), TimeSpan.FromMinutes(0));
    
    string p = "var retval; retval = window.showModalDialog('Test.aspx','', 'dialogHeight:100px; dialogWidth: 100px;scroll: no;center: Yes; help: No; resizable: yes; status: no; unadorned: yes;');";
    ScriptManager.RegisterStartupScript(this, GetType(), "openpop", p, true);
    
  3. Test.aspx という別の Web フォームを追加します。マークアップには何でも好きなものを入れることができますが、それは重要ではありません。

  4. Test.aspx のコード ビハインドで、この行をPage_Loadメソッドに挿入し、ブレークポイントを設定します。

    string x = (string)HttpRuntime.Cache["foo"];
    
  5. プロジェクトのプロパティで、アプリケーションがローカル IIS Web サーバーを使用して実行するように設定されていることを確認します。

プロジェクトを実行してブレークポイントに到達したら、もう一度ステップを踏んで x を割り当てさせます。その後、x の値は null になります。少なくともそれが私に起こっていることです。値がまだキャッシュにあるはずなので、なぜこれが起こっているのかわかりません。私の実際のアプリケーションでは、HttpRuntime.Cache.Insert へのコールバックも追加して、項目がキャッシュにない理由を追跡し、有効期限が切れていることを示しました。しかし、30 分の絶対有効期限ウィンドウを指定した場合、どうすれば期限切れになるのでしょうか?

興味深いことに、IIS の代わりに Visual Studio Development Server を使用してアプリケーションを実行すると、値がキャッシュに存在します。

4

1 に答える 1

4

私はそのようなセットアップに問題はありませんが、あなたはそうします。したがって、問題はDateTime.Now使用する設定にあると思います。msdnによると:

挿入されたオブジェクトが期限切れになり、キャッシュから削除される時刻。標準時間から夏時間への変更など、現地時間で発生する可能性のある問題を回避するには、このパラメーター値にNowではなくUtcNowを使用します。絶対有効期限を使用している場合、slidingExpiration パラメーターは NoSlidingExpiration である必要があります。

だからこれを試してください:

HttpRuntime.Cache.Insert("foo", "test", null, DateTime.UtcNow.AddMinutes(30), TimeSpan.FromMinutes(0));
于 2013-03-28T08:21:33.037 に答える