如何以编程方式清除控制器动作方法的输出缓存

 2023-02-17    423  

问题描述

如果控制器操作具有在操作上指定的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)清除它,但我无法弄清楚路径应该将其映射到动作方法.我将使用ViewName呈现的ASPX页面重新尝试.

如何以编程方式清除控制器动作方法的输出缓存

可能会手动将RenderToString的输出插入HttpContext.Cache,而是如果我无法弄清楚这个.

更新

请注意,OutputCache是​​VaryByparam,并测试出硬编码路径”/controller/Action”实际上并不清除OutputCache,因此它看起来必须匹配”/Controller/Action/Param1/Param2″.

这意味着我可能必须恢复对象级别高速缓存,并手动缓存RenderToString()的输出:(

推荐答案

试试这个

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

其他推荐答案

进一步到接受的答案,支持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的答案要好得多,因为它支持所有outputCachleocation值:

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

当 setnostore( )和调用setnoservercaching(),防止缓存的当前请求.除非对这些请求调用函数,否则将缓存进一步的请求.

这是处理错误情况的理想选择 – 当您通常想要缓存响应时,但如果它们包含错误消息,则不包含.

其他推荐答案

我认为正确的流量是:

filterContext.HttpContext.Response.Cache.SetNoStore()

以上所述是小编给大家介绍的如何以编程方式清除控制器动作方法的输出缓存,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34255.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。