ASP MVC 3输出缓存不符合预期

时间:2011-10-17 15:56:13

标签: .net asp.net asp.net-mvc caching

有人可以对此有所了解吗?以这种方式装饰动作:

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

MyAction调用一个包含一个表单的视图(发布回MyAction POSTED-Method)。 机制(回发)工作正常。我声明持续时间5,意味着5秒(或不是?)。所以5秒后如果再次打电话

http://myAddress/MyController/MyAction

。 。 。动作没有被调用!为什么?我错过了什么? 提前谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果要测试OutputCache属性,则很容易这样做:

控制器:     公共类HomeController:控制器     {         [的OutputCache(持续时间= 60)]         公共ActionResult索引()         {             ViewBag.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

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

答案 2 :(得分: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

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