web-dev-qa-db-ja.com

ASP.NET MVC自動キャッシュオプションを無効にする方法?

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

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

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

70
Raj Tamakuwala

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

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

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

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

134
HackedByChinese

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を使用してそれを検出し、ページまたはページゾーンを強制的に更新することによってのみ。

28
Softlion

ページでキャッシュ値を個別に設定する代わりに、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");
}

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

12
Swati Gupta

ブラウザのキャッシュを防止したい場合は、 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);
}
9
Jeff Lequeux

ページ上のソリューションの場合、レイアウトページでこれを設定します。

<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
5
Pranav Labhe

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

<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

0
Kannan_PK