2017-06-23 38 views
0

我想在我的ASP.Net的Web API 2,我的意思是我有一個名爲簡介與性能用戶ID,SITEID,ColorTheme等ASP.Net的Web API - 緩存

我需要一個對象來實現緩存該對象爲每個請求,我不想保存在我的數據庫中。

我的問題是,ASP.Net WebApi是否有緩存像WebForm中的會話對象(例如redis)?

+2

您可以使用會話從的WebAPI,但不建議作爲的WebAPI最好應該是無狀態的,加入會議打破了。 – Igor

回答

0

如果你真的需要一個高速緩存,看起來像一個堅實的解決方案 - http://blog.developers.ba/simple-way-implement-caching-asp-net-web-api此外,您可以通過添加

protected void Application_PostAuthorizeRequest() 
{ 
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required); 
} 

使用Session你global.asax,雖然這可能會嚴重損害您的Web應用程序的性能。
Web API是爲REST實現而設計的,而REST體系結構的關鍵點之一是無狀態 - 您不應該有會話,您應該向每個請求發送包含所有必需用戶信息的安全令牌。如果你這樣工作,你會發現這個框架更容易玩到你的​​手,因爲那就是它的設計目的。

1

使用會話將您的實現緊密地耦合到非無狀態(因此不安靜)的細節。

我會做的是使用爲此特定目的創建的庫,如CacheManager

如果您打算在單個實例中執行您的應用程序並隨時隨地切換到分佈式方法(例如Redis),它將幫助您實現一個抽象緩存,該緩存可由RuntimeCaching支持。

你的依賴注入框架類似的信息(僞)內註冊:

container.RegisterSingleton<ICache<MyObject>>(() => 
    CacheFactory.Build<MyObject>(settings => settings.WithSystemRuntimeCacheHandle())); 

然後注入它的控制器內:

public class MyController : ApiController 
{ 
    private readonly ICache<MyObject> _cache; 

    public MyController(ICache<MyObject> cache) 
    { 
     _cache = cache; 
    } 

    public IHttpActionResult GetCached() 
    { 
     var myObj = _cache.Get("myKey"); 
     if(myObj == null) 
     { 
      myObj = GetObjectFromWhereverYouWant(); 
      _cache.Put(myObj, "myKey"); 
     } 

     return Ok(myObj); 
    } 

更多實例的documentation發現裏面。

0

你確定你不想使用你現有的數據庫嗎?您是否有高峯流量或規模,這意味着從每個請求的記錄系統生成配置文件實際上存在問題?沒有更多的信息,很難知道,但如果是我,我會猶豫直接跳到會話統計或內存緩存作爲add complexity

你可以考慮把一個簡單的解決方案放入沒有緩存或會話狀態的生產環境中,使用你現有的數據庫,並測量它是否需要改進?

假設你確實需要比數據庫更快的東西,我會使用一個名爲LazyCache的開源庫在內存中緩存用戶配置文件,該庫會在兩行代碼中爲您執行緩存。它也可在[nuget][1]

// get the cache (or use dependency injection?) 
IAppCache cache = new CachingService(); 
// get the user from cache or create their profile 
var cachedResults = cache.GetOrAdd("CacheKey",() => GetUser(userId)); 

它內置了默認情況下鎖定,因此緩存的方法纔會每次緩存未命中執行一次,它使用一個lambda所以你可以在一個去做「得到或添加」。

(聲明:我是LazyCache的作者)