【发布时间】:2012-04-06 13:49:08
【问题描述】:
我正在将 gzipping 添加到我的所有静态内容和 .net 4 站点的 html 输出中。
我还在 IIS 7.5 中启用了压缩(静态和动态),我发现在 IIS 中启用压缩会覆盖这些资源的 Vary: Accept-Encoding 标头。
所以,我想知道的是,真的需要在 IIS 中启用压缩,因为我已经在压缩东西了吗?
所以,我做了一些测试,我发现如下:
Utilizing IIS Static and Dynamic Compression, with code compression:
CPU Load: 35%
Memory Load: 28M
Utilizing IIS Static and Dynamic Compression, without code compression:
CPU Load: 34%
Memory Load: 28M
Non-Utilizing Static and Dynamic Compression In IIS, with code compression:
CPU Load: 14%
Memory Load: 32M
因此,根据我的发现,我同意,在代码中执行此操作时无需使用 IIS 压缩。尽管内存消耗略高,但 CPU 负载显着降低,足以使代码内压缩更有效地为文件提供服务。
现在,我真正的重点是找出并摆脱 IIS 对 Vary: Accept-Encoding 标头的覆盖。其中,无论是否启用 IIS 压缩,它似乎都没有效果。标题仍然没有被添加......那么,你能帮忙吗?
这是我正在实现的缓存代码,请注意,在触发包含此代码的方法之前,我正在通过 context.Response.ClearHeaders() 清除标头:
With context.Response
.AddHeader("Cache-Control", "store, cache")
.AddHeader("Pragma", "cache")
.AddHeader("Cache-Control", "max-age=21600")
.AddHeader("ETag", Date.Now.Ticks)
.AddHeader("Expires", DateTime.Now.AddYears(1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT")
.AddHeader("Vary", "Accept-Encoding")
.AppendHeader("Vary", "Accept-Encoding")
.Cache.SetVaryByCustom("Accept-Encoding")
.Cache.SetOmitVaryStar(True)
.Cache.VaryByParams.IgnoreParams = True
.Cache.SetAllowResponseInBrowserHistory(True)
.Cache.SetCacheability(Web.HttpCacheability.Public)
.Cache.SetValidUntilExpires(True)
.Cache.SetLastModified(DateTime.Now.AddYears(-1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT")
.CacheControl = "public" '
.Expires = 24 * 60 * 366
.ExpiresAbsolute = DateTime.Now.AddYears(1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT"
End With
【问题讨论】:
-
我想知道相反的情况:当 IIS 提供压缩时,真的需要压缩代码吗?弄清楚你这样做是否真的有充分的理由。
-
为什么要添加自己的编码?又是怎样的编码方式?
-
我想确保压缩静态资源。大多数共享主机系统默认不启用压缩。因此,通过在代码中执行,确保在这些系统上资源将被 gzip 压缩。只有“文本”文件被压缩...css、js、html、字体文件等...
-
@o7thWebDesign 没有深入了解您的问题,我有两个建议:(1)我怀疑您的测试是否准确,原因有一个:听起来您正在动态提供静态内容。这将排除所有静态压缩和缓存。如果没有通过 ASP.NET 管道提供静态内容,则会产生最佳可伸缩性。 (2) 在 Vary 标头上,我对所有缓存控制标头的了解不够详细,无法说明此处的正确性。研究所有配置文件设置 (msdn.microsoft.com/en-us/library/aa347461%28v=vs.90%29.aspx)。
-
其实是动态服务的。所有脚本、样式表、图像和字体都通过 httphandler 传递以设置正确的缓存标头。这只是必要的,因为并非所有第 3 方主机都通过 IIS 执行此操作。
标签: asp.net .net iis gzip gzipstream