<p> iis6开启gzip后,是先将需要压缩的静态文件压缩保存在一个目录,请求来时先判断是否支持gzip,不支持直接发送静态文件,支持则再判断文件是否修改,没有就直接发送压缩的文件,有则重新生成压缩文件。<br/> <br/> 根据我对公司的多个网站观察访问者浏览器支持gzip的高达99%以上,我就想又何必多保存一份静态文件,直接保存压缩后的文件不就ok,既节约了空间又节约了处理的过程,万一碰见那1%不到的访客,解个压给他便是。好!就这么处理,为压缩的html专门取个后缀名.ghtml。<br/> <br/> 生成ghtml:<br/> <br/> 首先iis注册.ghtml文件交给.net处理。<br/> <br/> 然后将需要生成ghtml的aspx文件通过这个函数处理,也就是生成静态文件,再多一步压缩<br/> <br/> /**/////<summary><br/> ///在html目录下生成压缩html<br/> ///</summary><br/> ///<paramname"aspxPath">动态页面请求路径</param><br/> ///<paramname"urlPath">静态页面请求路径</param><br/> publicstaticvoidAspxToHtml(stringaspxPath,stringurlPath)<br/> {<br/> stringfilePathHttpContext.Current.Server.MapPath(urlPath);<br/> if(!Directy.Exists(filePath))<br/> {<br/> Directy.CreateDirecty(filePath.Substring(0,filePath.LastIndexOf("\\\\")));<br/> }<br/> using(FileStreamfsnewFileStream(filePath,FileMode.Create))<br/> {<br/> using(GZipStreamgznewGZipStream(fs,CompressionMode.Compress))<br/> {<br/> using(StreamWriterswnewStreamWriter(gz,Encoding.UTF8))<br/> {<br/> HttpContext.Current.Server.Execute(aspxPath,sw,false);<br/> sw.Flush();<br/> }<br/> }<br/> }<br/> }<br/> <br/> <br/> 处理ghtml请求,浏览器支持gzip就直接写入文件,否则先解压内容再输出:<br/> <br/> 自己写个HttpModule,在BeginRequest事件中处理.ghtml请求,静态页嘛就模拟一下html的304处理<br/> <br/> publicclassFreeModule:IHttpModule<br/> {<br/> //Init方法仅用于给期望的事件注册方法<br/> publicvoidInit(HttpApplicationcontext)<br/> {<br/> context.BeginRequest+newEventHler(context_BeginRequest);<br/> }<br/> <br/> <br/> privatevoidSetClientCaching(HttpResponseresponse,DateTimelastModified)<br/> {<br/> response.Cache.SetETag(lastModified.Ticks.ToString());<br/> response.Cache.SetLastModified(lastModified);<br/> response.Cache.SetCacheability(HttpCacheability.Public);<br/> }<br/> <br/> <br/> //处理BeginRequest事件的实际代码<br/> voidcontext_BeginRequest(objectsender,EventArgse)<br/> {<br/> HttpApplicationapplication(HttpApplication)sender;<br/> HttpContextcontextapplication.Context;<br/> HttpRequestrequestcontext.Request;<br/> HttpResponseresponsecontext.Response;<br/> <br/> <br/> <br/> <br/> <br/> stringpathcontext.Request.Path.ToLower();<br/> <br/> stringacceptEncodingrequest.Headers["Accept-Encoding"];<br/> <br/> <br/> boolaccept!string.IsNullOrEmpty(acceptEncoding)?acceptEncoding.ToLower().Contains("gzip"):false;<br/> <br/> <br/> <br/> <br/> <br/> <br/> if(path.Contains(".ghtml"))<br/> {<br/> stringfilePathrequest.PhysicalApplicationPath+"/html"+path;<br/> if(!File.Exists(filePath))<br/> {thrownewFileNotFoundException("找不到文件ghtml");}<br/> <br/> DateTimewriteTimeFile.GetLastWriteTimeUtc(filePath);<br/> DateTimesince;<br/> if(DateTime.TryParse(request.Headers["IfModifiedSince"],outsince)&&writeTimesince.ToUniversalTime())<br/> {<br/> response.StatusCode304;<br/> response.StatusDescription"NotModified";<br/> }<br/> else<br/> <br/> {<br/> <br/> if(accept)<br/> {<br/> <br/> <br/> response.AppendHeader("Content-Encoding","gzip");<br/> <br/> <br/> response.TransmitFile(filePath);<br/> <br/> }<br/> <br/> else<br/> <br/> {<br/> <br/> response.Write(DezipText(filePath));//解压ghtml文件<br/> <br/> <br/> }<br/> <br/> <br/> <br/> SetClientCaching(response,writeTime);<br/> response.End();<br/> }<br/> }<br/> }<br/> publicvoidDispose()<br/> {<br/> }<br/> }<br/> <br/> 解压ghtml:<br/> <br/> 最后还有个解压ghtml函数<br/> <br/> /**////<summary><br/> ///解压text文件后返回str<br/> ///</summary><br/> ///<paramname"textPath">物理路径</param><br/> ///<returns>文件字符串</returns><br/> publicstaticstringDezipText(stringtextPath)<br/> {<br/> using(FileStreamfsFile.OpenRead(textPath))<br/> {<br/> GZipStreamgznewGZipStream(fs,CompressionMode.Decompress);<br/> StreamReadersrnewStreamReader(gz);<br/> returnsr.ReadToEnd();<br/> }<br/> }</p>
|