【问题标题】:Output cache or httpcontext.current.cache for my MVC application我的 MVC 应用程序的输出缓存或 httpcontext.current.cache
【发布时间】:2017-10-28 02:13:12
【问题描述】:

我们正在构建一个 MVC 应用程序,其中有大量静态数据要在用户第一次登录时加载。

幸运的是,登录过程中必须加载的大部分数据都是主数据,对于任何用户都不会改变 但是由于主数据的大小很大,我们认为最好在服务器端实现缓存,因为浏览器可能无法保存数据

我已阅读 Microsoft MVP 在OutputCache 上的codeproject 帖子,他清楚地解释了缓存的作用以及使用缓存时要记住的事项。 所以我通过添加行来实现他在我的控制器中建议的所有内容

[OutputCache(Duration = 10, VaryByParam = "none", 
    Location=OutputCacheLocation, NoStore=true)]

在我的 ActionMethod 之上。

但我无法调试数据是从缓存加载还是发生了另一台服务器命中。 所以我的第一个问题是如何调试输出缓存是否工作?

然后,在我们之前的 MVC 应用程序中,我们使用了 httpcontext.current.cache,它工作得非常好。 所以,这是我的第二个问题,为什么我应该更喜欢 OuputCache 而不是 httpcontext.current.cache 而反之亦然?

它们对缓存应用程序有什么不同?

编辑:1

这是我的登录视图控制器中的方法,

public ActionResult GetRegions(string Ids)
{
 objRegionsResult = GetRegionsList();
 if (!string.IsNullOrEmpty(Ids))
 objRegionsResult = objRegionsResult.Where(x => Ids.Split(',').Contains(x.Type.ToString())).ToList();
 return Json(objRegionsResult, JsonRequestBehavior.AllowGet);
}



 private List<MORegionMaster> GetRegionsList()
    {
      RequestUri = "Home/GetRegions";
      HttpResponseMessage response = ConnectAPI(RequestUri);
      if (response.IsSuccessStatusCode)
      {
        objRegionsResult = response.Content.ReadAsAsync<List<MORegionMaster>>().Result;
      }
   }
    return objRegionsResult;
}

所以上面的方法是我点击 api 控制器的地方,它依次点击业务逻辑类,然后是数据库并返回数据表。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 caching


    【解决方案1】:

    当我们想要缓存一个动作的结果(不是静态文件而是缓存业务逻辑结果)时,我们使用 OutputCache。当我们想在特定的持续时间内为所有用户提供数据时,我们会使用它。

    当我们想要缓存一些可以在同一个请求中多次使用的数据时,我们使用 httpcontext.current.cache,例如缓存“当前登录的用户对象”以避免多次 db 命中。

    此外,Output Cache 的生命周期不仅限于当前的 http 请求,而且 httpcontext.current.cache 的生命周期仅取决于当前的 http 请求。

    【讨论】:

    • 不,可能你误解了我的要求。我的要求不是缓存 js、css 文件,我需要缓存每次用户登录时通过 API 调用获取的主数据。但是所有不同用户的主数据保持不变,所以我需要缓存数据在服务器中
    • 只缓存业务逻辑吗?
    • 您是从 api 调用中获取主数据还是在请求中的某处使用它?
    • 为了更清楚,我在我的问题中添加了代码,请浏览 EDIT:1 部分
    • 在这里,您可以将 OutputCache 与 VaryByParam 一起用于 GetRegions 操作并使用 System.Runtime.Caching.MemoryCache 缓存 GetRegionsList() 结果。我指的是 MemoryCache,因为它的生命周期不限于当前的 http 请求,但 httpcontext.current.cache 的生命周期仅取决于当前的请求。
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多