【发布时间】:2015-03-24 16:05:00
【问题描述】:
我有一个长时间运行的 Web 服务(3-5 分钟),它返回一个大型自定义对象。
我这样声明 web 方法...
public class MyService : System.Web.Services.WebService
{
[WebMethod(CacheDuration=86400)]
[XmlInclude(typeof(MyObject))]
public MyObject Items(string myParam)
{
return new MyObject(myParam);
}
}
然后我在经典的 ASP.NET 4.0 应用程序中使用该服务并像这样缓存“项目”的元素...
protected MyService.MyObject servObj = new MyService.MyObject();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Cache["elems1"] == null)
{
MyObject items = servObj.Items("myParam");
Cache.Insert("elems1", servObj.elems1, null, DateTime.MaxValue, TimeSpan.FromHours(24));
Cache.Insert("elems2", servObj.elems2, null, DateTime.MaxValue, TimeSpan.FromHours(24));
}
}
}
当我运行应用程序时,似乎网络服务缓存有时可用,有时不可用,即它没有持续指定的持续时间。 Web 服务在 IIS 上它自己的应用程序池中运行。
任何想法为什么?有没有更智能的方法来缓存 Web 服务结果?
【问题讨论】:
-
只有在不是 PostBack 时才填充缓存。您确定您没有尝试在将缓存中的项目实际放入缓存之前对其进行引用吗?如果您的 Web 服务抛出错误怎么办?不会将任何内容放入缓存中。
-
IIS 默认在 20 分钟不活动后关闭应用程序。如果您没有更改该值,则它比您在此处指定的持续时间短得多。
-
我已经在其他地方处理过 Web 服务故障错误。 IIS 配置为在 20 小时使应用程序超时,但它似乎在大约 20 分钟后超时。很奇怪。
-
@cymorg 20 小时不活动或每 20 小时回收一次?有两种不同的设置:stackoverflow.com/a/19985866/612036。只需仔细检查以确保这是我要检查的第一件事。
标签: c# asp.net web-services caching iis