我正在为我的所有静态内容添加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
答案 0 :(得分:5)
您需要具体了解在代码中应用压缩的MIME类型。然后,您可以为这些MIME类型禁用IIS压缩。
您的.config
文件应该与下面的文件大致相同。您将注意到所有列出的MIME类型压缩都已应用。明智地关闭代码或IIS中MIME类型的压缩,以便代码中压缩的内容不会被IIS压缩,反之亦然。
例如,如果您的HTML全部用代码压缩,则可以指定:
<add mimeType="text/html" enabled="false" />
摘自applicationHosts.config
档案:
<system.webServer>
<httpCompression
directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"
dynamicCompressionDisableCpuUsage="90"
dynamicCompressionEnableCpuUsage="80"
maxDiskSpaceUsage="100" minFileSizeForComp="2700"
noCompressionForRange="true"
sendCacheHeaders="false"
staticCompressionDisableCpuUsage="100"
staticCompressionEnableCpuUsage="80"
>
<scheme name="gzip"
dll="%Windir%\system32\inetsrv\gzip.dll"
dynamicCompressionLevel=”4”
staticCompressionLevel=”7” />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="application/json" enabled="true" />
<add mimeType="application/xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="application/json" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/rss+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="application/xml" enabled="true" />
<add mimeType="image/svg+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</staticTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
dynamicCompressionBeforeCache=”true” />
</system.webServer>
请注意,如果您修改applicationHosts.config
,它会影响您服务器上的所有网站,因此您需要注意,任何不在代码中应用压缩的网站都不会被压缩。
另请注意,二进制内容通常不应被压缩(即图像,视频)。这些资源已经在各自的容器中压缩(即.JPG,.MP4)。确保您没有压缩已经压缩的内容类型。
我已经写了更多有关压缩设置的详细信息,您可以在我的答案中查看:https://stackoverflow.com/a/10051876/733805。