MVC控制器属性,这些是缓存的吗?属性构造函数只调用一次?

时间:2014-07-09 15:45:49

标签: asp.net-mvc caching

我在控制器上有一个属性,控制器动作:

    [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列表。

我猜这些是缓存的,它们在哪里被缓存?这是可选行为吗?

感谢

1 个答案:

答案 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

然而,根据

Authorize Attribute Lifecycle

ASP.NET将缓存ActionFilter属性。因此,您可能无法多次调用构造函数,而是必须重构代码以维护属性状态。

<强>更新

您可以通过设置缓存策略来控制它:

protected void SetCachePolicy( AuthorizationContext filterContext )
{
    HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
    cachePolicy.SetProxyMaxAge( new TimeSpan( 0 ) );
    cachePolicy.AddValidationCallback( CacheValidateHandler, null /* data */);
}

Prevent Caching of Attributes in ASP.NET MVC, force Attribute Execution every time an Action is Executed