2011-10-17 27 views
1

有人可以为此阐述一些情况吗?的动作被装饰这种方式:ASP MVC 3输出缓存不能像预期的那样运行

[OutputCache(Duration = 5, VaryByParam = "none")] 
     public ActionResult MyAction() 
{ 
// DO STUFF HERE... 
} 

的MyAction调用具有形式(其回发到MyAction POSTED-方法)的图。 机制(发回)的工作正常。我宣布持续时间5,意思是5秒(或不是?)。因此,5秒后如果再叫它

http://myAddress/MyController/MyAction

。 。 。行动不叫!为什么?我错过了什么? 在此先感谢!

回答

1

尝试排除客户端缓存。 (清除浏览器中的缓存,或使用不同的浏览器,添加一个虚拟参数等)。您的浏览器比非输出缓存页面更有可能缓存此内容,因为MVC实际上会向客户端发送一条建议以缓存内容在指定的时间。如果您的浏览器采取了这一建议并决定缓存时间超过建议时间,我不会感到惊讶。

您的服务器端代码在什么时候再次触发? 20秒? 40?永远不会消失?

+0

说实话,我也认为它与客户端缓存有关。所以我清除缓存(在Mozilla的FireFox),并立即调用\t http:// myAddress/MyController/MyAction具有相同的结果(该动作不会被调用) –

+0

我认为你的建议是最接近这种类型的解决方案的问题。所以我把它当成解决方案。谢谢。 –

+0

@sawas它是否曾经再次调用动作方法? 5分钟后? –

0

如果你想测试的OutputCache属性是很容易做到:

控制器: 公共类HomeController的:控制 { [的OutputCache(持续时间= 60)] 公众的ActionResult指数() {ViewPoint.Time = DateTime.Now; }}

查看:

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p>@ViewBag.Time</p> 

如果您编译此一进入主页行动,它会显示当前时间。如果刷新它,则不会再更新60秒。

另一方面,我不确定你是否理解VaryByParam参数。这将意味着它将缓存“none”查询参数的单独版本。

这意味着,如果你有以下网址:

/home/index 
/home/index?none=abc 
/home/index?none=xyz 

他们都将彼此分开缓存。也许你确实理解了这一点,但我解释你的“无”意味着你不希望它因参数而异,这就是为什么你把“无”放在那里的原因。如果我误解了你的意图,那就忽略这一部分。

0

原来,这种行为是由Action Method中的错误逻辑造成的。在Firebug调试显示如下:

Server ASP.NET Development Server/10.0.0.0 
Date Mon, 17 Oct 2011 18:23:46 GMT 
X-AspNet-Version 4.0.30319 
X-AspNetMvc-Version 3.0 
Cache-Control no-cache, no-store, must-revalidate 
Pragma no-cache 
Expires -1 
Content-Type text/html; charset=utf-8 
Content-Length 7057 
Connection Close 

哪(我认为)是正确的行为! 感谢大家的帮助!

相关问题