ASP.NET 2.0中max-age設置
ASP.NET 2.0中出現的一個bug就是不能改變max-age頭。當max-age設置為0時,ASP.NET 2.0會設置Cache-control為私有,因為max-age= 0意味著不需要緩存。因此,沒有辦法能夠使得ASP.NET 2.0返回緩存響應的頭。這是由于ASP.NET AJAX框架對Web服務調用進行了攔截并在執行一個請求之前,錯誤地將max-age設置為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();
- }
現在max-age設置成了60,因此瀏覽器將緩存響應60秒。如果你在60秒內進行相同的再次調用,則會返回相同的響應。這里的測試輸出展示了從服務器上返回的時間:
一分鐘以后,緩存期滿同時瀏覽器再次向服務器發送請求調用。其客戶端代碼如下:
- function testCache()
- {
- TestService.CachedGet(function(result)
- {
- debug.trace(result);
- });
- }
另外一個問題解決了。在web.config文件中,你會看到ASP.NET Ajax添加了如下節點值:
- <system.web>
- <trust level="Medium"/>
這可以阻止我們設置Response對象的_maxAge字段,因為它需要反射。因此,你不得不刪除這一信任級別或者將其放置為Full。
- <system.web>
- <trust level="Full"/>
【編輯推薦】