207

ASP.NETMVC3アプリケーションがあります。このアプリケーションは、jQueryを介してレコードを要求します。jQueryは、JSON形式で結果を返すコントローラーアクションを呼び出します。これを証明することはできませんが、データがキャッシュされるのではないかと心配しています。

すべてのアクションではなく、特定のアクションにのみキャッシュを適用したい。

データがキャッシュされないようにするためのアクションを実行できる属性はありますか?そうでない場合、ブラウザがキャッシュされたセットではなく、毎回新しいレコードのセットを取得するようにするにはどうすればよいですか?

4

9 に答える 9

313

JQueryが結果をキャッシュしないようにするには、ajaxメソッドに次のように入力します。

$.ajax({
    cache: false
    //rest of your ajax setup
});

または、MVCでのキャッシュを防ぐために、独自の属性を作成しました。同じことを行うことができます。これが私たちのコードです:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed 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]。または、すべてのことを行うには、ここにあるように、コントローラーを継承する基本クラスのクラスに属性を配置することができます(コントローラーがある場合)。

[NoCache]
public class ControllerBase : Controller, IControllerBase

コントローラ全体を装飾する代わりに、アクションをキャッシュ不可にする必要がある場合は、この属性を使用して一部のアクションを装飾することもできます。

クラスまたはアクションがブラウザーでレンダリングされたときに存在せずNoCache、それが機能していることを確認したい場合は、変更をコンパイルした後、ブラウザーで「ハードリフレッシュ」(Ctrl + F5)を実行する必要があることに注意してください。そうするまで、ブラウザは古いキャッシュバージョンを保持し、「通常の更新」(F5)で更新しません。

于 2012-04-04T13:15:56.110 に答える
269

組み込みのキャッシュ属性を使用して、キャッシュを防ぐことができます。

.net Frameworkの場合:[OutputCache(NoStore = true, Duration = 0)]

.net Coreの場合:[ResponseCache(NoStore = true, Duration = 0)]

ブラウザにキャッシュを無効にすることは不可能であることに注意してください。あなたができる最善のことは、通常はヘッダーまたはメタタグの形で、ほとんどのブラウザが尊重する提案を提供することです。このデコレータ属性は、サーバーのキャッシュを無効にし、次のヘッダーも追加しますCache-Control: public, no-store, max-age=0。メタタグは追加されません。必要に応じて、ビューに手動で追加できます。

さらに、JQueryおよびその他のクライアントフレームワークは、タイムスタンプやGUIDなどをURLに追加することで、ブラウザをだまして、キャッシュされたバージョンのリソースを使用しないようにします。これは、ブラウザにリソースを再度要求させるのに効果的ですが、実際にはキャッシュを妨げることはありません。

最後に。サーバーとクライアントの間にリソースをキャッシュすることもできることに注意してください。ISP、プロキシ、およびその他のネットワークデバイスもリソースをキャッシュし、実際のリソースを見ずに内部ルールを使用することがよくあります。これらについてできることはあまりありません。幸いなことに、通常、秒や分などの短い時間枠でキャッシュされます。

于 2013-09-04T18:12:48.470 に答える
49

あなたに必要なのは:

[OutputCache(Duration=0)]
public JsonResult MyAction(

または、コントローラー全体で無効にする場合は、次のようにします。

[OutputCache(Duration=0)]
public class MyController

ここでのコメントでの議論にもかかわらず、これはブラウザのキャッシュを無効にするのに十分です-これにより、ASP.Netは、ドキュメントがすぐに期限切れになることをブラウザに通知する応答ヘッダーを発行します。

OutputCache duration = 0応答ヘッダー:max-age = 0、s-maxage = 0

于 2014-08-05T16:47:56.633 に答える
17

コントローラアクションで、ヘッダーに次の行を追加します

    public ActionResult Create(string PositionID)
    {
        Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
        Response.AppendHeader("Expires", "0"); // Proxies.
于 2013-09-16T14:08:46.480 に答える
5

これがmattytommoによって提案されたNoCache属性であり、ChrisMoschiniの回答からの情報を使用して簡略化されています。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : OutputCacheAttribute
{
    public NoCacheAttribute()
    {
        this.Duration = 0;
    }
}
于 2015-02-26T12:55:19.613 に答える
4

MVC6(DNX)の場合、System.Web.OutputCacheAttribute

NoStore注: Durationパラメーターを設定した場合は考慮されません。最初の登録の初期期間を設定し、これをカスタム属性でオーバーライドすることができます。

しかし、私たちはMicrosoft.AspNet.Mvc.Filters.ResponseCacheFilter

 public void ConfigureServices(IServiceCollection services)
        ...
        services.AddMvc(config=>
        {
            config.Filters.Add(
                 new ResponseCacheFilter(
                    new CacheProfile() { 
                      NoStore=true
                     }));
        }
        ...
       )

カスタム属性で初期フィルターをオーバーライドすることが可能です

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class NoCacheAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            var filter=filterContext.Filters.Where(t => t.GetType() == typeof(ResponseCacheFilter)).FirstOrDefault();
            if (filter != null)
            {
                ResponseCacheFilter f = (ResponseCacheFilter)filter;
                f.NoStore = true;
                //f.Duration = 0;
            }

            base.OnResultExecuting(filterContext);
        }
    }

これがユースケースです

    [NoCache]
    [HttpGet]
    public JsonResult Get()
    {            
        return Json(new DateTime());
    }
于 2016-05-17T08:17:30.310 に答える
3

ASP.NET MVC 5ソリューション:

  1. 中央の場所でのキャッシング防止コード:App_Start/FilterConfig.csRegisterGlobalFilters方法:
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // ...
            filters.Add(new OutputCacheAttribute
            {
                NoStore = true,
                Duration = 0,
                VaryByParam = "*",
                Location = System.Web.UI.OutputCacheLocation.None
            });
        }
    }
  1. それが整ったら、またはレベルで別のOutputCacheディレクティブを適用することでグローバルフィルターをオーバーライドできることを理解しています。通常のコントローラーの場合はControllerView
[OutputCache(NoStore = true, Duration = 0, Location=System.Web.UI.ResponseCacheLocation.None, VaryByParam = "*")]

またはそれApiController

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, Location = System.Web.UI.OutputCacheLocation.None, VaryByParam = "*")]
于 2020-03-13T21:27:31.007 に答える
2

ブラウザのキャッシュ(Internet Explorer 11を含む)を防ぐためのAsp.NetMVCCoreの正しい属性値は次のとおりです。

[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]

Microsoftのドキュメントで説明されているように:

ASP.NETCoreでの応答キャッシュ-NoStoreおよびLocation.None

于 2018-01-31T14:42:24.677 に答える
1

MVCでの出力キャッシング

[OutputCache(NoStore = true、Duration = 0、Location = "None"、VaryByParam = "*")]

また
[OutputCache(NoStore = true、Duration = 0、VaryByParam = "None")]

于 2015-10-01T06:59:04.207 に答える