Как программно очистить выходной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()
: (
Ответы
Ответ 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");