ASP.NET Webサイト全体のブラウザーキャッシュを無効にする


199

ASP.NET MVC Webサイト全体のブラウザーキャッシュを無効にする方法を探しています

私は次の方法を見つけました:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

また、メタタグメソッドも使用できます(一部のMVCアクションは、部分的なHTML / JSONを、ヘッドのメタタグなしでAjaxを介して送信するため、私には機能しません)。

<meta http-equiv="PRAGMA" content="NO-CACHE">

しかし、ウェブサイト全体のブラウザキャッシュを無効にする簡単な方法を探しています。


回答:


92
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

すべてのリクエストは最初にdefault.aspxを介してルーティングされます-そのため、背後にあるコードをポップインできると仮定します。


17
Application_BeginRequest()のGlobal.asax.csに入れます。このdefault.aspxのことは信用できません...別の質問:これは[OutputCache]属性よりも優先されますか?
chris166 2009

5
私は、単にグローバルアクションフィルターを作成し、この方法でこれを配置するというアイデアが好きです。Default.aspxとGlobal.asaxを心配する必要がなくなります。
キースアドラー、

13
これをApplication_BeingRequestに入れると、いくつかの問題が発生する可能性があります。画像が.netランタイムを介してルーティングされる場合(これは、素敵なURLにワイルドカードマッピングを使用している場合に発生する可能性があります)、ブラウザに画像がキャッシュされません。これにより、各ページリクエストですべての画像が再ダウンロードされるため、ページの読み込み時間が大幅に遅くなる可能性があります。
herbrandson、2010年

4
プログラムで何かを使用すると、宣言された属性は常にオーバーライドされます。つまり、OPのコードを使用すると、宣言された[OutputCache]属性が上書きされます。
デイブブラック

テストをスモークし、キャッシュの無効化が実際に機能していることを確認する方法についての考え
paaone 2013年

366

IActionFilterから継承するクラスを作成します。

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

次に、必要な場所に属性を配置します...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}

19
HttpContext.Currentはpre-MVC HttpContextオブジェクトを返し、filterContext.HttpContextはpost-MVC HttpContextBaseを返すため、HttpContext.Current.Responseではなく、filterContext.HttpContext.Responseを使用する必要があります。テスト性と一貫性が向上します。
mkedobbs 2010年

5
IActionFilterはActionFilterAttributeにすでに実装されているため、繰り返す必要はありません。
Andrew Davey、

104
ASP.NET MVCの現在のバージョンでは、単にOutputCacheAttributeを使用してキャッシュを防止できます。[OutputCache(NoStore = true、Duration = 0、VaryByParam = "None")]
Ashley Tate

9
ASP.NET MVCの太陽の下で、「コードにこれを入れてキャッシュを停止する」ソリューションを数日間使用しただけで、この質問に対する承認済みの回答を含め、役に立たなかったことを指摘しておきます。この答え-属性-が機能しました。+ 1M議員私はできれば...
トム・キッド

5
if (filterContext.IsChildAction) return;上部に追加することをお勧めしNoCacheます。これにより、属性で装飾された子アクションを呼び出す場合に、外部アクションが「キャッシュされない」のを防ぎます。つまり、NoCache子アクションを実行する場合、属性は他のアクションにリークしません。また、クラス名はNoCacheAttribute、一般に受け入れられている属性の命名規則に準拠する必要があります。
Jakub Konecki

132

自分でロールするのではなく、提供されているものを使用するだけです。

前述のように、すべてのキャッシュを無効にしないでください。たとえば、ASP.NET MVCで頻繁に使用されるjQueryスクリプトはキャッシュする必要があります。実際には理想的には、とにかくそれらのCDNを使用する必要がありますが、私のポイントは、一部のコンテンツをキャッシュする必要があるということです。

[OutputCache]をどこにでも散りばめるよりも、ここで最も効果的に機能するのはクラスを使用することです。

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

キャッシュを無効にしたいすべてのコントローラーは、このコントローラーから継承します。

NoCacheControllerクラスのデフォルトをオーバーライドする必要がある場合は、アクションメソッドのキャッシュ設定を指定するだけで、アクションメソッドの設定が優先されます。

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}

4
@Ozziepeeps、コメントが正しくありません。msdnのドキュメントでは、ブラウザキャッシングと簡単なテストについて説明しています。属性を使用します。
Adam Tuliper-MSFT

2
また、fyi-この属性を使用して3つの場所(サーバー、プロキシ、クライアント)をすべて制御できるため、サーバーキャッシュを超えて完全に制御できます。参照してくださいasp.net/mvc/tutorials/...いくつかの追加の詳細については。
Adam Tuliper-MSFT 2011年

1
+1「NoCacheControllerクラスのデフォルトをオーバーライドする必要がある場合は、アクションメソッドのキャッシュ設定を指定するだけで、アクションメソッドの設定が優先されます。」
Korayem

2
[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]クラスレベルで使用する場合、クラスにPartialViewsを含めることはできません。
ビビアン川

1
2つの条件が存在する場合、OutputCacheメソッドはIEのキャッシュを妨げませんでした:1)アクションはパラメーターを取らなかった、2)アクションはContent(someText)を介してテキストのみを返しました。JSONを返してパラメーターを取得すると、IEキャッシュが適切に無効になります。
ケイシースピークマン2013年

10

コントローラによってレンダリングされたすべてのページ(HTMLページなど)のブラウザキャッシュを無効にしたい場合がありますが、スクリプト、スタイルシート、画像などのリソースのキャッシュはそのままにしておきます。MVC4 +のバンドリングとミニファイを使用している場合は、スクリプトとスタイルシートのデフォルトのキャッシュ期間を維持する必要があります(非常に長い期間。キャッシュは、時間ではなく一意のURLへの変更に基づいて無効になるためです)。

MVC4 +では、すべてのコントローラーでブラウザーのキャッシュを無効にしますが、コントローラーによって提供されないもののためにそれを保持するには、これをに追加しFilterConfig.RegisterGlobalFiltersます。

filters.Add(new DisableCache());

DisableCache次のように定義します。

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

残念ながら、サインアウト後に戻るボタンを押すとページが表示されるため、これは機能していないようです。
ᴍᴀᴛᴛʙᴀᴋᴇʀ

6

この回答は質問に100%関連しているわけではありませんが、誰かの助けになるかもしれません。

ASP.NET MVC Webサイト全体のブラウザーキャッシュを無効にしたいが、これを一時的に行うだけの場合は、ブラウザーのキャッシュを無効にすることをお勧めします。

これがChromeのスクリーンショットです


これはまさに私が探していたものです...開発中に.jsファイルを変更した場合、トラブルシューティング/更新/テストサイクルをほとんど行うことができないときにすぐにそれを実行するのは大きな痛みです。これは完璧です、ありがとう!クライアント側のデバッグ
作業を

2

以前のすべての回答を実装しましたが、まだ正しく機能しないビューが1つありました。

私が問題を抱えていたビューの名前は「最近」と名付けられました。どうやらこれはInternet Explorerブラウザを混乱させました。

(コントローラー内の)ビュー名を別の名前(「Recent5」に選択した)に変更した後、上記のソリューションが機能し始めました。


0

Global.asaxファイルで以下のコードを試すことができます。

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }

-1

UI

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

バックグラウンド

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();

1
たとえそれが技術的に正しいとしても、説明文が必要
rmalayter 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.