我正在ASP.NET 4.5中开发我的应用程序。我设置了一个Web服务。 Jquery使用GET Ajax调用访问Web服务。该函数有一个'id'参数,对于每个id,它返回不同的内容。
我想在服务器和客户端上缓存这些数据。在客户端我已经知道如何使用'CacheDuration',但问题在于客户端。我使用HttpFox来获取每个响应的标题。
我在函数的开头设置了以下代码:
HttpCachePolicy cache = HttpContext.Current.Response.Cache;
cache.SetCacheability(HttpCacheability.Private);
cache.SetExpires(DateTime.Now.AddMinutes((double)10));
cache.SetMaxAge(new TimeSpan(0, 0, 10));
FieldInfo maxAgeField = cache.GetType().GetField(
"_maxAge", BindingFlags.Instance | BindingFlags.NonPublic);
maxAgeField.SetValue(cache, new TimeSpan(0, 10, 0));
我想要做的是阻止客户端再次发送相同ID的请求,然后让我们说... 10分钟。因此,在第一次调用时,将发出请求,我们得到响应200.第二次响应头应该是304。
现在上面的代码没有这样做,我想知道如何实现这一点。我再次谈论返回304的客户端缓存,所以它希望再次访问服务器以获得相同的“id”,直到缓存过期。
我知道可以使用代码完成,所以请不要提交IIS类型的解决方案。
需要你的帮助来解决这个问题。
答案 0 :(得分:1)
您需要实现上次修改的标题
Response.Cache.SetLastModified(lastWriteTime.Value.ToUniversalTime());
这将允许您的客户端检查最后修改的值而不是重新获取。
理论上,您可以使用
将最后修改时间假设为最接近的10分钟public static DateTime Round10(this DateTime value)
{
var ticksIn10Mins = TimeSpan.FromMinutes(10).Ticks;
DateTime dtReturn = (value.Ticks % ticksIn10Mins == 0) ? value : new DateTime((value.Ticks / ticksIn15Mins + 1) * ticksIn10Mins);
if(dtReturn > DateTime.Now())
{
return dtReturn.AddMinutes(-10);
} else {
return dtReturn;
}
}
Response.Cache.SetLastModified(Round10(DateTime.Now);
此代码未经测试