啟用 IIS 6 原生 Gzip 後,伺服器端產生的 .xlsx (Excel 2007) 檔案下載至用戶端無法開啟,提示格式錯誤。根因:OOXML 本質為 ZIP 封裝,經 IIS 二次壓縮導致雙重壓縮,瀏覽器未正確解壓即存檔。
Content-Encoding: gzip 標頭或 MIME 類型不匹配)。MetaBase.xml,權限門檻高。於 PostReleaseRequestState 事件 (Render 完成、Response 尚未發送) 動態包裝 Response.Filter,僅壓縮文字類內容 (HTML、CSS、JS、JSON),排除二進位檔案。
public class CompressModule : IHttpModule {
public void Init(HttpApplication context) {
context.PostReleaseRequestState += OnPostReleaseRequestState;
}
private void OnPostReleaseRequestState(object sender, EventArgs e) {
var app = (HttpApplication)sender;
var accept = app.Request.Headers["Accept-Encoding"]?.ToLower();
if (string.IsNullOrEmpty(accept)) return;
Stream filter = app.Response.Filter;
if (accept.Contains("gzip") || accept.Contains("x-gzip") || accept.Contains("*")) {
app.Response.Filter = new GZipStream(filter, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
} else if (accept.Contains("deflate")) {
app.Response.Filter = new DeflateStream(filter, CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
}
public void Dispose() { }
}
web.config 定義 <compressionExtensions>,排除 .xlsx, .zip, .jpg 等。HTTP_X_MICROSOFTAJAX 或 Anthem_CallBack 標頭,略過壓縮避免 UpdatePanel 異常。ICompressible 介面,僅壓縮標記頁面。PostReleaseRequestState 事件)。<urlCompression> + <dynamicCompression> 設定,支援模組化、不影響全站。