国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > IIS > 正文

IIS啟用GZip壓縮后帶來的問題及解決辦法

2024-08-29 03:14:43
字體:
來源:轉載
供稿:網友
頁面文件比較大時,開啟GZip壓縮可以減少傳輸的流量,測試了一下效果非常明顯,看了電腦軟硬件應用網網友里面有些人使用了IIS的GZip壓縮功能,項目中也應用了該功能,使用的過程中遇到一個比較棘手的問題,找了挺久的一直搞不定。

     項目中在服務器端生成了Excel2007報表文件,文件在下載到本地后不能正常打開了,提示文件格式有問題,由于Excel2007文件格式的本質是一壓縮包,懷疑文件在下載的過程中被改動了,但是具體不知道在哪個環節上出了問題。
 
 
     猜想:
     1.因為Excel2007文件是在頁面Render的時候輸出的,并且輸出完后直接End請求,可以推斷IIS的壓縮機制,應該是在請求開始的時候就已經加入,而不是在請求結束的時候進行壓縮的。
     2.文件下載時直接彈出下載框進行下載,可能沒有經過瀏覽器的解壓過程。這一點有待考證。抑或有其他原因導致了不能對壓縮包進行加壓,因為這個壓縮包是經過兩次打包過的(Excel2007文件生成的時候打包過一次,在通過IIS下載時又被打包了一次)。
 
     使用IIS壓縮的問題(目前發現的):
     1.配置不方便,要更改系統里面的那個配置文件,權限不夠的話沒辦法配置。
     2.IIS6下會影響到IIS內的所有站點,據說IIS7不存在這個問題。
     3.配置了IIS壓縮的機器,在重啟幾次后配置丟失了(怪事)。
     4.Excel2007下載的問題,估計OOXML格式的問題都會有問題。
 
     解決:
     解決的辦法就是使用HttpModule進行壓縮,在HttpModule中使用PostReleaseRequestState事件進行壓縮,將壓縮的時機延后到Render之后,通常的代碼都不會卸載Render之后了吧 :)
     既然PostReleaseRequestState事件是在Render之后,有人會有疑問了,那也可以在頁面里面訂閱啊,在我實際的測試中發現是不能在頁面邏輯中改變Response.Filter,會報錯的,這個可能涉及到asp.net中的一些權限吧,所以還是老老實實的在HttpModule中去實現吧。
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.IO;
using System.IO.Compression;

namespace CapabilityTest
{
    
public class CompressModule : IHttpModule
    {
        
#region IHttpModule Members

        public
 void Dispose()
        {
            
//throw new NotImplementedException();
        }

        
public void Init(HttpApplication context)
        {
            context.PostReleaseRequestState 
+= new EventHandler(context_PostReleaseRequestState);
        }

        
#endregion

        private
 const string GZIP = "gzip";
        
private const string DEFLATE = "deflate";

        
private void context_PostReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication app 
= sender as HttpApplication;
            Stream filter 
= app.Response.Filter;

            
if (IsEncodingAccepted(app.Request, GZIP))
            {
                app.Response.Filter 
= new GZipStream(filter, CompressionMode.Compress);
                app.Response.AppendHeader(
"Content-Encoding", GZIP);
            }
            
else if (IsEncodingAccepted(app.Request, DEFLATE))
            {
                app.Response.Filter 
= new DeflateStream(filter, CompressionMode.Compress);
                app.Response.AppendHeader(
"Content-Encoding", DEFLATE);
            }
        }

        
private static bool IsEncodingAccepted(HttpRequest request, string encoding)
        {
            
string acceptEncoding = request.Headers["Accept-Encoding"];
            
if (acceptEncoding == null)
                
return false;

            acceptEncoding 
= acceptEncoding.ToLower();
            
if (encoding == GZIP)
                
return acceptEncoding.Contains(GZIP) || acceptEncoding.Contains("x-gzip"|| acceptEncoding.Contains("*");

            
if (encoding == DEFLATE)
                
return acceptEncoding.Contains(DEFLATE);

            
return false;
        }
    }
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂宁市| 雅江县| 思南县| 东莞市| 绥化市| 辛集市| 醴陵市| 通城县| 溆浦县| 黄平县| 崇州市| 皋兰县| 武夷山市| 宣恩县| 金塔县| 来凤县| 民权县| 贡嘎县| 堆龙德庆县| 广水市| 马龙县| 白玉县| 海伦市| 浏阳市| 天镇县| 太仓市| 琼中| 疏勒县| 克山县| 奇台县| 鄯善县| 邵东县| 西林县| 德庆县| 定州市| 马关县| 民乐县| 三门县| 廉江市| 普洱| 布拖县|