application_end()httpcontext.current.cache [key]を介してキャッシュにアクセスできません

StackOverflow https://stackoverflow.com/questions/4419981

質問

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

それを行うには、Global.asaxのディスクに特定のキャッシュされたアイテムを書き出したい Application_End() 機能して再ロードします Application_Start().

現在、キャッシュヘルパークラスがあります。これは、次の方法を使用してキャッシュ値を返します。

return HttpContext.Current.Cache[key];

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

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

役に立ちましたか?

解決

廃棄される前にキャッシュオブジェクトにアクセスしたい場合は、このような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
}

他のヒント

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

public static class CacheHelper
{
    public static void SetCache(string key, object value)
    {
        HttpContext.Current.Cache[key] = value;
        if (key == "some special key")
            WriteValueOnDisk(value);
    }
}

httpcontextがない場合は、httpruntime.cacheを介してキャッシュにアクセスできます。ただし、Application_Endでは、キャッシュはすでにフラッシュされていると思います。

Dima Shmidtの概要の解決策は、キャッシュされた値を保存するための最良のアプローチです。つまり、cacheitemremovedcallbackでキャッシュにアイテムを追加し、値をそこにディスクに保存することです。

代替ソリューションとして、データをアプリケーションオブジェクト(アプリケーション[キー])に保存するか、単に作成できます。 static class そして、それを使用してデータをアプリ内に保持します - この場合、データはApplication_Endで利用可能になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top