压缩view的内容,可加过滤器
?public class GzipFilter : ActionFilterAttribute ???{ ???????public override void OnResultExecuting(ResultExecutingContext filterContext) ???????{ ???????????string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; ???????????if (String.IsNullOrEmpty(acceptEncoding)) return; ???????????var response = filterContext.HttpContext.Response; ???????????acceptEncoding = acceptEncoding.ToUpperInvariant(); ???????????if (acceptEncoding.Contains("GZIP")) ???????????{ ???????????????response.AppendHeader("Content-Encoding", "gzip"); ???????????????response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); ???????????} ???????????else if (acceptEncoding.Contains("DEFLATE")) ???????????{ ???????????????response.AppendHeader("Content-Encoding", "deflate"); ???????????????response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); ???????????} ???????} ???}
然后在要压缩的页面控制器上加标签。
??????[GzipFilter] ???????public ActionResult Index()
现在基本上所有的浏览器支持gzip, deflate.
这里是编程对css和js文件进行压缩放在本地,然后发送给客户端。
----这种方法在iis7.5的集成模式下有效,在vs中有效,但在iis6里我还没配置好,无效
----关键是请求,只对action有效,像js,css文件的请求,在BeginRequest里检测不到。这种方法运行在iis7里很完美,文件大概会被压缩到原来的1/3到1/4.
此方法主要是给请求的文件加上http头//Response.AppendHeader("Content-Encoding", "gzip"); 这里很难处理。
如果有谁找到iis6里面可以运行的方法麻烦告诉我,或许能一起讨论找到更好的解决方案,非常感谢!
---pukuimin@qq.com
浏览器检测到这个头,就会对文件进行解压缩,就正常运行了。
???????protected void Application_BeginRequest(object sender, EventArgs e) ???????{ ???????????GzipFiles(); ???????} ???????private void GzipFiles() ???????{ ???????????string acceptEncoding = Request.Headers["Accept-Encoding"]; ???????????string filepath = Request.FilePath; ???????????string mapfilepath = Server.MapPath("~" + filepath); ???????????if (acceptEncoding.Contains("gzip")) ???????????{ ???????????????#region Gzip处理 ???????????????if (filepath.EndsWith(".css"))//css文件处理 ???????????????{ ???????????????????Response.AppendHeader("Content-Type", "text/css"); ???????????????????Request.ContentType = "text/css"; ???????????????????if (filepath.EndsWith("gzip.css")) ???????????????????{ ???????????????????????FileInfo fi = new FileInfo(mapfilepath); ???????????????????????Response.AppendHeader("Content-Encoding", "gzip"); ???????????????????????int len = mapfilepath.Length - "gzip.css".Length; ???????????????????????if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath); ???????????????????} ???????????????} ???????????????else if (filepath.EndsWith(".js"))//js文件处理 ???????????????{ ???????????????????Response.AppendHeader("Content-Type", "application/x-javascript"); ???????????????????Request.ContentType = "application/x-javascript"; ???????????????????if (filepath.EndsWith("gzip.js")) ???????????????????{ ???????????????????????FileInfo fi = new FileInfo(mapfilepath); ???????????????????????Response.AppendHeader("Content-Encoding", "gzip"); ???????????????????????int len = mapfilepath.Length - "gzip.js".Length; ???????????????????????if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath); ???????????????????} ???????????????} ???????????????#endregion ???????????} ???????????else if (acceptEncoding.Contains("deflate")) ???????????{ ???????????????#region deflate处理 ???????????????if (filepath.EndsWith(".css"))//css文件处理 ???????????????{ ???????????????????Response.AppendHeader("Content-Type", "text/css"); ???????????????????Request.ContentType = "text/css"; ???????????????????if (filepath.EndsWith("deflate.css")) ???????????????????{ ???????????????????????FileInfo fi = new FileInfo(mapfilepath); ???????????????????????Response.AppendHeader("Content-Encoding", "gzip"); ???????????????????????int len = mapfilepath.Length - "deflate.css".Length; ???????????????????????if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath); ???????????????????} ???????????????} ???????????????else if (filepath.EndsWith(".js"))//js文件处理 ???????????????{ ???????????????????Response.AppendHeader("Content-Type", "application/x-javascript"); ???????????????????Request.ContentType = "application/x-javascript"; ???????????????????if (filepath.EndsWith("deflate.js")) ???????????????????{ ???????????????????????FileInfo fi = new FileInfo(mapfilepath); ???????????????????????Response.AppendHeader("Content-Encoding", "gzip"); ???????????????????????int len = mapfilepath.Length - "deflate.js".Length; ???????????????????????if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath); ???????????????????} ???????????????} ???????????????#endregion ???????????} ???????} ???????public void GZip(string fileName, string gipFileName) ???????{ ???????????FileStream fr = File.Create(gipFileName); ???????????FileStream fc = File.OpenRead(fileName); ???????????GZipStream gzs = new GZipStream(fr, CompressionMode.Compress); //压缩文件类 ???????????byte[] arr = new byte[fc.Length]; ???????????fc.Read(arr, 0, (int)fc.Length); ???????????gzs.Write(arr, 0, (int)fc.Length); ???????????gzs.Close(); ???????????fc.Close(); ???????????fr.Close(); ???????} ???????//解压缩文件方法 ???????public void DeZGip(string fileName, string gipFileName) ???????{ ???????????//准备输入输出文件 ???????????FileStream fc = File.Create(fileName); ???????????FileStream fr = File.OpenRead(gipFileName); ???????????GZipStream gzs = new GZipStream(fr, CompressionMode.Decompress); ???????????byte[] arr = new byte[fr.Length]; ???????????fr.Read(arr, 0, (int)fr.Length); ???????????fc.Write(arr, 0, (int)fr.Length); ???????????gzs.Close(); ???????????fr.Close(); ???????????fc.Close(); ???????}
谈mvc开发中gzip压缩的应用
原文地址:http://www.cnblogs.com/hnsongbiao/p/7536421.html