2017-09-29 13 views
0

Visual StudioでWebApi .Net Core 2.0テンプレートから新しいソリューションを作成しました。 私は起動時に以下を追加しました。ASP.NET Core 2.0 - HTTPレスポンスキャッシュミドルウェア - 何もキャッシュされていない

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddHttpCacheHeaders(opt => opt.MaxAge = 600); 
    services.AddResponseCaching(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
    } 

    app.UseResponseCaching(); 
    app.UseHttpCacheHeaders(); 
    app.UseMvc(); 
} 

その後、郵便配達で、私は、テンプレートによって作成されたエンドポイントがあるhttp://localhost:xxxx/api/valuesを打つ、それがポストマンの設定で、私はポストマンはキャッシュなしのヘッダーを送信しないことを確認しました["value1","value2"]

注意を(返します)。

HttCacheHeadersのサービスは、repoです。 HTTPキャッシュヘッダーを追加します。だから私のエンドポイントレスポンスヘッダは次のとおりです。

  • のCache-Control:公共、最大エージング= 600
  • のContent-Type:アプリケーション/ JSON。文字セット= UTF-8
  • 日:金、2017年9月29日午前14時02分29秒GMT
  • のETag:C5DFA8974BB722D27E71EE50D3D14625
  • 有効期限:最終修飾金、2017年9月29日午前14時03分29秒GMT
  • を:金は、2017年9月29日14時02分29秒GMT
  • サーバー:ケストレル
  • 転送 - エンコード:
  • チャンクヴァリ:、受け入れ言語を受け入れ、
  • X-Poweredのバイエンコーディング受け入れ:ASPを。 NET
  • X-SourceFiles:=?UTF-8?B ................

問題はキャッシュされないことです。 Ouputウィンドウのみが表示されます

だから、ASP.NET Core ResponseCaching Middlewareの使い方は少し分かりません。私はHttCacheHeadersサービスを使用しますが、私のコントローラのアクションに[ResponseCache(Duration = 600)]を追加しない場合

更新

は、キャッシュが動作します。
HttCacheHeadersを使用する理由は、ETagLast-Modifiedの場合、後で有効期限キャッシュと期限切れキャッシュを行うためです。

答えて

-1

HttpCacheHeaderは、ではありません。

本ミドルウェアは、「バックエンド」-partハンドル:それは正しいキャッシュ関連のヘッダを生成し、キャッシュの有効期限を確認することができ確実に(304を修正しません)&前提条件(412前提条件が失敗しました)(多くの場合、同時実行のために使用しチェック)。

Source

+0

は、私はそれが言ったことはありません。 ASP.NET ResponseCachingは、HttpCacheHeadersでは動作しません。 –

0

これは、いくつかのトラブルシューティングのヒントと非答えのようなもの、です。

私はあなたの正確なコードを試しました&それは私のために正常に働いた。HttpCacheHeadersまたはResponseCachingレポでバグが修正された可能性はありますか?

残念ながら、サーバ側のResponseCachingのデバッグには、奇妙なルールがあるため、扱いにくいです。&適切なログがありません。過去に似たような問題が発生したときは、マイクロソフトのソースコードを抜き差しして&のコードを見つけなければなりませんでした。

出力ウィンドウで見つかったメモは、「この要求に対して応答をキャッシュできませんでした」という手掛かりです。

リクエストのサーバー側のキャッシュには2つの部分があります。サーバーは、最初にURLが要求されたときにキャッシュを準備する必要があります。これは、要求された2回目のキャッシュバージョンを提供します。エラーメッセージが第1または第2の要求にある場合、エラーメッセージがいつ表示されるかに注意してください。これは、キャッシュに保存できない場合、またはキャッシュから取得できなかった場合に通知します。 「:公共、最大エージング= 600のCache-Control」ヘッダがうまくこれらのルールに一致している必要がありhttps://github.com/aspnet/ResponseCaching/blob/3bf5f6a1ce69b65c998d6f5c739822a9bed4a67e/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingPolicyProvider.cs

あなた:ストレージ&検索の両方のための

ルールは、このソースコードファイルです。

すでにno-cache/no-store "gotcha"が見つかりました。また、ResponseCachingを使用するいくつかの他のユーザーが、以下を気にしています。

認証済みのリクエスト& set-cookieによる応答はキャッシュされません。 GETまたはHEADメソッドを使用しているリクエストのみがキャッシュされます。 QueryStringが異なる場合、新しいキャッシュエントリが作成されます。また、リクエストの特定の条件が以前にキャッシュされたリクエスト(例:user-agent、accept-encodingなど)と異なる場合、キャッシュを防ぐための "Vary"ヘッダが必要です。 ASP.NetコアののResponseCacheが最も可能性が高いという仲介キャッシュよりも、応答を所有するサーバーで使用されるので、キャッシュなし/なしストア要求ヘッダを称えるサイドノートで

は、おそらく貧しい設計上の選択でしたCDN/ISPのように。私は、これらのヘッダーを無効にするオプション(メモリ内ではなく、ディスクへのキャッシュのシリアライズ)を使用して、ベースのResponseCacheを拡張しました。これは、デフォルトのキャッシュに簡単に置き換えられます。

あなたはここに私の拡張子を見つけることができます。https://github.com/speige/AspNetCore.ResponseCaching.Extensionshttps://www.nuget.org/packages/AspNetCore.ResponseCaching.Extensions

関連する問題