如何在asp.net中清除服务器缓存

本文关键字:清除 服务器 缓存 net asp | 更新日期: 2023-09-27 18:13:27

如何在asp.net中清除服务器缓存?我发现有两种类型的缓存。有浏览器缓存和服务器缓存。我已经做了一些搜索,但我还没有找到一个清晰的,循序渐进的指南来清除服务器缓存使用asp.net(或不)。

(更新)我刚刚了解到,这背后的代码是在VB - Visual Basic (dot net)。

如何在asp.net中清除服务器缓存

您可以遍历所有缓存项并逐个删除它们:

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

ASP. net语法更正NET 4.5 c#

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

迭代有一个问题:它不是线程安全的。如果您正在进行迭代,并且从另一个线程访问缓存,则可能会得到一个错误。这种可能性很低,但对于高负载应用程序来说,这是一个问题。仅供参考,一些缓存实现甚至不提供迭代方法。

同样,如果你要清除你的缓存项,你不希望清除应用程序域的每个部分的所有内容,而只希望清除与你相关的内容。

当我遇到这个问题时,我通过在所有缓存项中添加自定义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
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]);
} 

您需要删除已添加到缓存中的项:

var itemsInCache= HttpContext.Current.Cache.GetEnumerator();
while (itemsInCache.MoveNext())
{
    HttpContext.Current.Cache.Remove(enumerator.Key);
}

我不确定您想要使用的确切方法。但是有几种方法,其中一种方法是Giorgio Minardi发布的来自这个问题的方法。

其他选项可以像这样:

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");
    }
}

将成功回收您的应用程序池。这样就能清空缓存。你有几个选择。注意,虽然这将清除缓存,但它也会终止所有存在的会话。

system . web . httprtime . unloadappdomain() -重启web应用程序,清空缓存,重置css/js包

在页面加载事件中添加此代码。这是要清除缓存的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")