2017-06-23 39 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的作者)