ASP MVC 3 OutputCache避免缓存当前请求

时间:2012-02-07 15:57:21

标签: asp.net-mvc asp.net-mvc-3 caching outputcache

我开始在我的网站上使用OutputCache。 我遇到的问题是,当用户更新项目时,我需要重置该项目的缓存。

我是这样做的:

var urlToRemove = Url.Action("Details", "Dress", new {id = model.Id});
Response.RemoveOutputCacheItem(urlToRemove);

在编辑操作中,我还将更新成功消息设置为TempData,并在下一个请求中显示它。问题是该消息仍保留在缓存的响应中。

你知道我怎么能避免在一个动作中缓存。类似的东西:

[OutputCache(Duration = 3600, VaryByParam = "id")]
public ViewResult Details(int id)
{  
  if(NotificationHelper.HasNotifications)
    Response.DoNotCache();
    .....

我不能使用相同的技巧...因为页面在渲染后被添加到缓存中。所以我不能在其正文中从缓存中排除一个动作。

3 个答案:

答案 0 :(得分:2)

您所描述的内容有时被称为“Donut Hole Caching”,因为您希望在中间缓存除了一些动态内容之外的所有内容。

以下是您可能想要查看的一些资源:

答案 1 :(得分:0)

我不知道是否有一种简单的方法可以满足您的要求。但是,我对消息和OutputCache的体验并没有将它们放在响应中。我最终确保没有任何消息显示在缓存页面上。如果我必须在缓存页面上有一条消息,我会设置一个ajax调用,一旦响应到达客户端就会获取消息。

答案 2 :(得分:0)

这是怎么回事?

class CustomOutputCacheAttribute : OutputCacheAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Response.StatusCode >= 400)
        {
            this.Location = System.Web.UI.OutputCacheLocation.None;
            this.Duration = -1;
        }

        filterContext.HttpContext.Response.Cache.SetOmitVaryStar(true);
        base.OnActionExecuted(filterContext);
    }

}