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
当服务器请求静态文件时,静态压缩模块在OnMapRequestHandler中检查文件是否被压缩过,以及实际文件是否没有发生变化。如果是这样,它将重新将请求映射到自身(使用IMapHandlerProvider返回适当的重定向)。当它在OnExecuteRequestHandler中实际提供响应时,它会发送压缩文件。另一方面,如果文件以前没有被压缩过或者已经改变,则不进行映射重定向,并允许静态内容模块提供请求,然后稍后在OnPostExecuteRequestHandler中压缩内容(并更新其缓存)。如上所述,我并不是说这就是正在发生的事情(我不知道源代码),可能只是一个近似值。此外,动态压缩模块很可能不会执行任何操作。它仅仅在RQ_EXECUTE_REQUEST_HANDLER之后有时压缩输出响应。