2010-08-13 4 views
4

Я немного смущен о детализации, предлагаемой вызовом HttpResponse.RemoveOutputCacheItem(). Я заинтересован в выполнении некоторого кэширования вывода на динамически сгенерированных изображениях и хотел бы изменить выходной кеш, используя, по крайней мере, параметры (назовем их «id» и «size» для аргументации).Недействительные части кэша вывода mvc asp.net с различными уровнями детализации

Так, например:

/Image/User?id=1 
/Image/User?id=1&size=1 
/Image/User?id=1&size=2 

бы кэшировать отдельно.

Когда данный пользователь меняет свое изображение; Я хотел бы аннулировать все элементы кэша вывода для этого идентификатора пользователя (независимо от размера). This question отвечает на мой вопрос об одном конкретном параметре. Но ... как бы я начал промывать все кэшированные ответы для пользователя, не обращаясь к параметру размера? (Предположим, что раньше я не знал бы всех возможных значений «размер»).

Я бы в идеале хотелось сделать что-то вроде:

HttpResponse.RemoveOutputCacheItem("/Image/User?id=1&size=*"); //wishful thinking

Может кто-нибудь мне точку в правильном направлении?

Редактировать

@JcMalta предложил перспективное решение, однако я не могу найти подходящую коллекцию, которая подвергается воздействию элементов в кэше вывода. Жизнеспособное решение может включать операцию, аналогичную той, которую он предложил, если она существует где-то.

ответ

3

Кэш вывода имеет понятие «зависимостей кэша», которые могли бы быть то, что вы ищете ,

У .NET есть FileCacheDependency, что означает, что элемент кэша автоматически недействителен, если файл на диске изменяется, и SqlCacheDependency, который делает недействительными объекты при изменении данных в базе данных MSSQL. Вы также можете писать собственные зависимости кеша.

HttpResponse имеет кучу методов с именем Add * Dependency/ies, чтобы вы могли использовать это.

Например, если ваши изображения были основаны файл на диске, ваш обработчик служит изменения размера изображения может сказать:

HttpResponse.AddFileDependency(@"C:\images\user" + userId + ".jpg"); 

Это регистрирует зависимость для вашего ответа. Когда ваш ответ добавляется в выходной кеш, любые зависимости идут вместе с ним. При изменении зависимостей элемент кэша автоматически аннулируется.

Если ваши изображения основаны на файлах или SQL-данных, это может сработать для вас из коробки.

Вы также можете использовать HttpResponse.AddCacheItemDependency, чтобы один элемент кэша зависел от другого элемента кэша. Если вы знаете, что ваш исходный URL-адрес изображения «/ Image/User? Id = 1» всегда будет кэшироваться, вы можете изменить размер изображений, зависящих от оригинала, а HttpResponse.RemoveOutputCacheItem() в оригинале очистит все из них.Если исходное изображение не всегда кэшируется (возможно, никто не запросил оригинал, только миниатюры), то я не думаю, что это сработает.

Причина, по которой встроенные зависимости зависят от кеша, заключается в том, что как Windows, так и SQL Server имеют встроенные API для уведомления об изменениях в файлах или данных. Встроенные зависимости кэша - это обертки вокруг них. Но если ни один из них не подходит, ваш последний подход заключается в реализации подобной вещи для вашей собственной цели.

Основная идея (непроверенная) заключается в подклассе CacheDependency, назовем его PictureCacheDependency.

Вам необходимо настроить какой-либо шаблон слушателя/наблюдателя, чтобы при редактировании пользователем изображения код редактирования изображения мог сообщать любым соответствующим объектам PictureCacheDependency, что изображение изменилось. Когда это произойдет, PictureCacheDependency должен вызвать base.NotifyDependencyChanged, и структура позаботится обо всем остальном.

Возможно, у вас есть конструктор PictureCacheDependency в статическом словаре событий, используя идентификатор пользователя в качестве ключа. Однако вы подходите к нему, не забудьте переопределить CacheDependency.DependencyDispose, чтобы освободить любые ссылки, иначе вы будете утечки памяти.

+0

Спасибо за ответ; HttpResponse.AddCacheItemDependency, по-видимому, будет хорошим вариантом для меня. – DanP

1

Действительно это с верхней части моей головы ... но, возможно, в правильном направлении:

public void ClearCache(string myImagePrefix) 
{ 
    var cache = System.Web.HttpContext.Current.Cache; 

    IDictionaryEnumerator enumerator = cache.GetEnumerator(); 

    while (enumerator.MoveNext()) 
    { 
     string key = enumerator.Key.ToString(); 
     if(key.StartsWith(myImagePrefix) 
      cache.Remove(key); 
    } 
} 
+0

Просто, чтобы быть ясным; Я нацелен на выходной кеш, а не на httpcache, но предпосылка будет такой же ... – DanP

+0

К сожалению, насколько я могу судить, подходящая коллекция не отображается для выходного кеша, поэтому я не могу использовать этот метод (хорошее предложение, хотя) ... – DanP

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

  • Нет связанных вопросов^_^