将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键,但我可以肯定地看到正在缓存的视图。

将Response.RemoveOutputCacheItem与RedisOutputCacheProvider一起使用

你试过这样的东西吗?

//  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);
    }