2010-11-12 16 views
3

在我的應用程序中,我會記住用戶在會話中的語言選擇。 問題是如果我使用輸出緩存,那麼更改語言函數將不起作用,因爲它根據Session [「lang」]值從數據庫檢索時緩存結果。如何在這種情況下使用outputcache?

那麼如果我有另一種方法來使用緩存功能?或者我怎樣才能縮短響應時間?

回答

1

輸出緩存基礎結構的一部分是VaryBy機制,它是一種指示ASP.NET保持同一頁面的並行緩存根據查詢字符串等某些數據而變化的方式。在這種情況下,VaryByCustom機制可能是最簡單的實現。 Here's a short article with a good example.

首先,緩存屬性:

[OutputCache(CacheProfile = "CachedPage")] 
public ActionResult Index() 
{ 
    return View(); 
} 

緩存配置文件:

<caching> 
    <outputcachesettings>    
     <outputcacheprofiles> 
      <add varybycustom="Language" 
       varybyparam="*" 
       duration="86400" 
       name="CachedPage" /> 
     </outputcacheprofiles> 
    </outputcachesettings> 
</caching> 

最後,在Global.asax.cs中的定製邏輯:

public override string GetVaryByCustomString(
    HttpContext context, 
    string arg) 
{ 
    if (arg == "Language") 
    { 
     return Session["lang"].ToString(); 
    } 
    else 
    { 
     return base.GetVaryByCustomString(context, arg); 
    } 
} 

現在對於Session["lang"]返回的每個可能的唯一值,ASP.NET將保留一個緩存的c opy在該參數下執行的頁面。

+0

我以前讀這樣的事情,但似乎不起作用,它始終緩存的結果。 – MemoryLeak 2010-11-12 03:32:29

+1

@MemoryLeak正確實施我向你保證它工作得很好。 – 2010-11-12 03:46:57

+2

我發現Context.Session爲null,它不應該是null!這是怎麼回事 ? – MemoryLeak 2010-11-12 03:47:57

-1

保存在cookie中這個值,會話中未提供GetVaryByCustomString

+0

這應該是評論。 – 2017-11-10 08:49:18