如何在ASP.NET MVC应用程序中缓存SpreadSheetGear对象?

时间:2017-04-01 21:11:56

标签: asp.net-mvc caching iis-8 spreadsheetgear

在ASP.NET MVC应用程序中,我正在执行xlsx文件中的计算。我们在讨论计算中的18K变量(xlsx文件大约是10MB),因此将它们加载到SpreadSheetGear实例需要一段时间。因此,我需要在请求之间缓存SpreadSheetGear对象,否则每个请求将永远需要。

现在我正在使用In-Proc应用程序缓存和会话缓存来保存请求之间的数据。在我的测试环境中,IIS的应用程序池比我们的会话超时(我认为默认的20分钟)更快地(有时只是几分钟)回收。池循环导致丢失所有In-Proc缓存数据,并且必须再次进行冗长的加载过程。

  1. 据我所知,没有函数来序列化SpreadSheetGear对象(例如,除了以xlsx格式保存它)。如果我可以序列化它,那么我可以切换到进程外缓存工具。但即便如此,与In-Proc内存缓存相比,我仍有点怀疑。
  2. 我无法弄清楚为什么回收会发生。虽然服务器内存不足,但我没有为IIS应用程序池设置任何内存限制或VM内存限制。我在IIS日志中找不到回收事件。
  3. 有没有办法保护In-Proc内存数据以便在App Pool回收中存活?
  4. 有没有人与SpreadSheetGear + ASP.NET MVC + IIS有相似的经历?

1 个答案:

答案 0 :(得分:0)

当多个会话占用太多内存时,我遇到了类似的问题。一旦达到阈值,IIS终止随机会话以释放内存。解决方案是将缓存从CacheItemPriority.Default更改为CacheItemPriority.NotRemovable。这样IIS就不会从内存中移除会话,并且在超时时或者如果会话关闭,它将调用CacheItemRemovedCallback()并从内存中删除。

HttpRuntime.Cache.Insert(workbookPath, myWorkbook, Nothing, Cache.NoAbsoluteExpiration, New TimeSpan(0, 0, 1520), CacheItemPriority.NotRemovable, New CacheItemRemovedCallback(AddressOf OnRemoveCallBack))