【发布时间】:2011-08-02 09:11:25
【问题描述】:
IIS 支持两种类型的压缩:静态 内容压缩和动态 内容压缩。根据applicationHost.config,它们由不同的模块处理:DynamicCompressionModule (compdyn.dll) 和StaticCompressionModule (compstat.dll),它们被配置为压缩不同类型的请求。另外,我猜动态压缩不会缓存压缩请求而不是静态压缩(默认情况下,压缩文件保存到%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files)。
但是,除了那些明显的差异之外,我怀疑还有其他东西。我认为它们以稍微不同的方式连接到 IIS 管道。有人能了解更多细节吗?
我发现的方法是I was toying with a custom module for modifying CSS files on fly。当打开静态压缩(并设置为处理默认的文件集,即 text/css)时,在缓存请求时,我的自定义模块将获得已压缩的内容。当我将 text/css 移动到动态压缩请求列表时,一切都开始工作了。但我想有一个更可靠的证据证明这确实是正确的方法。还有其他一些已知的后果/问题吗?
更新:我想我可能对它发生的原因有一个理论。它可能不是 100% 正确,但它至少可以解释观察到的行为。我认为静态压缩模块将自己注册到以下事件(以及其他一些事件):
RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER
然后当一个静态文件的请求被服务时,OnMapRequestHandler中的静态压缩模块检查该文件之前是否被压缩过,以及实际文件是否没有被改变。如果是这样,它会将请求重新映射到自身(使用IMapHandlerProvider 返回适当的重定向)。当它稍后在OnExecuteRequestHandler 中实际提供响应时,它会发送压缩文件。另一方面,如果该文件之前没有被压缩过或者它已经改变了,它不会进行映射重定向,而是让静态内容模块为请求提供服务,然后在OnPostExecuteRequestHandler 压缩内容(并更新它的缓存)。如上所述,我并不是说这正是正在发生的事情(我不知道源代码),它可能只是一个近似值。此外,动态压缩模块很可能不会做任何这些。它有时只是在 RQ_EXECUTE_REQUEST_HANDLER 之后压缩传出响应。
【问题讨论】:
标签: iis-7 gzip httpmodule