【问题标题】:ASP.Net Web API - CacheASP.Net Web API - 缓存
【发布时间】:2017-06-26 05:12:47
【问题描述】:

我想在我的 ASP.Net Web API 2 中实现缓存。我的意思是我有一个名为 Profile 的对象,它具有 UserId、SiteId、ColorTheme 等属性。

每个请求我都需要那个对象,我不想保存在我的数据库中。

我的问题是,ASP.Net WebApi 是否有缓存,例如 WebForm 中的会话对象(例如 redis)?

【问题讨论】:

  • 您可以从 WebApi 使用 Session,但不建议这样做,因为理想情况下 WebApi 应该是无状态的并添加 Session 中断。

标签: c# asp.net caching asp.net-web-api


【解决方案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 中找到。

【讨论】:

    【解决方案2】:

    ASP.Net Web API 2 遵循 REST 模式,并且根据该模式,它应该是无状态的,但是是的,您可以使用任何缓存机制来存储对象。我已经将Redis 与Web API 一起用于同样的目的。应该使用Session,因为它会破坏模式。 Httpcontext.Cache是否支持不确定。请参阅以下帖子

    How to use caching in ASP.NET Web API?

    https://code.msdn.microsoft.com/Caching-In-Web-API-cb40be30

    【讨论】:

      【解决方案3】:

      如果你真的需要一个看起来像可靠解决方案的缓存 - http://blog.developers.ba/simple-way-implement-caching-asp-net-web-api 此外,你可以通过添加来使用 Session

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

      到您的 global.asax,尽管这会严重损害您的网络应用程序的性能。
      Web API 是为 REST 实现而设计的,REST 架构的一个关键点是无状态——你不应该有会话,你应该在每个请求上发送一个包含所有必需用户信息的安全令牌。如果您以这种方式工作,您会发现框架更容易上手,因为这就是它的设计目的。

      【讨论】:

        【解决方案4】:

        您确定不想使用现有数据库吗?您是否有高峰流量或规模,这意味着在每个请求上从记录系统生成配置文件实际上是有问题的?没有更多信息很难知道,但如果是我,我会犹豫直接跳到会话统计或内存缓存中,因为两者都是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 的作者)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-08
          • 1970-01-01
          • 2014-10-06
          • 1970-01-01
          • 2013-01-26
          相关资源
          最近更新 更多