ASP.NETからのすべての応答にCache-Control: private
が含まれるのはなぜですか? 404レスポンスでも? IISにこのデフォルト値を設定するものがあり、それを構成する方法はありますか?または、ASP.NETにこれを設定するものがありますか?
動的コンテンツ(つまり、すべてのMVC結果)の場合、動的コンテンツであり、いつでも変更できるため、ブラウザーによってキャッシュされることは望ましくありません。静的コンテンツはCDNでホストされるため、IISによって提供されません。
明確にするために、Cache-Control: private
が何であるか、private
、public
、no-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
が含まれていることがわかります。私の質問は、このヘッダーを追加するものと、追加されないようにするにはどうすればよいですか?デフォルト?
コミュニティから与えられた素晴らしい答えに私のビットを追加します。
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では、これが導入された日から this 、 ref1 、 ref2 のように構成できます。 ref3 、 ref4 および
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);
}
RickNZ からの回答、 https://forums.asp.net からコピー
Cache-Control privateは、クライアントがその有効期限に応じてページをキャッシュしても問題ないと言います。有効期限は、Cache-Control:max-ageまたはExpires HTTPヘッダーで提供できます。デフォルトの場合、ページはすぐに期限切れになるように設定されています。つまり、キャッシュされません。
Cache-Control:privateの目的の1つは、ページをキャッシュしてはならないことを中間プロキシに伝えることです。
ところで、ページが動的であるという理由だけで、キャッシュされるべきではないという意味ではありません。動的ページのキャッシュが適切な場合が多くあります。クライアントだけでなく、プロキシやサーバーの出力キャッシュにもキャッシュできます。
詳細:
IIS 7.0-IIS「プライベート」をキャッシュ制御に追加します。これはどこから来ますか
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+
このヘッダーを追加するものは何ですか?
IIS 7以降(default installationに含まれています)は、キャッシュ関連HTTPヘッダーの1つとしてWebクライアントに送信します。
デフォルトで追加されないようにするにはどうすればよいですか?
キャッシュメカニズムを無効にする2つの方法(サーバー側アプローチとクライアント側アプローチ)について、質問に基づいてサーバー側に焦点を当てて説明します。
インターネットインフォメーションサービス(IIS)マネージャー内で次の手順に従ってCache-Control
値を変更します(whileこれは静的コンテンツに対して機能すると思います):
1つの方法は、次のようにコントローラーに注釈を付けることです。これは非常に強力で、応答ヘッダーにはCache-Control: public
、max-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
-
上記のステートメントを検証するための非常に簡単なテストがあります。現在の時刻を返すアクションを作成します。
public ActionResult Index()
{
ViewBag.CurrTime = DateTime.Now.ToString("T");
return View();
}
表示:
@{
ViewBag.Title = "Home Page";
}
<h1>@ViewBag.CurrTime</h1>
ブラウザでそのようなページを更新すると、リクエストごとに新しい時間が表示されます。
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」ヘッダーはありません。
しかし、繰り返しますが、このようなフィルターをアプリケーションに追加する必要がある理由はわかりません。
質問への対応:
Cache-Control:privateが含まれていることがわかります。私の質問は、このヘッダーを追加するものと、デフォルトで追加されないようにするにはどうすればよいですか?
簡単な答えは、他の人が指摘したように、これはIIS(7+)によるデフォルト設定です。
より完全に回答するには:デフォルト設定を制御または変更する場合は、Cache-Control: private
HTTPリクエストをキャッシュするため、サーバー側。
これは、実行しているIISの特定のバージョン、および変更にどの程度具体的になりたいかによって異なります。一般的に言えば、HTTP応答ヘッダーインターフェース(IISマネージャー=>機能view-IIS)
Webサイトまたはアプリケーションのキャッシュを単純に無効にする場合:
または、コマンドラインから:
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
これがあなたの探していたものであることを願っています、乾杯。