【问题标题】:Http 1.1 Headers configuration in ASP.NET ApplicationASP.NET 应用程序中的 Http 1.1 标头配置
【发布时间】:2016-01-20 14:33:05
【问题描述】:

我有一个小问题。这就是我的 web.config 的样子:

<add name="Cache-Control" value="no-cache, no-store, must-revalidate, private" />
<add name="Pragma" value="no-cache" />

但是当我检查 ZAP 工具时,我有这样的东西:

Cache-Control: no-cache,no-cache, no-store, must-revalidate, private
Pragma: no-cache,no-cache

因此,pragma 中的值是重复的,在某些响应中,Cache-Control 的开头也有“public”,例如:

Cache-Control: public, no-cache, no-cache, no-store, must-revalidate, private

有没有办法只设置我的 web.config 中的标头?

另一个问题是,有没有办法在主响应中设置标头,但在响应为 .css 和 .js 文件时禁用它们?我希望它们被缓存。

【问题讨论】:

    标签: asp.net web http-headers request


    【解决方案1】:

    首先 - 重复应该不是问题。

    HTTP RFC2616 说:

    可能存在多个具有相同字段名的消息头字段 在消息中当且仅当该标头的整个字段值 字段被定义为逗号分隔的列表 [即,#(values)]。它必须 可以将多个标题字段合并为一个 “field-name: field-value”对,不改变语义 消息,通过将每个后续字段值附加到第一个,每个 用逗号分隔。头域相同的顺序 因此,收到的字段名称对解释很重要 的组合字段值,因此代理不得更改 转发消息时这些字段值的顺序因此,多个 具有相同名称的标头是可以的(www-authenticate 就是这种情况)如果 整个字段值被定义为一个逗号分隔的值列表。

    更多信息您可以找到here

    当涉及到具有特定文件扩展名的文件的缓存设置时,您可以查看 IIS 中的输出缓存部分。

    【讨论】:

      【解决方案2】:

      我认为 Cache-Control 标头也由 ASP.NET 的 Output Caching 基础结构设置。

      我不建议通过手动设置 Cache-Control 标头来与 ASP.NET 抗争……您希望 ASP.NET 的输出缓存基础结构为您完成这件事。可以在 web.config 的 outputCache 元素中配置输出缓存。有关配置输出缓存的更多信息,请访问here

      而且您可能不需要过多担心 Pragma 标头(除非您期待大量 1990 年代的 HTTP 1.1 之前的客户端!)。

      静态 js/css 内容的标头通常由 IIS 直接处理,因为 ASP.NET(通常)不提供静态内容。 This discussion 会为您指明正确的方向。

      【讨论】:

        【解决方案3】:

        我找到了适合我的解决方案。

        我创建了属性并将其添加到基本控制器:

        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
        public sealed class NoCacheAttribute : ActionFilterAttribute
        {
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate, private");
                base.OnResultExecuting(filterContext);
            }
        }
        
        [NoCache]
        public class BaseController : Controller
        

        现在我所有的 .js、.css、.png、.jpg 文件都被缓存了,但我的请求在缓存中不可见 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          • 2012-12-20
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多