输出缓存属性和jQuery Ajax不缓存

4

我有一个简单的MVC3控制器操作,如下所示

[HttpGet]
[OutputCache(Duration = 1200,Location=System.Web.UI.OutputCacheLocation.Server)]
public string GetTheDate()
{
    return DateTime.Now.ToString();
}

我这样从jQuery Ajax调用它

jQuery.ajax({
            type: "GET",
            url: "http://localhost:60690/Public/GetTheDate",
            cache: false,
            success: function (data) {
                //alert("success");
                jQuery("#stats").append("<b>" + data + "</b>");
            },
            error: function (req, status, error) { alert("failure"); alert(error + " " + status + " " + req); }
        });

问题在于日期始终是当前日期,而不是缓存的响应。 我的理解是 [OutputCache(Location = Server)] 表示服务器(MVC 应用程序)缓存响应,并且当客户端请求数据时,操作被拦截以避免使用 DateTime.Now,而是返回缓存的响应。

我是否理解错误或者只是做错了什么?

更新:

3nigma 的答案是正确的。 VaryByParams="none" 就能解决问题,但是... 从我的方法中可以看出,我没有任何参数,那么为什么我需要说“none”呢?原来我认为文档所指的“Params”是我的方法参数,实际上它们不是我的方法参数,而是请求处理程序可能构成为参数的任何内容。

MS documentation 中提到:

当此属性设置为多个参数时,输出缓存包含每个指定参数的请求文档的不同版本。可能的值包括“none”、“*”和任何有效的查询字符串或POST参数名称。
请注意粗体字部分(我强调了这一点),这意味着尽管我不希望有任何查询字符串参数,但如果发送了任何参数(例如jQuery.ajax在将GET /Public/GetTheDate?_=1324047171837附加到请求时为cache:false)则存在一个参数,无论我是否预期它。
1个回答

6

使用cache: false,你明确告诉jQuery不要缓存。设置cache: true则相反。

编辑

像这样设置VaryByParam="none"

[OutputCache(Duration=1200, VaryByParam="none",Location=System.Web.UI.OutputCacheLocation.Server)]

但这不仅仅是说“不要在客户端缓存”。我的意思是,客户端始终发送请求,但OutputCache(location = server)表示:“像往常一样服务请求(从外部),但是不执行操作中的内容,而是返回缓存的结果。” 不是吗? - K. Bob
是的,服务器上的缓存意味着如果同样的请求来自其他用户,它将会被提供缓存结果,而不是经过操作。 - Rafay
尝试使用 [OutputCache(Duration=1200, VaryByParam="none",Location=System.Web.UI.OutputCacheLocation.Server)] 进行缓存,这里有一个有用的链接 http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs - Rafay
我已经阅读了那个页面,尽管他们使用了 VaryByParam="none",但我从未想到即使没有参数也必须定义它 - 在文档中肯定没有提到。这样做就可以解决问题了,仍然使用客户端cache:false。很高兴知道我是对的,同时还是错的! - K. Bob
你能否更新你的“正确”答案以反映真正的修复方法,我会给你点赞。谢谢。 - K. Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接