.Net實現(xiàn)GZip壓縮網(wǎng)頁,C#設(shè)置開啟GZip壓縮
以二進制輸入緩沖器和GZIP編碼輸入
檢查是否gzip是支持的客戶端
using System; using System.Web; using System.IO; using System.Text; using System.IO.Compression; using System.Text.RegularExpressions; namespace JsonsWeb { public class GZipHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { HttpContext Context = HttpContext.Current; HttpRequest Request = Context.Request; HttpResponse Response = Context.Response; string AcceptEncoding = Request.Headers["Accept-Encoding"]; // *** 首先檢查是否gzip是支持的客戶端 bool UseGZip = false; if (!string.IsNullOrEmpty(AcceptEncoding) && AcceptEncoding.ToLower().IndexOf("gzip") > -1) UseGZip = true; // *** 創(chuàng)建一個cachekey并檢查是否存在 string CacheKey = Request.QueryString.ToString() UseGZip.ToString(); byte[] Output = Context.Cache[CacheKey] as byte[]; if (Output != null) { // *** 是的-讀緩存和發(fā)送給客戶端 SendOutput(Output, UseGZip); return; } // ***加載腳本文件 string Script = ""; StreamReader sr = new StreamReader(context.Server.MapPath(Request["src"])); Script = sr.ReadToEnd(); // *** 現(xiàn)在我們準(zhǔn)備開始創(chuàng)建輸出 // *** 除非至少有8K不gzip if (UseGZip && Script.Length > 6000) Output = GZipMemory(Script); else { Output = Encoding.ASCII.GetBytes(Script); UseGZip = false; } // *** 添加到緩存中的一天 Context.Cache.Add(CacheKey, Output, null, DateTime.UtcNow.AddDays(1), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.High, null); // *** 寫出合適的客戶端緩存設(shè)置的響應(yīng)對象 this.SendOutput(Output, UseGZip); } /// <summary> /// 將輸出發(fā)送到客戶端使用適當(dāng)?shù)木彺嬖O(shè)置。 /// 內(nèi)容應(yīng)該已經(jīng)準(zhǔn)備好要發(fā)送的編碼和二進制。 /// </summary> /// <param name="Output"></param> /// <param name="UseGZip"></param> private void SendOutput(byte[] Output, bool UseGZip) { HttpResponse Response = HttpContext.Current.Response; Response.ContentType = "application/x-javascript"; if (UseGZip) Response.AppendHeader("Content-Encoding", "gzip"); //if (!HttpContext.Current.IsDebuggingEnabled) // { Response.ExpiresAbsolute = DateTime.UtcNow.AddYears(1); Response.Cache.SetLastModified(DateTime.UtcNow); Response.Cache.SetCacheability(HttpCacheability.Public); // } Response.BinaryWrite(Output); Response.End(); } /// <summary> ///以二進制輸入緩沖器和GZIP編碼輸入 /// </summary> /// <param name="Buffer"></param> /// <returns></returns> public static byte[] GZipMemory(byte[] Buffer) { MemoryStream ms = new MemoryStream(); GZipStream GZip = new GZipStream(ms, CompressionMode.Compress); GZip.Write(Buffer, 0, Buffer.Length); GZip.Close(); byte[] Result = ms.ToArray(); ms.Close(); return Result; } public static byte[] GZipMemory(string Input) { return GZipMemory(Encoding.ASCII.GetBytes(Input)); } public bool IsReusable { get { return false; } } } }
原文鏈接:.Net實現(xiàn)GZip壓縮網(wǎng)頁,C#設(shè)置開啟GZip壓縮