IIS/ASP.NET响应缓存控制:对所有请求都是专用的
为什么ASP.NET的所有响应都包含IIS/ASP.NET响应缓存控制:对所有请求都是专用的,asp.net,asp.net-mvc,caching,iis,Asp.net,Asp.net Mvc,Caching,Iis,为什么ASP.NET的所有响应都包含缓存控制:private?甚至是404响应?IIS中是否有设置此默认值的内容,以及是否有配置此默认值的方法?或者ASP.NET中是否有设置此选项的内容 对于动态内容(即所有MVC结果),我不希望浏览器缓存它,因为它是动态的,可以随时更改。静态内容托管在CDN上,因此IIS不提供服务 编辑: 为了澄清,我非常了解什么是缓存控制:private,private,public,no store等之间的区别,以及如何/何时使用它们。我的问题是,为什么IIS/ASP.N
缓存控制:private
?甚至是404响应?IIS中是否有设置此默认值的内容,以及是否有配置此默认值的方法?或者ASP.NET中是否有设置此选项的内容
对于动态内容(即所有MVC结果),我不希望浏览器缓存它,因为它是动态的,可以随时更改。静态内容托管在CDN上,因此IIS不提供服务
编辑:
为了澄清,我非常了解什么是缓存控制:private
,private
,public
,no store
等之间的区别,以及如何/何时使用它们。我的问题是,为什么IIS/ASP.NET默认添加了缓存控制:private
,以及如何防止在默认情况下添加它。我知道缓存动态页面很有用,但在我的应用程序中,我不想缓存动态页面/响应。例如,我不希望缓存XHR JSON响应,因为它们包含动态内容。不幸的是,服务器自动将缓存控制:private
添加到所有响应中,因此我必须在任何地方手动覆盖它
如何复制:使用MVC项目打开visual studio并创建新的ASP.NET Framework(是的,Framework,不是Core。我们还无法将系统迁移到Core)解决方案。现在在IIS Express中启动项目(只需按播放按钮),并在浏览器中使用F12 devtools查看http响应。您将看到它包含缓存控制:private
。我的问题是,是什么添加了此标题,以及如何防止默认情况下添加此标题
来自、复制自的答案
Cache-Control-private表示客户端可以缓存页面,但以页面的过期日期为准。可以使用Cache Control:max age或Expires HTTP头提供过期。在默认情况下,页面设置为立即过期,这意味着它不会被缓存
缓存控制的目的之一:private实际上是告诉中间代理它们不应该缓存页面
顺便说一句,仅仅因为页面是动态的并不意味着它永远不应该被缓存。在许多情况下,缓存动态页面是合适的。您不仅可以在客户端缓存,还可以在代理和服务器的输出缓存中缓存
更多信息:
TL;博士
public ActionResult Index()
{
ViewBag.CurrTime = DateTime.Now.ToString("T");
return View();
}
视图:
您可以使用操作筛选器在每个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);
}
}
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
在FilterConfig.cs中(在ASP.NET MVC模板中自动装箱):
以下是响应的结果标题:
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);
}
}
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
如您所见,没有“缓存控制:专用”标头
但是,我还是不明白为什么要在应用程序中添加这样的过滤器。解决这个问题: 您将看到它包含缓存控制:private。我的问题是,, 是什么添加了此标题,以及如何防止添加此标题 违约 简短的回答是:正如其他人所指出的,这是IIS(7+)的默认设置 更全面地回答:如果您希望控制或修改缓存HTTP请求的默认设置
Cache control:private
,请选择服务器端
这将取决于您正在运行的IIS的特定版本,以及您希望修改的具体程度。但是,一般来说,您可以使用HTTP响应头界面(在IIS管理器=>功能视图-IIS中)执行此操作
如果只想禁用网站或应用程序的缓存,请执行以下操作:
appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache"
有关详细信息和细节,请查看:
希望这就是你想要的,干杯
什么会添加此标题
IIS 7和更高版本(包括在默认安装中)将其作为缓存相关HTTP头之一发送到Web客户端
我如何防止默认情况下添加它
根据您的问题,我将介绍两种禁用缓存机制的方法(服务器端方法和客户端方法),重点介绍服务器端方法:
服务器端方法
按照Internet信息服务(IIS)管理器中的以下步骤更改缓存控制
值(我认为这适用于静态内容):
缓存控件:public
,max age=0
头:
[OutputCache(Duration = 0)]
public class SomeController : Controller {
}
您还可以在应用程序的Web.config文件和配置文件中定义缓存配置文件,包括duration
a
[OutputCache(Duration = 0)]
public class SomeController : Controller {
}
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="nocache" duration="0"
varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<caching>
<outputCache enableOutputCache="false" />
</caching>
$.ajax({
type: 'GET',
cache: false,
url: '/nation',
...
});
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
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>
protected void Application_BeginRequest()
{
Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}