谈mvc开发中gzip压缩的应用

本文介绍了一种通过GZIP压缩网页资源(如CSS和JS文件)的方法来减少传输的数据量,提高加载速度。该方法适用于支持GZIP和DEFLATE压缩的现代浏览器,并提供了在.NET环境下实现的具体代码示例。
摘要由CSDN通过智能技术生成

压缩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();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值