web-dev-qa-db-ja.com

asp.netのサーバーキャッシュをクリアするにはどうすればよいですか?

Asp.netのサーバーキャッシュをクリアするにはどうすればよいですか?キャッシュには2種類あることがわかりました。ブラウザキャッシュとサーバーキャッシュがあります。いくつかの検索を行いましたが、asp.netを使用して(または使用しないで)サーバーキャッシュをクリアするための明確なステップバイステップガイドをまだ見つけていません。

(更新)このための分離コードがVB-Visual Basic(ドットネット)にあることを知りました。

32
xarzu

すべてのキャッシュアイテムをループし、それらを1つずつ削除できます。

foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
    HttpContext.Current.Cache.Remove(string(entry.Key));
}

ASP.NET 4.5 C#の構文修正

foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
    HttpContext.Current.Cache.Remove((string)entry.Key);
}
45
Kenneth

反復に問題があります:スレッドセーフではありません。繰り返し処理をしていて、キャッシュが別のスレッドからアクセスされる場合、エラーが発生している可能性があります。これの可能性は低いですが、高負荷のアプリケーションでは問題です。参考までに、一部のキャッシュ実装では反復メソッドさえ提供していません。

また、キャッシュアイテムをクリアする場合、アプリドメインのすべての部分からすべてをクリアするのではなく、自分に関連するものだけをクリアする必要があります。

この問題に直面したとき、すべてのキャッシュエントリにカスタムCacheDependencyを追加することで解決しました。

これは、CacheDependencyの定義方法です。

public class CustomCacheDependency : CacheDependency
{
    //this method is called to expire a cache entry:
    public void ForceDependencyChange()
    {
        this.NotifyDependencyChanged(this, EventArgs.Empty);
    }
}

//this is how I add objects to cache:
HttpContext.Current.Cache.Add(key, //unique key 
            obj, 
            CreateNewDependency(), //the factory method to allocate a dependency
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            new TimeSpan(0, 0, ExpirationInSeconds),
            System.Web.Caching.CacheItemPriority.Default,
            ReportRemovedCallback);

//A list that holds all the CustomCacheDependency objects:
#region dependency mgmt
private List<CustomCacheDependency> dep_list = new List<CustomCacheDependency>();

private CustomCacheDependency CreateNewDependency()
{
        CustomCacheDependency dep = new CustomCacheDependency();
        lock (dep_list)
        {
            dep_list.Add(dep);
        }
        return dep;
}

//this method is called to flush ONLY my cache entries in a thread safe fashion:
private void FlushCache()
{
        lock (dep_list)
        {
            foreach (CustomCacheDependency dep in dep_list) dep.ForceDependencyChange();
            dep_list.Clear();
        }
} 
#endregion
8
J W

あなたがこれを達成したいと思う正確な方法論はわかりません。しかし、いくつかの方法があります。1つは、これに由来するGiorgio Minardiが投稿した方法です question

他の選択肢は次のようになります。

using Microsoft.Web.Administration;

public bool RecycleApplicationPool(string appPoolName)
{

    try
    {
        using (ServerManager iisManager = new ServerManager())
        {
             iisManager.ApplicationPools[appPoolName].Recycle();
             return true;
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Unhandled Exception");
    }
}

これにより、アプリケーションプールが正常にリサイクルされます。キャッシュをクリアします。いくつかの選択肢があります。注意してください、これはキャッシュをクリアしますが、存在するセッションも終了します。

これがお役に立てば幸いです。

2
Greg
public void ClearCacheItems()
{
   List<string> keys = new List<string>();
   IDictionaryEnumerator enumerator = Cache.GetEnumerator();

   while (enumerator.MoveNext())
     keys.Add(enumerator.Key.ToString());

   for (int i = 0; i < keys.Count; i++)
      Cache.Remove(keys[i]);
} 
2
Faisal Pathan

System.Web.HttpRuntime.UnloadAppDomain()-Webアプリケーションの再起動、キャッシュのクリア、css/jsバンドルのリセット

1
Pavel Nazarov

キャッシュに追加したアイテムを削除する必要があります。

var itemsInCache= HttpContext.Current.Cache.GetEnumerator();

while (itemsInCache.MoveNext())
{

    HttpContext.Current.Cache.Remove(enumerator.Key);

}
1
Giorgio Minardi

このコードをページ読み込みイベントに追加します。つまり、httpヘッダーでキャッシュをクリアします。

Response.CacheControl = "private"
Response.CacheControl = "no-cache"
Response.ClearHeaders()
Response.AppendHeader("Cache-Control", "no-cache")        
Response.AppendHeader("Cache-Control", "private")            
Response.AppendHeader("Cache-Control", "no-store")          
Response.AppendHeader("Cache-Control", "must-revalidate")          
Response.AppendHeader("Cache-Control", "max-stale=0")           
Response.AppendHeader("Cache-Control", "post-check=0")           
Response.AppendHeader("Cache-Control", "pre-check=0")      
Response.AppendHeader("Pragma", "no-cache")
Response.AppendHeader("Keep-Alive", "timeout=3, max=993")          
Response.AppendHeader("Expires", "Mon, 26 Jul 2006 05:00:00 GMT")
0
Bhushan Shimpi