尝试全局缓存C#WebService中的数据但存在问题

时间:2011-09-26 14:07:52

标签: c# web-services caching global-variables

我正在使用运行速度非常慢的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对象中的更多项来提高性能。谢谢!

2 个答案:

答案 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))]

修好了!