【问题标题】:How to cache method returned value in C# MVC如何在 C# MVC 中缓存方法返回值
【发布时间】:2019-03-20 20:53:14
【问题描述】:

我正在构建一个网络应用程序,它从数据库中选择大量信息并将其返回。我想存储从数据库返回表的方法的返回值 15 分钟,但使用 OutputCache 过滤器不起作用:

[OutputCache(duration=900)]
private DataTable[] GetInfoTables() {...}

该方法确实有效,只是找到,但是当我向其中一个表添加任何内容时(在首次登录站点并查看它们之后)它会立即刷新,我希望它缓存 15 分钟。 我无法缓存public ActionResult Index(),因为它会检查Sessions 的值。 谢谢

【问题讨论】:

  • 您查看过OutputCache 的文档吗?它并不是说它可以缓存任何方法的结果。您可能应该查看 Cache 对象。
  • 根据this 文章它确实适用于字符串方法
  • 不,它没有这么说。控制器上的操作方法与任何常规方法不同。框架调用action方法,并且可以在调用之前检查是否有缓存内容。如果您正在调用随机方法,那么您有责任实现缓存处理。它们可以帮助您找到一个存储要缓存的对象的地方,但是正确连接它取决于您。更仔细地重新阅读所有这些文档。
  • 你还需要帮助吗??????

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


【解决方案1】:

总结:

  • 我不知道有什么办法:

  • 使 OutputCache 使用普通的 C# 方法

  • 但是你可以绕过它:

  • 您可以将 MemoryCache 用于普通的 C# 方法

解决方案

  • 导入 System.Runtime.Caching(或使用 VS Intense)

  • 然后:

     private DataTable[] GetInfoTables()
        {

            ObjectCache cache = MemoryCache.Default;
            var dataTable = cache["DataTable"] as DataTable[];
            if (dataTable == null)
            {
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(5);
                dataTable =  getDataTable() ;
                cache.Set("DataTable", dataTable , policy);
            }

            return dataTable ;
        }

截图

我使用 EF 和 sql server 测试解决方案

参考文献

【讨论】:

    【解决方案2】:

    输出缓存存储呈现的 HTML 输出。因此,您不能将其用于函数、方法等。

    我开始使用CacheManager 库,它为在不同的缓存提供程序中缓存数据提供了一个独特的接口。我建议看看。

    question 中讨论了其他直接选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多