2011-03-20 60 views
19

我有一個asp.net mvc 3項目,我有一個家庭控制器。我已標記的我與這個屬性索引操作:ASP.NET MVC OutputCache因*而有所不同,並因用戶cookie而異

[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")] 
public ActionResult Index() 
{ 
    return View(); 
} 

將通過用戶在Global.asax.cs中被處理,以檢查用戶的cookie值自定義不同,所以根據該緩存是否改變用戶登錄或不是和他們是什麼用戶。

當我去這個頁面我的Web服務器上,我的迴應得到這些標題:

Cache-Control public, max-age=120 
Content-Type text/html; charset=utf-8 
Content-Encoding gzip 
Expires Sun, 20 Mar 2011 21:50:09 GMT 
Last-Modified Sun, 20 Mar 2011 21:48:09 GMT 
Vary Accept-Encoding 
Date Sun, 20 Mar 2011 21:48:09 GMT 
Content-Length 3105 

馬上蝙蝠,在不同 - 接受編碼值看起來錯了,不應該有它發送Vary - *代替?

我正在將User.Identity.Name屬性渲染到此視圖,並且我注意到即使在註銷它時它仍將呈現用戶名,直到120秒過期。

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom.Equals("user", StringComparison.OrdinalIgnoreCase)) 
    { 
     HttpCookie cookie = context.Request.Cookies["user"]; 
     if (cookie != null) 
     { 
      return cookie.Value; 
     } 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 

一直玩這個了幾個小時,我完全被卡住,希望有人有一個想法......

回答

17

通過在web.config中的urlCompression元素上設置dynamicCompressionBeforeCache="true",您可以讓IIS在響應緩存之前壓縮響應。這將導致返回預期的Vary:*標題。

摘錄,從IIS Configuration Reference,有關dynamicCompressionBeforeCache屬性:

dynamicCompressionBeforeCache屬性指定IIS是否將動態壓縮尚未緩存的內容。當dynamicCompressionBeforeCache屬性爲true時,IIS會在第一次請求時動態壓縮響應,並將內容排隊以進行壓縮。隨後的請求會動態提供,直到壓縮響應添加到緩存目錄中。一旦將壓縮響應添加到緩存目錄中,緩存的響應就會發送給客戶端以用於後續請求。當dynamicCompressionBeforeCachefalse,IIS將返回未壓縮的響應,直到壓縮響應添加到緩存目錄。

+0

超級這是很好的知道 – jjxtra 2011-07-25 15:52:22

+0

非常好的提示。我不知道它爲什麼在IIS7.0中默認爲false,這導致我們產生了一個bug的輸出緩存 – 2011-11-13 00:26:18

4

問題是IIS動態壓縮。它弄亂了http頭文件。我通過使用actionfilter滾動我自己的動態壓縮來解決它。

0

對此有一個Microsoft HotFix但他們不會讓你只是下載修補程序。

你必須填寫您的電子郵件爲他們發給你和它說:「如果沒有先測試修補程序部署在生產環境中的修補程序」

  • 「在安裝此修補程序之前,備份系統或將收到此修復程序的計算機。「

從我可以看到它創建了以下問題

  • 沒有卸載
  • 需要重啓
  • 的最後修改日期,即使它返回的每個請求更新緩存版本

更多信息:

http://support2.microsoft.com/kb/2877816/en-gb

http://blogs.iis.net/erez/archive/2013/08/02/iis-compression-overrides-the-vary-header.aspx

https://51degrees.com/support/documentation/net/iis-modification

所以仔細想想在安裝此之前!

相關問題