我正在使用运行速度非常慢的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调用,并且永远不会返回缓存的结果),而且我无法获得与Application []有关的任何内容数组也可以工作。有人能指出我正确的方向吗?如果我能够实现这一点,我可以通过缓存此GlobalAppCache对象中的更多项来提高性能。谢谢!
答案 0 :(得分:1)
尝试写入HttpApplicationState对象Application。检索数据时,应注意转换以更正数据类型:
Application [“LastUpdate”] = DateTime.Now;
.. .. ..
object o = Application["LastUpdate"];
if (o != null) DateTime dLastUpdate = Convert.ToDateTime(o);
... ...
当运行web服务的AppPool重新启动/回收时,Application对象将死亡
答案 1 :(得分:0)
好的,我找到了解决问题的方法。显然,在阅读WebMethod标志的文档时,我错过了CacheDuration属性。因为我试图缓存我的方法的输出,只需更改
[WebMethod]
到
[WebMethod(CacheDuration = (60*60*24*2))]
修好了!