Webservice方法通用列表填写并保留1天

时间:2011-11-19 20:21:29

标签: c# asp.net web-services

我在web服务中有一个webmethod调用另一个webservice来获取数据并填充一个通用列表然后它返回它,我想要做的是将列表保存在内存中,所以下次调用webmethod时它会没有打到其他web服务,但只是返回列表,我已经尝试但是当我第二次调用web方法列表计数显示为0时,看起来垃圾收集正在清理所有。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

听起来我的列表可能不是静态的,也可能在非静态构造函数中始终为new。对此有三种可能的解决方法:

  1. 确保您的通用列表是静态属性,只能在静态构造函数中初始化。
  2. 查看您的时间要求我还建议您查看MemoryCacheCache
  3. 使用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