web-dev-qa-db-ja.com

IIS / ASP.NETはcache-controlで応答します:すべてのリクエストに対してプライベート

ASP.NETからのすべての応答にCache-Control: privateが含まれるのはなぜですか? 404レスポンスでも? IISにこのデフォルト値を設定するものがあり、それを構成する方法はありますか?または、ASP.NETにこれを設定するものがありますか?

動的コンテンツ(つまり、すべてのMVC結果)の場合、動的コンテンツであり、いつでも変更できるため、ブラウザーによってキャッシュされることは望ましくありません。静的コンテンツはCDNでホストされるため、IISによって提供されません。

編集:

明確にするために、Cache-Control: privateが何であるか、privatepublicno-storeなどの違い、およびそれらを使用する方法とタイミングを非常によく理解しています。質問は、IIS/ASP.NETによってCache-Control: privateがデフォルトで追加される理由と、デフォルトで追加されないようにする方法です。 can動的ページをキャッシュすると便利ですが、私のアプリケーションではdo n't動的ページ/応答をキャッシュしたいことを理解しています。たとえば、動的コンテンツが含まれているため、XHR JSON応答をキャッシュしたくありません。残念ながら、サーバーはCache-Control: privateをすべての応答に自動的に追加するため、すべての応答を手動でオーバーライドする必要があります。

再現方法:Visual Studioを開き、新しいASP.NET Frameworkを作成します(はい、フレームワーク、コアではありません。システムを移行することはできません。 MVCプロジェクトを使用したソリューション。プロジェクトをIIS Express(再生ボタンを押すだけ))で開始し、ブラウザでF12 devtoolsを使用してhttp応答を確認します。Cache-Control: privateが含まれていることがわかります。私の質問は、このヘッダーを追加するものと、追加されないようにするにはどうすればよいですか?デフォルト

enter image description here

14
Marius

コミュニティから与えられた素晴らしい答えに私のビットを追加します。

1. http ヘッダー属性のキャッシュ Cache-Control :IIS/ASP.NETによってデフォルトでプライベートが追加されますか?

キャッシュリクエストディレクティブ

HTTP要求でクライアントが使用できる標準のCache-Controlディレクティブ。

    Cache-Control: max-age=<seconds>
    Cache-Control: max-stale[=<seconds>]
    Cache-Control: min-fresh=<seconds>
    Cache-Control: no-cache 
    Cache-Control: no-store
    Cache-Control: no-transform
    Cache-Control: only-if-cached

キャッシュ応答ディレクティブ

HTTP応答でサーバーが使用できる標準Cache-Controlディレクティブ。

    Cache-Control: must-revalidate
    Cache-Control: no-cache
    Cache-Control: no-store
    Cache-Control: no-transform
    Cache-Control: public
    Cache-Control: private
    Cache-Control: proxy-revalidate
    Cache-Control: max-age=<seconds>
    Cache-Control: s-maxage=<seconds>

IISはデフォルトで安全でわかりやすく便利なものを使用します。これはたまたまプライベートです

2.デフォルトで追加されないようにする方法

IIS/asp.netでは、これが導入された日から thisref1ref2 のように構成できます。 ref3ref4 および

System.Web名前空間

System.Web名前空間は、ブラウザーとサーバーの通信を可能にするクラスとインターフェイスを提供します。この名前空間にはSystem.Web.HttpRequestクラスが含まれ、現在のHTTP要求に関する広範な情報を提供します。 System.Web.HttpResponseクラス。クライアントへのHTTP出力を管理します。 System.Web.HttpServerUtilityクラス。サーバー側のユーティリティとプロセスへのアクセスを提供します。 System.Webには、Cookie操作、ファイル転送、例外情報、および出力キャッシュ制御用のクラスも含まれています。

protected void Application_BeginRequest()
{
  Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
6
Anil

RickNZ からの回答、 https://forums.asp.net からコピー

Cache-Control privateは、クライアントがその有効期限に応じてページをキャッシュしても問題ないと言います。有効期限は、Cache-Control:max-ageまたはExpires HTTPヘッダーで提供できます。デフォルトの場合、ページはすぐに期限切れになるように設定されています。つまり、キャッシュされません。

Cache-Control:privateの目的の1つは、ページをキャッシュしてはならないことを中間プロキシに伝えることです。

ところで、ページが動的であるという理由だけで、キャッシュされるべきではないという意味ではありません。動的ページのキャッシュが適切な場合が多くあります。クライアントだけでなく、プロキシやサーバーの出力キャッシュにもキャッシュできます。

詳細:

IIS 7.0-IIS「プライベート」をキャッシュ制御に追加します。これはどこから来ますか

Cache-Controlでのプライベートとパブリック

https://msdn.Microsoft.com/en-us/library/ms524721(v = vs.90).aspx

https://msdn.Microsoft.com/en-us/library/system.web.httpcacheability(VS.71).aspx

https://forums.asp.net/t/1443346.aspx?Cache+control+private+

https://forums.asp.net/t/2052325.aspx?Remove+the+private+value+from+the+Cache+Control+in+the+Response+Header

3
VDWWD

このヘッダーを追加するものは何ですか?

IIS 7以降(default installationに含まれています)は、キャッシュ関連HTTPヘッダーの1つとしてWebクライアントに送信します。

デフォルトで追加されないようにするにはどうすればよいですか?

キャッシュメカニズムを無効にする2つの方法(サーバー側アプローチとクライアント側アプローチ)について、質問に基づいてサーバー側に焦点を当てて説明します。

サーバー側のアプローチ

インターネットインフォメーションサービス(IIS)マネージャー内で次の手順に従ってCache-Control値を変更します(whileこれは静的コンテンツに対して機能すると思います):

  1. Connectionsペインで、siteapplicationに移動します。 /、またはdirectorydisableキャッシング.
  2. Homeペインで、HTTP応答ヘッダーをダブルクリックします。
  3. ActionsペインでSet Common Headers...をクリックします。
  4. CheckボックスWebコンテンツの有効期限、特定の間隔後に期限切れにするオプションを選択または特定の時間に[OK]をクリックします。

1つの方法は、次のようにコントローラーに注釈を付けることです。これは非常に強力で、応答ヘッダーにはCache-Control: publicmax-age=0ヘッダーが含まれます。

[OutputCache(Duration = 0)]
public class SomeController : Controller  {

}

アプリケーションのWeb.configファイルでキャッシュプロファイルを定義し、プロファイルにdurationおよびvaryByParam設定を含めることもできます。

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="nocache" duration="0" 
        varyByParam="none" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

次に、アクション/コントローラーの前の[OutputCache CacheProfile="nocache"]で使用します。

web.configファイル(以下)にwon 'という設定があることに注意してください。 tキャッシングを防止します。代わりには、どの種類のキャッシングメカニズムも適用すべきでないことを示すだけです。出力キャッシュを無効にするだけで、ASP.net MVCが使用するデフォルトのキャッシュヘッダーを取得します。これはCache-Control: privateにフォールバックし、ブラウザーを再度開いてリクエストをキャッシュします。

<caching>
    <outputCache enableOutputCache="false" />
</caching>

クライアント側のアプローチ

次のようにjsリクエスト内でcache: falseを使用します。

$.ajax({
    type: 'GET',
    cache: false,
    url: '/nation',
    ...
});

追加情報については、以下をご覧ください。

TL; DR

  1. 動的ASP.NETページでは、キャッシュはデフォルトでは使用されません。 ASP.NETでキャッシュを有効にする努力をする必要があります。
  2. 'Cache-Control:private'ヘッダーの存在は、ページのキャッシュバージョンが繰り返しリクエストで使用されることを意味するものではありません。

-

上記のステートメントを検証するための非常に簡単なテストがあります。現在の時刻を返すアクションを作成します。

public ActionResult Index()
{
    ViewBag.CurrTime = DateTime.Now.ToString("T");
    return View();
}

表示:

@{
    ViewBag.Title = "Home Page";
}

<h1>@ViewBag.CurrTime</h1>

ブラウザでそのようなページを更新すると、リクエストごとに新しい時間が表示されます。

enter image description here

enter image description here

ASP.NET MVCでキャッシングを使用する可能性がありますが、それを有効にするためにいくつかの努力をする必要があります。詳細については、こちらをご覧ください 記事 .

それでも、何らかの理由でキャッシュの可能性を排除したい場合は、特定のHTTPヘッダーを設定することで可能です。どのヘッダーを設定する必要があるかをリストする素晴らしい SO回答 があります。

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

アクションフィルターを使用して、すべてのASP.NET応答でこれらのヘッダーを設定できます。

public class CachingHeadersFilterAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var response = filterContext.HttpContext.Response;

        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.AppendCacheExtension("no-store, must-revalidate");
        response.AppendHeader("Pragma", "no-cache");
        response.AppendHeader("Expires", "0");

        base.OnResultExecuted(filterContext);
    }
}

FilterConfig.cs(ASP.NET MVCテンプレートで自動的に作成):

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new CachingHeadersFilterAttribute());
    }
}

応答の結果ヘッダーは次のとおりです。

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcRHJvcGJveFxwcm9nXFN0YWNrT3ZlcmZsb3dcUTQ3MjI0NTYxQ2FjaGVcUTQ3MjI0NTYxQ2FjaGU=?=
X-Powered-By: ASP.NET
Date: Mon, 13 Nov 2017 17:44:33 GMT
Content-Length: 837

ご覧のとおり、「Cache-Control:private」ヘッダーはありません。

しかし、繰り返しますが、このようなフィルターをアプリケーションに追加する必要がある理由はわかりません。

2
CodeFuller

質問への対応:

Cache-Control:privateが含まれていることがわかります。私の質問は、このヘッダーを追加するものと、デフォルトで追加されないようにするにはどうすればよいですか?

簡単な答えは、他の人が指摘したように、これはIIS(7+)によるデフォルト設定です。

より完全に回答するには:デフォルト設定を制御または変更する場合は、Cache-Control: private HTTPリクエストをキャッシュするため、サーバー側。

これは、実行しているIISの特定のバージョン、および変更にどの程度具体的になりたいかによって異なります。一般的に言えば、HTTP応答ヘッダーインターフェース(IISマネージャー=>機能view-IIS)

Webサイトまたはアプリケーションのキャッシュを単純に無効にする場合:

  1. IISマネージャーに移動します
  2. 希望するサイト/アプリケーションを選択してください
  3. 機能ビューで選択HTTP応答ヘッダー
  4. 操作ウィンドウで、共通ヘッダーの設定をクリックします
  5. チェックWebコンテンツの有効期限
  6. に設定:即時
  7. OK

または、コマンドラインから:

appcmd.exe set config  "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache" 

詳細情報と詳細については、以下を確認してください。

https://docs.Microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/clientcache

これがあなたの探していたものであることを願っています、乾杯。

1
DaniDev