当前位置: 首页 > 知识库问答 >
问题:

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

邓子濯
2023-03-14

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

    [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方法,页面集列表仍然是设置好的。

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

谢谢

共有1个答案

万嘉熙
2023-03-14

尝试在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();

防止在ASP. NET MVC中缓存使用属性的特定操作

但是根据

授权属性生命周期

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

最新消息

您可以通过设置缓存策略来控制这一点:

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

防止在ASP.NET MVC中缓存属性,在每次执行操作时强制执行属性

 类似资料:
  • 1.如何通过参数化构造函数设置这些属性?? 类文件 > 我想通过传递参数构造函数的setter设置这些属性,但它没有设置这些属性 在这里,我想通过toString方法显示属性 }对象文件 为什么我无法通过构造函数设置这些属性?? public class Runnable{public static void main(String[]args){Product p1=新产品(“pc”,“Grey

  • 我正在尝试使用https://docs.oracle.com/javase/7/docs/api/javax/swing/text/SimpleAttributeSet.html 建造商: 基于提供的属性集创建新属性集。 所以我需要构建一个属性集来放入构造函数。看看javadochttps://docs.oracle.com/javase/7/docs/api/javax/swing/text/A

  • 因此,由于我一直在使用spring,如果我要编写一个具有依赖项的服务,我将执行以下操作: 我现在运行了使用另一个约定来实现相同目标的代码 这两种方法都会奏效,我明白。但是使用选项B有什么好处吗?对我来说,它在类和单元测试中创建了更多的代码。(必须编写构造函数,不能使用@InjectMocks) 是不是我漏了什么?autowired构造函数除了向单元测试添加代码之外,还有其他的功能吗?这是一种更好的

  • 我正在构建一个Javafx gui应用程序,我正面临这个问题。我的程序有多个场景,所以我有不同的FXML文件和控制器类。问题是,在第一个“主菜单”(这是我的应用程序中弹出的第一个)场景中,在控制器的构造函数中,我调用了一些从数据库加载数据的重型方法等等。所以会发生什么。在接下来的场景中我确实有“主菜单按钮”,即切换到主菜单场景!所以每次我回到“主菜单”场景时,构造函数都会调用大量加载数据的方法。但

  • 题目说明了一切,我得到了一个类,其中构造函数的变量必须是私有的。 当然,它附带了变量的公共。 现在问题就在我尝试制作一个名为 Magazine 的子类之后。该类应继承名称和价格,但对于每个对象启动,价格都是恒定的。所以它们不会作为名称出现在构造函数上。 这也带有它自己的。 我试图将价格放在构造函数中,但构造函数需要一个传递的参数。使用还会通知父构造函数中没有一个具有这样的形状。 当我尝试使用父类方

  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?