2017-02-07 49 views
2

に、ブラウザのキャッシュポリシーを適用します私はMVCコントローラが提供するすべての応答、HTMLページとWeb APIの両方に共通Cache-Controlおよび関連ヘッダを追加するASP.NETコアをお伝えしたいと思います反応。私はポリシーをキャッシュの静的ファイルに適用したくありません。私はキャッシュされたいものです。特定のケースでは、すべてのASP.NETコアMVCページ

は、私は、キャッシング、すべてのコントローラにこの属性を適用すると同等のものを無効にしたい:

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

私はこの属性を持つベースコントローラを作り、そこから他のすべてのコントローラを導き出すことができます。このようなベースコントローラの必要性を避ける構成ベースのアプローチがあるのか​​どうか疑問に思っていました。

+1

ミドルウェアを使用するのは可能でしょうか? – DOMZE

+0

私はミドルウェアを使用している場合は、仕事をしています。私はMVCのキャッシュコントロール機能をうまく使いたいと思っています。たとえば、将来的には、特定のMVCページのキャッシュをオーバーライドしたい場合、対応するコントローラメソッドで 'ResponseCache'属性を使用することができ、それが優先される柔軟性が必要です。 –

+0

http://davidpine.net/blog/asp-net-core-optimization/ –

答えて

1

@DOMZEによると、カスタムミドルウェアの使用を検討することができます。実際には、response cachingは既にミドルウェアとして実装されています。

しかし、すべてのMVCアクションにのみキャッシュを追加したいので、MVC action filtersを使用することをお勧めします。利点の一つは、あなたが唯一の特定のコントローラ/アクションにフィルタを適用することができる+あなたがActionExecutingContext(コントローラのインスタンス/アクションの引数)へのアクセス権を持っているということです

public class ResponseCacheActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     // before the action executes 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     // after the action executes 
     // add here a common Cache-Control and related headers to all responses 
    } 
} 
+0

フィルタはすべてのコントローラに適用する必要がありますか?もしそうなら、私は 'ResponseCache'属性を使うよりも利点があるとは思っていません。 –

+0

@EdwardBreyフィルタをグローバルなものとして登録することができます – Set

+0

ヘッダを自分で挿入することの限界は、MVCの 'ResponseCache'属性を使用して特定のページのデフォルトのキャッシュポリシーを変更する柔軟性を残す場合です。あなた自身の調整。 –

4

あなただけ

を追加することにより、W/Oミ​​ドルウェアそれを行うことができます
services.AddMvc(options => { 
    options.Filters.Add(new ResponseCacheAttribute() { NoStore = true, Location = ResponseCacheLocation.None }); 
}) 

あなたのConfigureServicesの方法です。任意の属性(つまりAuthorizeAttribute)で動作し、インスタンス化してすべてのコントローラとアクションに適用できます。また、基本クラスの必要もありません。

+1

個々のコントローラとメソッドにカスタム属性を適用して、必要に応じて 'ConfigureServices'設定をオーバーライドできますか? –

関連する問題