我在控制器上有一个属性,控制器动作:
[InitialisePage(new[]{PageSet.A, PageSet.B})]
public ActionResult Index()
{
...
}
属性:
public class InitialisePageAttribute : FilterAttribute, IActionFilter
{
private List<PageSet> pageSetList = new List<PageSet>();
public InitialisePageAttribute(PageSet pageSet)
{
this.pageSetList.Add(pageSet);
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
MySettings.GetSettings().InitialiseSessionClass(pageSetList);
}
}
当第二次调用该动作时,不会调用该属性的构造函数?它直接进入OnActionExecuting方法,仍然设置了pageSet列表。
我猜这些是缓存的,它们在哪里被缓存?这是可选行为吗?
感谢
答案 0 :(得分:3)
尝试在OnActionExecuting中设置以下内容以防止缓存:
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
Prevent Caching in ASP.NET MVC for specific actions using an attribute
然而,根据
ASP.NET将缓存ActionFilter属性。因此,您可能无法多次调用构造函数,而是必须重构代码以维护属性状态。
<强>更新强>
您可以通过设置缓存策略来控制它:
protected void SetCachePolicy( AuthorizationContext filterContext )
{
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge( new TimeSpan( 0 ) );
cachePolicy.AddValidationCallback( CacheValidateHandler, null /* data */);
}