2014-08-27 4 views
0

Я пытаюсь очистить кэш приложения программным путем с другого сервера. Я видел много сообщений об их очистке из приложения, но не для чего-то подобного. Если вы коснетесь файла Web.Config, он будет утилизировать приложение, вызывающее приложение для очистки. Если предположить, что у хост-приложения есть доступ, я мог бы программно сделать это. Но было интересно, есть ли лучший способ просто очистить все элементы кэша, а не перезапустить пул приложений.ASP.NET очистка кэша приложений на другом сервере программно

+0

Лучше всего создать API-интерфейс, который очищает записи кэша приложения, чей кеш должен быть обновлен (поэтому у вас есть доступ к AppDomain), а затем вызывать этот API извне. Хотя этот вопрос немного широк, чтобы ответить лаконично. Вы ищете образец кода? – xDaevax

+0

Да, пример кода был бы идеальным. Мне нравится ваша идея, но для этого требуется создание дополнительного приложения; надеялся на более прямое решение (даже если немного взломать, как это будет сделано для этой цели). Но если ничего не получится, я возьму маршрут, который ты предложил. – strider

ответ

0

Я бы сказал, есть несколько моментов, которые следует учитывать при очистке кэша ВСЮ:

  1. Если вы храните вещи в кэш, вы, надеюсь, есть какой-то метод синхронизации. В этом случае удаление ВСЕХ вещей может вызвать некоторые проблемы (блокировка, низкая производительность, условия гонки).
  2. Доступ к кешу приложения из внешнего AppDomain, насколько я знаю, невозможен (некоторые основные причины этого, среди прочих, я уверен, что это проблемы синхронизации и безопасности).

Это, как говорится, если вы хотите, чтобы очистить каждую запись в кэш (при условии, что вы используете System.Web.Caching методы, чтобы сделать это) вы можете ввести код, похожий на этот:

List<string> keys = new List<string>(); 

IDictionaryEnumerator enumerator = Cache.GetEnumerator(); 

while (enumerator.MoveNext()){ 
    keys.Add(enumerator.Key.ToString()); 
} // end while 
for (int i = 0; i < keys.Count; i++) { 
    Cache.Remove(keys[i]); 
} // end for loop 

You затем может выставить вышеуказанный код через URL-адрес (например: http://example.com/admin/refresh-cache).

Это позволит вам очистить кеш программно от другого приложения или пакетного файла, или вы можете получить к нему доступ непосредственно из URL-адреса.

Чтобы подробнее рассказать о первой пуле, описанной выше, механизмы кэширования .NET (из которых есть много разновидностей: http://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx) имеют свои собственные встроенные функции истечения срока действия. Если вы окажетесь в месте, где вы хотите очистить весь кеш, это может быть признаком того, что вы должны либо A) улучшить свои значения сохранения кэша, либо B) переработать пул приложений, поскольку это обеспечит более безопасный переход для пользователей приложения , Помните, что все, что размещает элементы в кеше при запуске приложения , скорее всего, будет пытаться сделать это, когда вы очищаете все.


Другой вариант рассмотреть будет использовать решение для управления кэшем, таких как AppFabric (http://msdn.microsoft.com/en-us/library/ff383731(v=azure.10).aspx).

+0

Спасибо @xDaevax. Это то, что я тоже представлял - чтобы получить все ключи и очистить их. Но я думаю, вам нужно будет написать сервис, чтобы сделать это. Иногда в базе данных происходят некоторые изменения, и они должны вступить в силу немедленно. Вот когда я обычно очищаю кеш. В идеале я должен найти точные предметы, которые должны быть очищены для этой цели, но он работает нормально, чтобы очистить все для моей цели на данный момент. – strider

Смежные вопросы