3

ASP.NET MVC3 アプリケーションをセットアップしています。画像を返すコントローラーがあり、次を追加しました。

[OutputCache(Duration = 3600, VaryByParam = "id;width", Order = 1000, Location = OutputCacheLocation.Client)]
public ActionResult Get(string id, int width)
{ ... }

しかし、これらの画像の HTTP 応答を確認すると、すべての画像に "cache-control: no-cache" と "expires: -1" というヘッダーがあり、ブラウザーが画像をキャッシュしていないことを意味します。

私は周りを見回していますが、応答がブラウザーにそれらをキャッシュしないように指示している理由について何も見つかりません。私は自分の属性を作成しようとさえしました:

public class ContentExpiresHeader : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetExpires(DateTime.Now.AddYears(1));
        cache.SetCacheability(HttpCacheability.Private);
        cache.SetLastModifiedFromFileDependencies();
        base.OnResultExecuted(filterContext);
    }
}

しかし、それは私をどこにも連れて行きませんでした。

どんな助けでも大歓迎です。

更新:これは、キャッシュなしを追加してオーバーライドしている IIS 設定である必要があると考え始めています。しかし、私は何も見つけられないようです。唯一の奇妙な点は、.Set...() メソッドを呼び出した後にキャッシュ変数の状態を見ると、内部変数が更新されていないことです。何かが変わると思っていましたが、まだ「キャッシュなし」と表示されています。

更新 2: このメソッドの戻り値は次のとおりであることを追加する必要があります。

return File(...);

更新 3: 私もこれ (http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-3-Controller-for-Serving-Images.aspx) を見つけて、運がなくても実装しようとしました。画像の応答ヘッダーでキャッシュなしオプションをまだ取得しています。

更新 4: サーバー設定を確認する必要がありました...コントローラーをバイパスしてサーバー上の画像ファイルに直接アクセスすると、キャッシュが行われ、応答ヘッダーに正しいキャッシュ設定が含まれます。

更新 5 (ええ、夢中になっています): まったく新しい MVC3 プロジェクトを作成し、1 つのコントローラーを作成しただけで、問題なくキャッシュされました。したがって、この pragma:no-cache を追加している直接のコードの外に何かがあります。私の人生では、それが何であるかを理解できません。=-/

4

2 に答える 2

0

キャッシュ可能性を からHttpCachability.Privateに変更してみてくださいHttpCachability.ServerAndPrivate。キャッシュ コントロールをプライベートとして保持し、e-tags/last modified を抑制しないようにする必要があります。

于 2012-07-13T05:10:59.163 に答える
0

問題を発見!そして、それは私がしばらくの間見た中で最も奇妙なものです.

私は SocialAuth-net を使用しており、セットアップ中に system.webServer モジュールを追加し、runAllManagedModulesForAllRequests=true を設定しました。この特定のアプリ以外では問題を再現できなかったので、「それが原因なのだろうか」と思いました。ほら、設定のそのセクションをコメントアウトすると、私の画像がキャッシュを開始しました!フーラ!

しかし、それは奇妙になります。構成の変更を元に戻し、更新しましたが、今でもキャッシュを取得しています。システムを変更せずに何回リセットしたかはわかりませんが、パイプラインからこれらのモジュールを一時的に削除することで、この問題が解決したようです。

SocialAuthHttpModule まで追跡できます。それを削除しても、SocialAuth-net は機能しているように見えますが、キャッシュは確実に復元されます。とても奇妙です。

于 2012-07-19T02:03:55.263 に答える