Asp.net mvc 3 以编程方式从OutputCacheAttribute清除缓存?

Asp.net mvc 3 以编程方式从OutputCacheAttribute清除缓存?,asp.net-mvc-3,Asp.net Mvc 3,在我们的代码中,我们有一个MVC控制器操作,它用OutputCacheAttribute修饰。在其他操作中是否有任何方法可以清除第一个操作的缓存?这取决于具体情况。如果是子操作,缓存将存储在中,清除它的唯一方法是未记录的,并且需要破坏整个内存缓存: OutputCacheAttribute.ChildActionCache = new MemoryCache("NewDefault"); 当然,缺点是这会删除所有缓存的子操作,而不仅仅是该子操作的缓存输出。如果它是一个普通操作,那么您可以通过向

在我们的代码中,我们有一个MVC控制器操作,它用
OutputCacheAttribute
修饰。在其他操作中是否有任何方法可以清除第一个操作的缓存?

这取决于具体情况。如果是子操作,缓存将存储在中,清除它的唯一方法是未记录的,并且需要破坏整个内存缓存:

OutputCacheAttribute.ChildActionCache = new MemoryCache("NewDefault");
当然,缺点是这会删除所有缓存的子操作,而不仅仅是该子操作的缓存输出。如果它是一个普通操作,那么您可以通过向它传递缓存的操作的url来使用该方法。你可能也会发现这很有趣

ASP.NET MVC 3中的缓存还有很长的路要走。希望他们能够改进ASP.NET MVC 4中的许多内容并简化它。

是的,这是可能的 我已经从中找到了答案。 请参见ASP.NET MVC中的14.3输出缓存 第372页-确定地从缓存中删除项目

当我们用OutputCache属性修饰动作时,OutputCache 将其结果存储到ASP.NET缓存中并自动恢复 当它必须服务于随后的类似请求时。如果我们知道是哪个 缓存页所属的密钥,我们可以轻松删除它。 不幸的是,这不容易做到,即使做到了,我们 我们不应该知道它,因为它存在于内部逻辑中 缓存基础结构的更改,并且可能会在中更改,恕不另行通知 未来版本。不过,我们可以做的是利用缓存 依赖机制来实现类似的结果。此功能是 类似于我们将在第节中讨论的更改监视器 14.4. 利用缓存依赖关系包括将一个缓存项绑定到另一个缓存项,以便在第一个缓存项无效时自动删除第一个缓存项

还有一段代码

public class DependencyOutputCacheAttribute : OutputCacheAttribute
{
public string ParameterName { get; set; }
public string BasePrefix { get; set; }

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
  base.OnResultExecuting( filterContext );

  string key = string.IsNullOrEmpty( BasePrefix )
                 ? filterContext.RouteData.Values["action"] + "_" + filterContext.RouteData.Values["controller"]
                 : BasePrefix;

  key = AddToCache( filterContext, key, ParameterName);
}

private string AddToCache(ResultExecutingContext filterContext, string key, string parameter)
{
  if ( !string.IsNullOrEmpty( parameter ) && filterContext.RouteData.Values[parameter] != null) {
    key += "/" + filterContext.RouteData.Values[parameter];
    filterContext.HttpContext.Cache.AddBig( key, key );
    filterContext.HttpContext.Response.AddCacheItemDependency( key );   
  }
  return key;
}
}
并删除缓存依赖项属性

public class RemoveCachedAttribute : ActionFilterAttribute
{
public string ParameterName { get; set; }
public string BasePrefix { get; set; }
public override void OnResultExecuting( ResultExecutingContext filterContext)
{
  base.OnResultExecuting(filterContext);
  string key = string.IsNullOrEmpty(BasePrefix) ?
  filterContext.RouteData.Values["action"].ToString() + "_" +
  filterContext.RouteData.Values["controller"].ToString() : BasePrefix;
  if (!string.IsNullOrEmpty(ParameterName))
    key += filterContext.RouteData.Values[ParameterName];
  filterContext.HttpContext.Cache.Remove(key);
}
}
最后使用它

    [DependencyCache( BasePrefix = "Story", ParameterName = "id" )]
public virtual ActionResult ViewStory(int id){
//load story here
}

[HttpPost, RemoveCache( BasePrefix = "Story", ParameterName = "id" )]
public virtual ActionResult DeleteStory(int id){
//submit updated story version
}

[HttpPost, RemoveCache( BasePrefix = "Story", ParameterName = "id" )]
public virtual ActionResult EditStory(Story txt){
//submit updated story version
}
在哪里


谢谢,我得看看那篇文章。
public class Story { 
  int id {get;set;} //case is important
  string storyContent{get;set;}
}