我开始在我的网站上使用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();
.....
我不能使用相同的技巧...因为页面在渲染后被添加到缓存中。所以我不能在其正文中从缓存中排除一个动作。
答案 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);
}
}