【问题标题】:Troubleshooting ASP.Net caching - CacheDuration property seems to have no effectASP.Net 缓存疑难解答 - CacheDuration 属性似乎没有效果
【发布时间】:2011-05-21 08:17:29
【问题描述】:

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

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

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

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

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

我是否遗漏了什么可能会阻止 ASP.Net 缓存此方法?

如果做不到这一点,是否有任何诊断机制可以让我更清楚地了解 ASP.Net 缓存的情况?

【问题讨论】:

    标签: asp.net jquery ajax caching


    【解决方案1】:

    根据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;
    }
    

    【讨论】:

      【解决方案2】:

      确认您的浏览器没有在其请求中发送 Cache-control: no-cache 标头。根据文档,如果用户代理指定了 no-cache,则不会发送缓存结果。

      根据您发布的 .ajax 调用,您应该没问题,但仔细检查实际发送到服务器的内容会让您确定。

      fiddler 之类的工具对于准确调试浏览器/Web 服务交互的网络中发生的事情非常宝贵。

      【讨论】:

      • 已经检查过了 - 没有发送缓存控制标头 - 我也尝试自己明确设置缓存控制标头,但没有任何区别。
      • 尝试在服务器上的 ASP.NET 应用程序计数器集、缓存 API 条目和输出缓存条目(以及同一区域中的命中/未命中计数器)中查看 perfmon。这至少会告诉您 ASP.Net 是否正在缓存项目但不发送它们,或者缓存输出但由于某种原因决定每个页面在某种程度上是唯一的并缓存它们(例如,您应该看到条目计数在第一个如果它正在工作,请求和缓存命中会上升,但如果条目随着每个请求而增加,它认为请求由于某种原因是不同的)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多