ASP.Net缓存疑难解答 - CacheDuration属性似乎没有任何效果

时间:2010-10-20 05:24:30

标签: asp.net jquery ajax caching

我正在尝试让ASP.Net通过设置CacheDuration属性的WebMethod属性来缓存Web服务请求的响应:

[WebMethod(CacheDuration = 60)]
[ScriptMethod(UseHttpGet = true)]
public static List<string> GetNames()
{
    return InnerGetNames();
}

以上是ASP.Net页面上的一种方法(我也尝试将其移动到自己的类中,但它似乎没有任何区别) - 我已将UseHttpGet设置为true因为POST请求没有被缓存,但是尽管我尽了最大的努力,它似乎仍然没有任何区别(方法开头的断点总是被击中)。

这是我用来调用方法的代码:

%.ajax({
    url: "MyPage.aspx/GetNames",
    contentType: "application/json; charset=utf-8",
    success: function() {
        alert("success");
    }

是否有任何我错过的可能阻止ASP.Net缓存此方法的内容?

如果失败了,我是否可以使用任何诊断机制来更清楚地了解ASP.Net缓存的情况?

2 个答案:

答案 0 :(得分:6)

根据此MSDN How to article,WebMethod属性的CacheDuration属性适用于 XML WebMethods。由于ScriptMethod属性指定返回 JSON ,因此我们不得不使用对象级缓存:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static List<string> GetNames()
{
    var result = GetCache<List<string>>("GetNames");
    if(result == null)
    {
        result = InnerGetNames();
        SetCache("GetNames", result, 60);
    }
    return result;
}

protected static void SetCache<T>(string key, T obj, double duration)
{
    HttpContext.Current.Cache.Insert(key, obj, null, DateTime.Now.AddSeconds(duration), System.Web.Caching.Cache.NoSlidingExpiration);
}

protected static T GetCache<T>(string key) where T : class
{
    return HttpContext.Current.Cache.Get(key) as T;
}

答案 1 :(得分:0)

验证您的浏览器未发送带有请求的Cache-control:no-cache标头。根据文档,如果用户代理指定了no-cache,则不会发送缓存结果。

根据您发布的.ajax电话,您应该很好,但仔细检查实际发送到服务器的内容会让您确定。

fiddler这样的工具对于调整浏览器/网络服务交互线路的确切内容非常宝贵。