75

asp.Net mvc アプリケーションからの自動ブラウザ キャッシュを無効にする方法は?

すべてのリンクをキャッシュするため、キャッシュに問題があるためです。しかし、キャッシュを保存した DEFAULT INDEX PAGE に自動的にリダイレクトされ、そのリンクをクリックするたびに DEFAULT INDEX PAGE にリダイレクトされることがあります。

ASP.NET MVC 4 からキャッシュ オプションを手動で無効にする方法を知っている人はいますか?

4

6 に答える 6

141

を使用しOutputCacheAttributeて、コントローラー内の特定のアクションまたはすべてのアクションのサーバーおよび/またはブラウザーのキャッシュを制御できます。

コントローラー内のすべてのアクションを無効にする

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
{
  // ... 
}

特定のアクションを無効にします。

public class MyController : Controller
{
    [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
    public ActionResult Index()
    {
       return View();
    }
} 

すべてのコントローラーのすべてのアクションにデフォルトのキャッシュ戦略を適用する場合は、メソッドを編集して検索することにより、グローバル アクション フィルターを追加できます。このメソッドは、既定の MVC アプリケーション プロジェクト テンプレートに追加されています。global.asax.csRegisterGlobalFilters

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new OutputCacheAttribute
                    {
                        VaryByParam = "*",
                        Duration = 0,
                        NoStore = true,
                    });
    // the rest of your global filters here
}

これにより、OutputCacheAttribute上記の指定がすべてのアクションに適用され、サーバーとブラウザーのキャッシュが無効になります。OutputCacheAttribute特定のアクションとコントローラーに追加することで、このキャッシュなしをオーバーライドできるはずです。

于 2012-10-18T06:22:41.433 に答える
28

HackedByChinese には要点がありません。彼は、サーバー キャッシュとクライアント キャッシュを間違えました。OutputCacheAttribute は、ブラウザー (クライアント) キャッシュではなく、サーバー キャッシュ (IIS http.sys キャッシュ) を制御します。

私のコードベースのごく一部を紹介します。賢く使ってください。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NoCacheAttribute : FilterAttribute, IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
        cache.SetExpires(DateTime.Now.AddYears(-5));
        cache.AppendCacheExtension("private");
        cache.AppendCacheExtension("no-cache=Set-Cookie");
        cache.SetProxyMaxAge(TimeSpan.Zero);
    }
}

使用法:

/// will be applied to all actions in MyController
[NoCache]
public class MyController : Controller
{
    // ... 
}

すべてのクライアント キャッシュが実際に無効になるため、慎重に使用してください。無効になっていない唯一のキャッシュは、「戻るボタン」ブラウザのキャッシュです。しかし、それを回避する方法は本当にないようです。おそらく、javascript を使用してそれを検出し、ページまたはページ ゾーンを強制的に更新することによってのみ可能です。

于 2012-10-18T21:35:46.473 に答える
14

ページごとにキャッシュ値を個別に設定する代わりに、Web.config ファイルでキャッシュ プロファイルを設定して、冗長なコードを回避できます。OutputCache 属性の CacheProfile プロパティを使用してプロファイルを参照できます。ページ/メソッドがこれらの設定をオーバーライドしない限り、このキャッシュ プロファイルはすべてのページに適用されます。

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

また、特定のアクションまたはコントローラーからのキャッシュを無効にしたい場合は、以下に示すように特定のアクション メソッドを装飾することで、構成キャッシュ設定をオーバーライドできます。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult NoCachingRequired()
{
    return PartialView("abcd");
}

これが明確であり、あなたに役立つことを願っています.

于 2014-09-02T11:20:34.347 に答える
9

ブラウザのキャッシュを防ぎたい場合は、ShareFunction からこのコードを使用できます。

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);
}
于 2014-09-01T21:09:38.187 に答える
0

私の回答をすべての人に見えるようにするために、コメントをこの質問の回答に移動します。

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

これは、すべてのブラウザー (IE、Firefox、および Chrome も同様) で機能します。私の答えがあなたのために働いたと聞いてうれしい@Joseph Katzman

于 2019-04-26T08:57:58.440 に答える