【问题标题】:Caching in MVC .NETMVC .NET 中的缓存
【发布时间】:2015-10-23 04:45:52
【问题描述】:

我正在显示基于数据库查询的表。 ajax 请求用于从表中获取数据,将其序列化为 json,并通过在前端使用 datatables JavaScript 库来更新数据。

我需要能够将该表输出到 Excel。这需要采用非常特定的格式,我已经在 C# 中编写了正确工作的类等。我还有一个控制器,它将传回一个文件流,以便用户下载文件。

我的问题是关于缓存数据库中的数据。我不想回到数据库并重新运行查询,然后将报告传递给我的 excel 导出器,它应该以某种方式存储 - 用户运行的最新报告。

我可以想到两种方法:

1) 客户端缓存 - 存储用户运行的最新报表,然后让 excel 导出器使用缓存中的最新报表数据。

2) 发回来自 Ajax 调用的最新 json 响应,并在控制器中反序列化回报告对象。

第一个似乎是最合乎逻辑的,因为第二个看起来很混乱且容易出错。我想知道这是否是最好的解决方案,如果不是最好的方法的建议。

【问题讨论】:

  • 我会在您的控制器操作中以 OutputCacheAttribute 开头。
  • @Jasen 谢谢,我对此仍然有些困惑。这种缓存方法似乎只是缓存特定的控制器,但我并不真正关心那个控制器,因为它是通过 ajax 调用并返回 JSON。我希望数据库和服务返回的对象(报表对象列表)在缓存中,这仍然可能吗?
  • 它会缓存一个动作结果。因此,在缓存过期或失效之前,后续请求不会命中数据库。如果您的 C# 代码被编写为使用对象结果,则 OutputCache 可能不合适。

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


【解决方案1】:

我认为还有第三种选择。我可以想到 2 种简单的服务器端缓存方法,它们可能对您有用。

  1. 输出缓存
  2. System.Runtime.Caching

如果您在动作上设置输出缓存,它非常有用且非常简单

在下面的示例中,动作将被缓存 10 个部分

public class HomeController : Controller
{
    [OutputCache(Duration=10, VaryByParam="none")]
    public ActionResult Index()
    {
        return View();
    }

}

你甚至可以拥有基于参数的缓存键

 [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
    public ActionResult Details(int id)
    {
        ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id ==    id);
        return View();
    }

这是输出缓存的链接

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs

但是,如果您想使用 System.Runtime.Caching 在服务器端进行缓存,您可以在此处找到一个很好的示例 http://deanhume.com/home/blogpost/object-caching----net-4/37

【讨论】:

  • 非常感谢。服务器端缓存我有点困惑,好像我有多个用户在查看报告,其中一个尝试将报告导出到 excel,那么他们不会有可能获得不同的缓存对象 - 基本上是由任何人运行的最后一个报告用户。同样使用输出缓存,这对我来说确实是最好的解决方案,我有点担心时间,因为用户可能会在导出之前等待一段时间。我是否也会在多个用户中看到相同的问题,还是逐个用户缓存?
  • 您可能正在传递 userId 来获取数据。在这种情况下,您可以将输出缓存到 VaryByParam ="userId"。这将为每个用户创建缓存。您还可以选择使用 OutputCacheLocation.Client。在 System.Runtime.Caching 中,您的缓存键还应包括 userId,以便缓存是每个用户的
  • 对此我还是有点困惑。这种缓存方法似乎只是缓存特定的控制器,但我并不真正关心那个控制器,因为它是通过 ajax 调用并返回 JSON。我希望数据库和服务返回的对象(报表对象列表)在缓存中,这仍然可能吗?
  • 是的,这是可能的。我将很快发布一个示例。
猜你喜欢
  • 2018-11-09
  • 2016-01-28
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多