Подтвердить что ты не робот

Как программно очистить выходнойcache для метода действия контроллера

Если действие контроллера имеет атрибут OutputCache, указанный в действии, есть ли способ очистить выходной кеш без перезагрузки IIS?

[OutputCache (Duration=3600,VaryByParam="param1;param2")]
public string AjaxHtmlOutputMethod(string param1, string param2)
{
  var someModel = SomeModel.Find( param1, param2 );

  //set up ViewData
  ...

  return RenderToString( "ViewName", someModel );
}

Я использую HttpResponse.RemoveOutputCacheItem(string path), чтобы очистить его, но мне трудно понять, каким должен быть путь, чтобы сопоставить его с методом действия. Я снова попытаюсь использовать страницу aspx, которая отображается в представлении ViewName.

Возможно, я просто вручную вставлю вывод RenderToString в HttpContext.Cache вместо этого, если я не смогу это сделать.

Update

Обратите внимание, что OutputCache - это VaryByParam, и тестирование жесткого пути "/controller/action" на самом деле не очищает выходнойcache, поэтому похоже, что он должен соответствовать "/controller/action/param1/param2".

Это означает, что мне, вероятно, придется вернуться к кешированию уровня объектов и вручную кэшировать вывод для RenderToString(): (

4b9b3361

Ответ 1

Попробуй это

var urlToRemove = Url.Action("AjaxHtmlOutputMethod", "Controller");
HttpResponse.RemoveOutputCacheItem(urlToRemove);

ОБНОВЛЕНО:

var requestContext = new System.Web.Routing.RequestContext(
    new HttpContextWrapper(System.Web.HttpContext.Current),
    new System.Web.Routing.RouteData());

var Url = new System.Web.Mvc.UrlHelper(requestContext);

ОБНОВЛЕНО:

Попробуй это:

[OutputCache(Location= System.Web.UI.OutputCacheLocation.Server, Duration=3600,VaryByParam="param1;param2")]

В противном случае удаление кеша не будет работать, потому что вы кэшировали вывод HTML на пользовательском компьютере.

Ответ 2

В дополнение к принятому ответу, чтобы поддерживать параметры VaryByParam:

  [OutputCache (Duration=3600, VaryByParam="param1;param2", Location = OutputCacheLocation.Server)]
  public string AjaxHtmlOutputMethod(string param1, string param2)
  {
       object routeValues = new { param1 = param1, param2 = param2 };

       string url = Url.Action("AjaxHtmlOutputMethod", "Controller", routeValues);

       Response.RemoveOutputCacheItem(url);
  }

Однако ответ Egor намного лучше, потому что он поддерживает все значения OutputCacheLocation:

  [OutputCache (Duration=3600, VaryByParam="param1;param2")]
  public string AjaxHtmlOutputMethod(string param1, string param2)
  {
       if (error)
       {
           Response.Cache.SetNoStore(); 
           Response.Cache.SetNoServerCaching();
       }
  }

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

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

Ответ 3

Я думаю, что правильный поток:

filterContext.HttpContext.Response.Cache.SetNoStore()

Ответ 4

Другой вариант - использовать VaryByCustom для OutputCache и обрабатывать недействительность определенных элементов кеша.

Возможно, он работает для вас, но это не общее решение вашей проблемы.

Ответ 5

Добавить код в AjaxHtmlOutputMethod

HttpContext.Cache.Insert("Page", 1);
Response.AddCacheItemDependency("Page");

Чтобы очистить кэш вывода, теперь вы можете использовать

HttpContext.Cache.Remove("Page");