如何以编程方式清除控制器操作方法的outputcache

时间:2009-07-22 20:04:03

标签: asp.net asp.net-mvc

如果控制器操作在操作上指定了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)来清除它,但是我无法弄清楚将它映射到action方法的路径。我将再次尝试使用ViewName呈现的aspx页面。

可能我只是手动将RenderToString的输出插入HttpContext.Cache,如果我无法解决这个问题。

更新

请注意,OutputCache是​​VaryByParam,测试出一个硬编码路径“/ controller / action”实际上并没有清除outputcache,所以看起来它必须匹配“/ controller / action / param1 / param2”。 / p>

这意味着我可能不得不恢复对象级缓存并手动缓存RenderToString()的输出:(

5 个答案:

答案 0 :(得分:53)

试试这个

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输出

答案 1 :(得分:6)

继续接受的答案,支持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()时,它们会阻止当前请求被缓存。除非为这些请求调用函数,否则将缓存更多请求。

这是处理错误情况的理想选择 - 通常您希望缓存响应,但不包含错误消息。

答案 2 :(得分:4)

我认为正确的流程是:

filterContext.HttpContext.Response.Cache.SetNoStore()

答案 3 :(得分:3)

另一种选择是使用VaryByCustom作为OutputCache并处理那里某些缓存元素的失效。

也许它适合你,但它不是你问题的一般解决方案

答案 4 :(得分:3)

将代码添加到AjaxHtmlOutputMethod

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

要清除输出缓存,您现在可以使用

HttpContext.Cache.Remove("Page");