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