2011-07-25 3 views
1

動的に生成されるイメージにキャッシュレスポンスヘッダーを設定しようとすると、エラー:ASP.NET MVC 2でResponse.Cache.SetLastModifiedを使用できない理由(およびキャッシュ制限の階層は何ですか?)

ArgumentOutOfRangeException was unhandled by user code

Specified argument was out of the range of valid values.

Parameter name: utcDate

私はデータキャッシュからファイルの最終書き込み時刻を読んでいる、そして私は...私が期待するとして、最後の書き込み時間の値が、{2011-07-25 18:09:56}ある

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

を呼び出しますなぜこれが間違っているのか分かりません。

The Last-Modified HTTP header time stamps the document with the DateTime value indicating when the document was last modified.

This method will fail if the caching restrictiveness hierarchy is violated.

SetLastModified is introduced in the .NET Framework version 3.5. For more information, see .NET Framework Versions and Dependencies.

キャッシング限定度階層はどのようなものです:このメソッドの

MSDN documentation

はかなり不可解な声明(私の強調)が含まれて?私はそれに違反していますか?そうでない場合は、なぜ最後に修正された時間が拒否されますか?

答えて

6

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

これは成功します:

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

あなたが1台のサーバーにlastWriteTimeを生成し、その後していますサーバー間に時間のずれがある場所を別の場所で読んでいますか?

いくつかの追加のポイント:

  • あなたはまた、フレームワークは、あなた
  • UtcSetLastModifiedの最初の行のように見えるためには、精度に
  • 私は「できる減少させることがないよう、あなたがToUniversalTimeを必要としないことがわかりますあなたは "キャッシングの制限階層"が必要だと教えてください!
+0

は、最後に最終更新時刻が先にUTCの時間を、現地時間(英国夏時間)、にあったこの...ファイルの下部を得たが、最後のファイルの修正にToUniversalTimeを呼び出すには、実際にそれに影響を与えていませんでした - 私は、タイムゾーン情報が格納されていないか、何らかの形でシリアライズ/デシリアライズ中に失われていると思います... –

+0

私は参照してください。おそらくlastWriteTimeがどこから来たのか尋ねたはずです。 lastWriteTimeの "Kind"プロパティの値は何ですか? –

関連する問題