1

動的に生成された画像にキャッシュ応答ヘッダーを設定しようとすると、奇妙なエラーが発生します。

ArgumentOutOfRangeExceptionがユーザーコードによって処理されませんでした

指定された引数が有効な値の範囲外でした。

パラメータ名:utcDate

データキャッシュからファイルの最後の書き込み時間を読み取ってから、

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

最後の書き込み時間の値は{2011-07-25 18:09:56}、予想どおりです...なぜこれがうまくいかないのかわかりません。

このメソッドのMSDNドキュメントには、かなり不可解なステートメントが含まれています(私の強調)。

Last-Modified HTTPヘッダーは、ドキュメントが最後に変更された日時を示すDateTime値でドキュメントにタイムスタンプを付けます。

キャッシュ制限階層に違反すると、このメソッドは失敗します。

SetLastModifiedは、.NETFrameworkバージョン3.5で導入されました。詳細については、.NETFrameworkのバージョンと依存関係を参照してください。

キャッシング制限階層とは何ですか?私は違反していますか?そうでない場合、最後に変更された時刻が拒否されるのはなぜですか?

4

1 に答える 1

6

SetLastModifiedは、将来のArgumentOutOfRangeException場合にスローします。lastWriteTime

これは成功します:

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 に答える