0

我正在用 ASP.NET 4.5 开发我的应用程序。我设置了一个网络服务。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类型的解决方案。

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

4

1 回答 1

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

这段代码虽然未经测试

于 2012-07-04T15:38:50.303 回答