web-dev-qa-db-ja.com

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

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

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

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

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

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

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

199
Palani
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を経由してルーティングされるため、背後でコードをポップするだけでよいと想定しています。

92
Squiggs.

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();
    }
}
365
JKG

自分でロールバックする代わりに、提供されているものを使用してください。

前述のように、すべてのキャッシュを無効にしないでください。たとえば、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()
{
  ...
}
132

コントローラー(つまり、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);
    }
}
10
Edward Brey

この答えは質問に完全に関連しているわけではありませんが、誰かを助けるかもしれません。

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

Here's a screenshot in Chrome

6

以前の回答をすべて実装しましたが、1つのビューが正しく機能しませんでした。

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

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

2
DrHooverCraft

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

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