IIS7:静态和动态内容压缩之间的差异

Jan*_*ich 17 iis-7 gzip httpmodule

IIS支持两种类型的压缩:静态内容压缩和动态内容压缩.根据applicationHost.config,它们由不同的模块处理:DynamicCompressionModule(compdyn.dll)和StaticCompressionModule(compstat.dll),它们被配置为压缩不同类型的请求.另外,我猜测动态压缩不会缓存压缩请求而不是静态压缩(默认情况下,压缩文件会保存到%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files).

然而,除了那些明显的差异,我怀疑还有别的东西.我认为他们以一种稍微不同的方式挂钩到IIS管道.有人会更深入了解一些细节吗?

我发现的方式是我正在使用自定义模块来动态修改CSS文件.当打开静态压缩(并设置为处理默认文件集,即text/css)时,在缓存请求中,我的自定义模块被提供了已经gzip压缩的内容.当我将text/css移动到动态压缩请求列表时,它全部开始工作.但我希望有一个更加坚实的证据,证明它确实是正确的方法.还有其他已知的后果/问题吗?

更新:我想我可能有一个关于它为什么会发生的理论.它可能不是100%正确,但它至少可以解释观察到的行为.我认为静态压缩模块将自己注册到以下事件(在其他事件中):

RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER
Run Code Online (Sandbox Code Playgroud)

然后,当提供对静态文件的请求时,OnMapRequestHandler中的静态压缩模块检查文件之前是否已被压缩以及实际文件是否未被更改.如果是这样,它将重新将请求映射到自身(使用IMapHandlerProvider返回适当的重定向).当它稍后在OnExecuteRequestHandler中实际提供响应时,它会发送压缩文件.另一方面,如果文件之前没有被压缩或者它已经被更改,它不会执行映射重定向并让静态内容模块提供请求,然后在OnPostExecuteRequestHandler中压缩内容(并更新其缓存) .如上所述,我并不是说这正是发生的事情(我不知道源代码),它可能只是一个近似值.此外,动态压缩模块最不可能执行任何此操作.它只是在RQ_EXECUTE_REQUEST_HANDLER之后有时压缩传出的响应.

Dav*_*ers 13

你的问题不太清楚,所以我会回答一个问题并希望这是你的问题.

静态压缩的目的是压缩原本直接从硬盘驱动器提供的文件(Css/images/javascript),因此它压缩每个文件一次并将压缩文件保存到磁盘.这使得非常便宜的非常便宜的压缩内容服务可用于不经常更改的静态文件.说大多数网站应该启用静态压缩是一个非常安全的建议.

动态压缩的目的是压缩来自ISS模块(asp,asp.net,php等)的动态响应.由于每个请求的响应可能不同,因此无法缓存压缩输出.这个功能是IIS6的新功能,虽然在某些环境中可以实现这种效果,例如在ASP.Net中实现HttpFilter.由于每个请求都需要动态压缩,因此这比CPU静态压缩要多得多.因此,如果服务器受CPU限制,这可能不是一个好的选择.大多数站点都是网络和/或数据库绑定的,因此通常是个好主意.

因此,动态和静态参考内容并影响可以使用的策略.

一些参考文献