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

如果控制器动作具有在动作上指定的OutputCache属性,有什么办法可以清除输出caching而不必重新启动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)来清除它,但我很难找出什么path应该是映射到行动方法。 我将再次尝试使用由ViewName呈现的aspx页面。

可能我只是手动插入到HttpContext.Cache RenderToString的输出,而不是我不能找出这一个。

更新

请注意,OutputCache是​​VaryByParam,testing硬编码path“/ controller / action”实际上并不清除outputcache,所以看起来它必须匹配“/ controller / action / param1 / param2”。

这意味着我可能不得不恢复到对象级caching,并手动cachingRenderToString() 🙁

尝试这个

 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 UrlHelper(requestContext); 

更新:

尝试这个:

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

否则caching删除将无法正常工作,因为您已经在用户的计算机上caching了HTML输出

我认为正确的stream程是:

 filterContext.HttpContext.Response.Cache.SetNoStore() 

除了接受的答案之外,为了支持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()时 ,它们阻止当前请求被caching。 进一步的请求将被caching,除非这些请求也被调用。

这是处理错误情况的理想select – 通常情况下,您想要caching响应,但是如果它们包含错误消息,则不会。

另一个select是使用VaryByCustom作为OutputCache,并处理某些caching元素的失效。

也许它适合你,但这不是一个通用的解决scheme,你的问题

将代码添加到AjaxHtmlOutputMethod

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

清除输出caching您现在可以使用

 HttpContext.Cache.Remove("Page");