4

アプリケーションの再起動間で特定のオブジェクトを維持できるようにしたいと考えています。

これを行うには、特定のキャッシュされた項目を Global.asaxApplication_End()関数でディスクに書き込み、それらを に再読み込みしますApplication_Start()

現在、次のメソッドを使用してキャッシュされた値を返すキャッシュ ヘルパー クラスがあります。

return HttpContext.Current.Cache[key];

問題: Web リクエストがないため (これは自動化されたクリーンアップ手順です)、中は null です。そのため、ディスクに保存するアイテムを取得するためにアクセスできませApplication_End()ん。HttpContext.Current.Cache[]

質問: 中にキャッシュ アイテムにアクセスするにはどうすればよいApplication_End()ですか?

4

4 に答える 4

3

破棄される前にキャッシュオブジェクトにアクセスしたい場合は、次のようなsomethinkを使用してオブジェクトをキャッシュに追加する必要があります。

キャッシュへのオブジェクトの追加を使用しているアプリケーションに、名前空間 System.Web.Caching をインポートします。

//Add callback method to delegate
var onRemove = new CacheItemRemovedCallback(RemovedCallback);

//Insert object to cache
HttpContext.Current.Cache.Insert("YourKey", YourValue, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, onRemove);

そして、このオブジェクトが破棄されると、次のメソッドが呼び出されます。

private void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
    //Use your logic here

    //After this method cache object will be disposed
}
于 2010-12-12T16:57:35.550 に答える
1

HttpContext を使用できない場合は、HttpRuntime.Cache を介してキャッシュにアクセスできます。ただし、Application_End では、キャッシュは既にフラッシュされていると思います。

Dima Shmidt が概説するソリューションは、キャッシュされた値を保存するための最良の方法です。つまり、CacheItemRemovedCallback を使用してアイテムをキャッシュに追加し、値をディスクに保存します。

于 2011-01-05T14:49:58.727 に答える
1

アプローチを再考することを強くお勧めします。あなたがやろうとしていることの詳細を説明したいかもしれないので、私たちはそれを手助けするかもしれません. しかし、完全に設定されている場合は、実際に値を設定するときに値をディスクに保存するだけで済みます。つまり、ヘルパー クラスは次のようになります。

public static class CacheHelper
{
    public static void SetCache(string key, object value)
    {
        HttpContext.Current.Cache[key] = value;
        if (key == "some special key")
            WriteValueOnDisk(value);
    }
}
于 2010-12-12T02:43:13.180 に答える
0

別の解決策として、データを Application オブジェクト (Application[key]) に保存するか、単純に を作成してstatic classそれを使用してアプリ内にデータを保持することができます。この場合、データは Application_End で利用可能になります。

于 2010-12-12T02:52:58.547 に答える