我有一个简单的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)则存在一个参数,无论我是否预期它。
[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 - RafayVaryByParam="none"
,但我从未想到即使没有参数也必须定义它 - 在文档中肯定没有提到。这样做就可以解决问题了,仍然使用客户端cache:false
。很高兴知道我是对的,同时还是错的! - K. Bob