ASP.NET 2.0中max-age設(shè)置
ASP.NET 2.0中出現(xiàn)的一個bug就是不能改變max-age頭。當max-age設(shè)置為0時,ASP.NET 2.0會設(shè)置Cache-control為私有,因為max-age= 0意味著不需要緩存。因此,沒有辦法能夠使得ASP.NET 2.0返回緩存響應(yīng)的頭。這是由于ASP.NET AJAX框架對Web服務(wù)調(diào)用進行了攔截并在執(zhí)行一個請求之前,錯誤地將max-age設(shè)置為0作為默認值。
- public string CachedGet2()
- {
- TimeSpan cacheDuration = TimeSpan.FromMinutes(1);
- FieldInfo maxAge = Context.Response.Cache.GetType().GetField("_maxAge",
- BindingFlags.Instance|BindingFlags.NonPublic);
- maxAge.SetValue(Context.Response.Cache, cacheDuration);
- Context.Response.Cache.SetCacheability(HttpCacheability.Public);
- Context.Response.Cache.SetExpires(DateTime.Now.Add(cacheDuration));
- Context.Response.Cache.AppendCacheExtension(
- "must-revalidate, proxy-revalidate");
- return DateTime.Now.ToString();
- }
現(xiàn)在max-age設(shè)置成了60,因此瀏覽器將緩存響應(yīng)60秒。如果你在60秒內(nèi)進行相同的再次調(diào)用,則會返回相同的響應(yīng)。這里的測試輸出展示了從服務(wù)器上返回的時間:
一分鐘以后,緩存期滿同時瀏覽器再次向服務(wù)器發(fā)送請求調(diào)用。其客戶端代碼如下:
- function testCache()
- {
- TestService.CachedGet(function(result)
- {
- debug.trace(result);
- });
- }
另外一個問題解決了。在web.config文件中,你會看到ASP.NET Ajax添加了如下節(jié)點值:
- <system.web>
- <trust level="Medium"/>
這可以阻止我們設(shè)置Response對象的_maxAge字段,因為它需要反射。因此,你不得不刪除這一信任級別或者將其放置為Full。
- <system.web>
- <trust level="Full"/>
【編輯推薦】