Как очистить кеш сервера в asp.net?
Как очистить кэш сервера в asp.net? Я обнаружил, что существует два вида кэша. Есть кеш браузера и кеш сервера. Я провел некоторый поиск, но мне еще не удалось найти четкое пошаговое руководство по очистке кэша сервера с использованием asp.net (или нет).
(обновление) Я только что узнал, что код для этого в VB - Visual Basic (точка сеть).
Ответы
Ответ 1
Вы можете пропустить все элементы кэша и удалить их по очереди:
foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
HttpContext.Current.Cache.Remove(string(entry.Key));
}
Коррекция синтаксиса для ASP.NET 4.5 С#
foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
HttpContext.Current.Cache.Remove((string)entry.Key);
}
Ответ 2
Возникла проблема с итерацией: она не потокобезопасна.
Если вы выполняете итерацию, и кэш получает доступ из другого потока, вы можете получить сообщение об ошибке.
Вероятность этого низкая, но это проблема с приложениями с высокой нагрузкой.
FYI, некоторые реализации кэша даже не предоставляют методы итерации.
Кроме того, если вы очищаете свои элементы кэша, вы не хотите удалять все из каждой части домена приложения, а только то, что связано с вами.
Когда я столкнулся с этой проблемой, я решил ее, добавив пользовательскую 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
Ответ 3
Я не уверен в точной методологии, в которой вы хотели бы это сделать. Но есть несколько способов, один из которых опубликовал один из сообщений Джорджио Минарди, который исходит из этого 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");
}
}
Это успешно переработает ваш пул приложений. Это позволит очистить кеш. У вас есть несколько вариантов. Опасайтесь, хотя это очистит кеш, оно также прекратит любые существующие сеансы.
Надеюсь, это поможет.
Ответ 4
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]);
}
Ответ 5
Вам нужно будет удалить элементы, добавленные в кэш:
var itemsInCache= HttpContext.Current.Cache.GetEnumerator();
while (itemsInCache.MoveNext())
{
HttpContext.Current.Cache.Remove(enumerator.Key);
}
Ответ 6
System.Web.HttpRuntime.UnloadAppDomain() - перезапускает веб-приложение, очищает кеш, сбрасывает пакеты css/js
Ответ 7
добавьте этот код в событие загрузки страницы. Это заголовки 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")