如何以编程方式清除控制器操作方法的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");