1

尝试在动态生成的图像上设置缓存响应标头,我收到一个奇怪的错误:

用户代码未处理 ArgumentOutOfRangeException

指定的参数超出了有效值的范围。

参数名称:utcDate

我正在从数据缓存中读取文件的最后写入时间,然后调用

Response.Cache.SetLastModified(lastWriteTime.Value.ToUniversalTime());

正如我所料,最后一次写入时间的值是{2011-07-25 18:09:56}......我不知道为什么会出错。

此方法的MSDN 文档包含相当神秘的陈述(我的重点):

Last-Modified HTTP 标头使用 DateTime 值标记文档,该值指示文档上次修改的时间。

如果违反了缓存限制层次结构,此方法将失败。

SetLastModified 是在 .NET Framework 3.5 版中引入的。有关详细信息,请参阅 .NET Framework 版本和依赖项。

什么是缓存限制层次结构?我违反了一个吗?如果不是,为什么最后修改时间被拒绝?

4

1 回答 1

6

ArgumentOutOfRangeException如果您lastWriteTime在未来,SetLastModified 将抛出。

这将成功:

var t1 = DateTime.Now;
Response.Cache.SetLastModified(t1);

这将失败:

var t2 = DateTime.Now + new TimeSpan(0, 0, 0, 1);
Response.Cache.SetLastModified(t2);

反编译 System.Web 说明了这一点:

public void SetLastModified(DateTime date)
{
  this.UtcSetLastModified(DateTimeUtil.ConvertToUniversalTime(date));
}

private void UtcSetLastModified(DateTime utcDate)
{
  utcDate = new DateTime(utcDate.Ticks - utcDate.Ticks % 10000000L);
  if (utcDate > DateTime.UtcNow)
    throw new ArgumentOutOfRangeException("utcDate");
  if (this._isLastModifiedSet && !(utcDate > this._utcLastModified))
    return;
  this.Dirtied();
  this._utcLastModified = utcDate;
  this._isLastModifiedSet = true;
}

您是否lastWriteTime在一台服务器上生成,然后在服务器之间存在时间差异的另一台服务器上读取?

一些额外的点:

  • 您还可以看到您不需要ToUniversalTime,因为框架会为您执行此操作
  • 看起来第一行UtcSetLastModified降低了精度
  • 我不能告诉你想要一个“缓存限制层次结构”!
于 2011-07-25T18:19:08.443 回答