2016-01-20 57 views
1

我在这里有一个小问题。这是我的web.config看起来像:ASP.NET中的HTTP 1.1头配置应用程序

<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 

所以在编译的值复制,还有些反应的cache控制了“公”在像开头:

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

有没有办法从我的web.config仅设置标题?

另一个问题是,有什么方法可以在主响应中设置标题,但在响应是.css和.js文件时禁用它们?我希望他们被缓存。

回答

0

我找到了我的解决方案。

我创建attriburte并将其添加到基础CONTROLER:

[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文件缓存,但我的请求不在缓存中可见:)

1

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

我不会建议通过手动设置缓存控制标题与ASP.NET作战...您希望ASP.NET的输出缓存基础结构为您执行此操作。输出缓存可以在web.config的outputCache元素中配置。有关配置输出缓存的更多信息,请参见here

你可能不需要太担心Pragma标题(除非你预计会有很多来自20世纪90年代的HTTP 1.1客户端)。

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

1

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

HTTP RFC2616说:

多幅具有相同字段名的消息的报头字段可以出现 在消息当且仅当该头 字段整个字段值被定义为逗号分隔列表[即,#(值)]。它必须 可以通过将每个后续字段值附加到第一个,每个 分隔的一个 “字段名称:字段值”对,而不更改消息的语义,可以将多个标题字段组合到一个 “逗号。因此,接收到字段名相同的标题字段的顺序对组合字段值的解释 有意义,因此当转发消息时,代理不得改变这些字段值的顺序。因此,多个 具有相同名称的标头是可以的(www认证就是这种情况)如果 整个字段值被定义为逗号分隔的值列表。

更多信息你可以找到here

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