2014-01-31 5 views
2

У меня есть ActionResult, который возвращает результат файла:RemoveOutputCacheItem не работает

[OutputCache(VaryByParam = "document_id;size", Duration = 3 * 60 * 60, Location = OutputCacheLocation.Server)] 
public ActionResult GetDocumentThumbnail(Guid document_id, int size) 
{ 
    byte[] thumbnail = null; 
    switch (size) 
    { 
     case 100: 
      thumbnail = 
       (from a in _unitOfWork.Documents 
        where a.Id == document_id 
        select a.Thumbnails.Thumbnail_100).First(); 
      break; 

     case 25: 
      thumbnail = 
       (from a in _unitOfWork.Documents 
        where a.Id == document_id 
        select a.Thumbnails.Thumbnail_25).First(); 
      break; 
    } 
    return File(thumbnail, "image/png"); 
} 

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

Проблема начинается тогда, когда я пытаюсь удалить кэш для конкретного документа:

Я это функция, которую я называю, но ничего не делает (документ уменьшенное еще в кэше, когда я прошу его снова)

private void RemoveDocumentThumbnailCache(Guid document_Id) 
{ 
    HttpResponse.RemoveOutputCacheItem("/DocumentThumbnail/" + document_Id + "/"); 
} 

Я также пробовал this solution, но без результата: я добавил пользовательский маршрут, поэтому путь не содержит параметры строки запроса. Не работает

routes.MapRoute(
    name: "DocumentThumbnail", 
    url: "DocumentThumbnail/{document_id}/{size}", 
    defaults: new { controller = "Home", action = "GetDocumentThumbnail" } 
); 

Что я делаю неправильно?

+0

это может помочь http://antix.co.uk/Blog/IfModifiedAttribute – Zaki

+0

взглянуть на http://ehsanghanbari.com/Post/21/different-types-of-caching-in-aspnet-mvc4, надеюсь, что это поможет – Ehsan

+0

@Ehsan: 'DonutCaching' [не работает] (http://mvcdonutcaching.codeplex.com/workitem/2463) с' FileResult' действия – Catalin

ответ

0

RemoveOutputCacheItem должен быть полным относительным URL. Вы только переходящие в /DocumentThumbnail/{document_Id}, когда он должен быть /DocumentThumbnail/{document_Id}/{size}

private void RemoveDocumentThumbnailCache(Guid document_Id) 
{ 
    foreach(var size in new[] { 100, 25 }) { 
     var url = Url.Action("GetDocumentThumbnail", new { document_id = document_id, size = size }); 
     HttpResponse.RemoveOutputCacheItem(url); 
    } 
} 
+1

Это работает! Но это не очень гибко, так как мне нужно знать все значения других параметров, чтобы удалить запись. Есть ли способ удалить кешированный элемент, указав только ключ запуска? Я пробовал '/ DocumentThumbnail/documentIdValue/*', но не работает – Catalin

+0

Посмотрел на него и не кажется возможным. Как и в случае с большинством кэшей, вы можете получить доступ только к записи кэша через ключ (в этом случае точный URL-адрес). Я могу думать о трех альтернативах: 1) Используйте VaryByCustom, чтобы вы могли контролировать, если вы будете использовать существующий кэш или создать новый. Проблема в том, что вы не очищаете старую запись кэша. 2) Создайте пользовательский OutputCacheProvider. 3) измените свой URL так, чтобы 'size' находился в строке запроса вместо пути URL/DocumentThumbnail/{document_Id}? Size = {size}'. – LostInComputer

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

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