使用ASP.NET Webservices响应304 - 客户端缓存

时间:2012-07-04 15:32:19

标签: c# asp.net caching http-status-code-304 clientside-caching

我正在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类型的解决方案。

需要你的帮助来解决这个问题。

1 个答案:

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

此代码未经测试