我在web服务中有一个webmethod调用另一个webservice来获取数据并填充一个通用列表然后它返回它,我想要做的是将列表保存在内存中,所以下次调用webmethod时它会没有打到其他web服务,但只是返回列表,我已经尝试但是当我第二次调用web方法列表计数显示为0时,看起来垃圾收集正在清理所有。有什么建议吗?
答案 0 :(得分:1)
听起来我的列表可能不是静态的,也可能在非静态构造函数中始终为new
。对此有三种可能的解决方法:
MemoryCache
或Cache
。 WebMethod
属性并设置CacheDuration
(即:[WebMethod(CacheDuration=86400)]
)答案 1 :(得分:1)
将其存储在ASP.NET缓存中。设置午夜的绝对到期应确保您每天只获得一次(除非由于空间问题而从缓存中丢失)。
[Web Method]
public List<Foo> GetFoos()
{
var foos = Cache["FooList"] as List<Foo>;
if (foos == null)
{
... get foos from remote web service ...
var expiration = DateTime.Today.AddHours(7);
if (DateTime.Now >= expiration)
{
expiration = expiration.AddDays(1);
}
Cache.Insert( "FooList", foos, null, expiration, Cache.NoSlidingExpiration );
}
return foos;
}
注意:您也可以使用输出缓存,但是您只能使用滑动过期。也就是说,它将根据请求发生的时间缓存一段时间。目前尚不清楚这是你想要的。例如,如果第一个请求发生在晚上11点,持续时间为24小时,那么在第二天晚上11点之前您将不会再次检查。如果您每天都在更改数据,那么最好在较短的时间内将ASP.NET缓存与输出缓存结合使用,以确保您及时获得最新的每日数据。
根据评论更新了示例。
答案 2 :(得分:0)
我没有在网络服务上试过这个,但我认为output cashing会起作用。
[WebMethod(CacheDuration=86400)]
public string FunctionName(string Name)
{
...code...
return(sb.ToString());
}
阅读:How to perform output caching with Web services in Visual C# .NET