2010-10-20 75 views
5

我試圖讓ASP.Net通過設置WebMethod屬性的CacheDuration屬性緩存Web服務請求的響應:疑難解答ASP.Net緩存 - CacheDuration屬性似乎沒有任何效果

[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緩存正在發生什麼?

回答

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; 
} 
0

確認您的瀏覽器未發送緩存控制:no-cache標頭及其請求。根據文檔,如果用戶代理指定了no-cache,則不會發送緩存結果。

根據您發佈的.ajax調用,您應該很好,但仔細檢查實際發送到服務器的內容會讓您確信。

fiddler這樣的工具對調試瀏覽器/網絡服務交互的線路上發生了什麼是非常寶貴的。

+0

經過這已經 - 沒有緩存控制頭中發送 - 我也嘗試設置Cache-Control頭自己明確,但沒有區別。 – Justin 2010-10-20 06:08:29

+0

嘗試在ASP.NET應用計數器集,緩存API條目和輸出緩存條目(也可能是同一區域中的命中/未命中計數器)的服務器上查看perfmon。這至少會告訴你,如果ASP.Net緩存項目,但不發送它們,或緩存輸出,但由於某種原因,決定每個頁面在某種程度上是獨一無二的,並緩存它們(例如,你應該看到項目數量在第一請求和高速緩存命中上升爲後續如果它的工作,但如果條目隨着每個請求增加,它認爲請求是由於某種原因不同)。 – 2010-10-21 00:59:24