Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IIS/ASP.NET响应缓存控制:对所有请求都是专用的_Asp.net_Asp.net Mvc_Caching_Iis - Fatal编程技术网

IIS/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

为什么ASP.NET的所有响应都包含
缓存控制: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;博士

  • 默认情况下,动态ASP.NET页面不使用缓存。您需要努力在ASP.NET中启用缓存
  • “Cache Control:private”标头的存在并不意味着页面的缓存版本将用于重复请求
  • --

    有一个非常简单的测试来验证上述语句。创建一个返回当前时间的操作:

    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中)执行此操作

    如果只想禁用网站或应用程序的缓存,请执行以下操作:

  • 转到IIS管理器
  • 选择所需的站点/应用程序
  • 在功能视图中,选择HTTP响应头:
  • 在操作窗格中,单击:设置常用标题
  • 检查过期Web内容
  • 立即设置为:
  • 或者,从命令行:

    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);
    }