200

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

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

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

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

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

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

4

8 に答える 8

369

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();
    }
}
于 2009-11-10T01:28:50.907 に答える
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()
{
  ...
}
于 2011-04-05T01:57:07.127 に答える
93
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を介してルーティングされるため、その背後にあるコードをポップインできると仮定します。

于 2009-07-21T16:00:59.720 に答える
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);
    }
}
于 2013-03-28T02:44:31.383 に答える
6

この回答が質問に 100% 関係していないことはわかっていますが、誰かの役に立つかもしれません。

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

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

于 2013-03-18T13:02:49.120 に答える
2

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

問題が発生していたビューの名前は「最近」であることがわかりました。どうやらこれはInternetExplorerブラウザを混乱させました。

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

于 2013-02-27T17:07:31.730 に答える
-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();
于 2013-09-10T03:38:37.060 に答える