试图在c# WebService中全局缓存数据,但遇到问题
本文关键字:数据 遇到 问题 缓存 全局 WebService | 更新日期: 2023-09-27 18:09:36
我正在使用一个运行速度非常慢的API,因此我的应用程序的性能受到了相当大的影响。我已经设法优化了一些代码,并大大减少了加载时间,但我也想在所有会话中缓存一些数据,以尽量减少我必须进行的服务器点击量。我现在执行的一个API调用几乎需要10秒才能运行,并且返回的数据很少更改(可能每隔几周更改一次)。我想做的是缓存该结果,以及它被检索的时间,并且仅在自上次调用以来经过一定时间后才进行API调用,否则返回缓存的结果。目前我正在尝试这个:
[WebMethod]
public List<RegionList> getRegionLists() {
if (GlobalAppCache.RegionListsLastUpdate == DateTime.MinValue || GlobalAppCache.RegionListsLastUpdate.AddMinutes(15) > DateTime.Now)
{
List<RegionList> regionLists = new List<RegionList>( );
// Do Some API Calls
GlobalAppCache.RegionListsLastUpdate = DateTime.Now;
GlobalAppCache.CachedRegionLists = regionLists;
return regionLists;
}
return GlobalAppCache.CachedRegionLists;
}
与GlobalAppCache类为:
public class GlobalAppCache {
public static DateTime RegionListsLastUpdate{get;set;}
public static List<RegionList> CachedRegionLists{get;set;}
}
这种缓存方法似乎不工作(每次API调用,缓存的结果永远不会返回),我还没有能够得到任何与应用程序[]数组工作。谁能给我指个正确的方向?如果我能得到这个工作,我可以通过在这个GlobalAppCache对象中缓存更多的项目来提高性能。谢谢!
尝试写入HttpApplicationState对象Application。在检索数据时,您应该注意转换以正确的数据类型:
Application["LastUpdate"] = DateTime.Now;
. .... .
object o = Application["LastUpdate"];
if (o != null) DateTime dLastUpdate = Convert.ToDateTime(o);
……
当运行web服务的appool被重新启动/回收时,Application对象死亡
好的,我已经找到了解决我的问题的方法。显然,在阅读WebMethod标志的文档时,我错过了CacheDuration属性。由于我试图缓存方法的输出,因此只需更改
[WebMethod]
[WebMethod(CacheDuration = (60*60*24*2))]
固定!