将Response.RemoveOutputCacheItem与RedisOutputCacheProvider一起使用
本文关键字:一起 RedisOutputCacheProvider Response RemoveOutputCacheItem | 更新日期: 2023-09-27 18:22:50
我使用的是Microsoft RedisOutputCacheProvider,有一个非常简单的PartialView,我通过VaryByCustom
:基于当前用户的SessionId缓存它
[OutputCache(VaryByCustom = "User", Duration = 3600)]
[ChildActionOnly]
public ActionResult Notifications()
{
return PartialView("Partials/Notifications");
}
这很好,可以按预期进行缓存,但我想从另一个页面手动终止此OutputCache。我试过了:
Response.RemoveOutputCacheItem("/Controller/Notifications");
但这似乎并不奏效。我也无法通过Redis存储或后端代码看到任何OutputCache键,但我可以肯定地看到正在缓存的视图。
你试过这样的东西吗?
// Get the url for the action method:
var staleItem = Url.Action("Action", "Controller");
// Remove the item from cache
Response.RemoveOutputCacheItem(staleItem);
我认为您需要保存对ActionResult的引用。
祝你好运:)
PS:也许这个链接会帮助你:Dan Esparza 的博客
如果您正在执行自定义缓存清除逻辑,您可能会发现这也很有用:
private void ClearResponseCache(ActionExecutingContext filterContext)
{
if (filterContext == null)
return;
var urlHelper = new UrlHelper(filterContext.RequestContext);
var resolvedAction = urlHelper.Action(
filterContext.ActionDescriptor.ActionName,
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
new RouteValueDictionary(filterContext.ActionParameters));
if (resolvedAction != null)
filterContext.HttpContext.Response.RemoveOutputCacheItem(resolvedAction);
}