C#實(shí)現(xiàn)頁(yè)面GZip或Deflate壓縮的方法
本文實(shí)例講述了C#實(shí)現(xiàn)頁(yè)面GZip或Deflate壓縮的方法。分享給大家供大家參考。具體分析如下:
.NET Framework里
System.IO.Compression下有兩個(gè)可用于頁(yè)面壓縮的類,GZipStream和 DeflateStream.
在頁(yè)面被傳輸之前,需要獲取發(fā)出請(qǐng)求的客戶端所采用的解碼形式。
可以通過(guò)Request.Headers["Accept-Encoding"]來(lái)獲取。
在頁(yè)面被壓縮之前,需要獲取頁(yè)面實(shí)體主體,可通過(guò)
Response.Filter來(lái)獲?。⊿tream類型)
示例代碼:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.IO.Compression; /// <summary> /// GzipDeflate 的摘要說(shuō)明 /// </summary> public class GzipDeflate:IHttpModule { public GzipDeflate() { // // TODO: 在此處添加構(gòu)造函數(shù)邏輯 // } public void Init(HttpApplication app) { app.BeginRequest += new EventHandler(app_BeginRequest); } void app_BeginRequest(object sender, EventArgs e) { //HTTP頭域可分為四類:通用頭、請(qǐng)求頭、響應(yīng)頭、實(shí)體頭。 HttpApplication app=(HttpApplication)sender; string acceptEncoding = app.Request.Headers["Accept-Encoding"]; //客戶端支持的解碼方式。屬于請(qǐng)求頭。 Stream requestStream = app.Response.Filter; acceptEncoding = acceptEncoding.ToLower(); if(acceptEncoding.Contains("gzip")) { app.Response.Filter = new GZipStream(requestStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "gzip"); } else if(acceptEncoding.Contains("deflate")) { app.Response.Filter = new DeflateStream(requestStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "deflate"); //屬于實(shí)體頭。 } } public void Dispose() { } }
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#獲取每個(gè)年,月,周的起始日期和結(jié)束日期的方法
這篇文章主要介紹了C#獲取每個(gè)年,月,周的起始日期和結(jié)束日期的方法,涉及C#時(shí)間與日期基本操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Quartz.Net實(shí)現(xiàn)原理及使用方法詳解
這篇文章主要介紹了Quartz.Net實(shí)現(xiàn)原理及使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Unity實(shí)現(xiàn)簡(jiǎn)易日志輸出功能
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)易日志輸出功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)
線程是一個(gè)獨(dú)立的運(yùn)行單元,每個(gè)進(jìn)程內(nèi)部有多個(gè)線程,每個(gè)線程可以各自同時(shí)執(zhí)行指令,每個(gè)線程有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存,這篇文章主要給大家介紹了關(guān)于C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下2021-09-09解決C#程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法詳解
本篇文章是對(duì)C#中程序只允許運(yùn)行一個(gè)實(shí)例的幾種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05