4

ASP.NET MVCメソッド(.NET 4.0上のv3.0)を次のように設定しました。

[OutputCache(Duration = 31536000, Location = OutputCacheLocation.Any)]
public virtual ActionResult Item()
{
    this.Response.Cache.SetLastModified(new DateTime(2011, 01, 01));
    return this.Content("hello world", "text/plain");
}

Last-Modifiedヘッダーが指定どおりに設定された状態で返されると思いMon, 07 Feb 2011 00:00:00 GMTますが、実際には、出力が最初に出力キャッシュにキャッシュされた日付(つまり、IISがリセットされてから初めてメソッドが呼び出された日付)として返されます。

[OutputCache]出力キャッシングが行われないように属性をコメントアウトすると、Last-Modifiedヘッダーは期待どおりに返されるため、出力キャッシングインフラストラクチャで、指定された値を無視することを選択しているように見えます。

なぜそうしているのか、何か考えはありますか?また、指定した値をLast-Modified日付として使用する方法はありますか?

4

2 に答える 2

2

[OutputCache]まあ、私はこれが発生する理由を解明したことはありませんが、属性が使用するASP.NETページキャッシングインフラストラクチャのどこかにバグがあるようです。

[HttpCache]最終的に、ほぼ同じパブリックインターフェイスを使用してカスタム属性を記述しましたResponse.Cacheが、ASP.NETページキャッシュインフラストラクチャに委任するのではなく、オブジェクトに対して適切なキャッシュメソッドを直接呼び出します。

それはうまくいきます。組み込み属性がそうではないのは残念です。

于 2011-03-18T10:26:35.137 に答える
0

コントローラのOnResultExecutingイベント中に、[OutputCache]はSystem.Web.UI.Pageのインスタンスを作成して、属性で指定されたキャッシュプロパティを処理します。これを行うのは、PageにOutputCacheParametersを実際のhttpキャッシュディレクティブに変換するロジックがすでにあるためです。

https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/OutputCacheAttribute.cs

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.IsChildAction)
        {
            // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
            using (OutputCachedPage page = new OutputCachedPage(_cacheSettings))
            {
                page.ProcessRequest(HttpContext.Current);
            }
        }
    }

OutputCacheAttributeは基本的に、元のハンドラー(コントローラー)からの出力を、キャッシュを構成するために作成されたページにコピーします。

ここでの欠点は、元のHttpResponseに追加されたヘッダーが新しいハンドラー(ページ)にコピーされないことです。これは、コントローラーの応答にヘッダーを設定できないことを意味します。実際にリクエストを処理するページは、これらのヘッダーを無視します。

于 2014-03-27T20:51:24.443 に答える