Не используйте Close, он делает больше, чем говорят документы. И в документах также сказано не использовать его при обработке обычных запросов ...
Это отраженный источник Close ():
[SecurityPermission(SecurityAction.Demand, Unrestricted=true)]
public static void Close() {
if (_theRuntime.InitiateShutdownOnce()) {
SetShutdownReason(ApplicationShutdownReason.HttpRuntimeClose, "HttpRuntime.Close is called");
if (HostingEnvironment.IsHosted) {
HostingEnvironment.InitiateShutdown();
} else {
_theRuntime.Dispose();
}
}
}
Кроме того, вы не можете перебирать коллекцию и удалять из нее элементы одновременно, поскольку это делает перечисление недействительным.
Итак, попробуйте это вместо этого, что не изменит то, над чем оно зацикливается:
List<string> toRemove = new List<string>();
foreach (DictionaryEntry cacheItem in HttpRuntime.Cache) {
toRemove.Add(cacheItem.Key.ToString());
}
foreach (string key in toRemove) {
HttpRuntime.Cache.Remove(key);
}
При этом, на самом деле, вы должны попытаться использовать зависимости кеша, чтобы автоматически очистить для вас недействительные записи в кеш, и тогда все это станет ненужным.