zoukankan      html  css  js  c++  java
  • 谈mvc开发中gzip压缩的应用

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

  • 相关阅读:
    java基础 第六章 下(抽象数据类型,面向过程,面向对象)
    java基础 第六章 上(二维数组)
    java基础 第五章 下(选择排序,冒泡排序)
    java基础 第五章 上(数组的第二种定义方法)
    java基础 补充(JVM 划分内存)
    java基础 第四章 下(数组)
    java基础 第四章 上(加载过程,重载)
    java基础 第三章 下(方法)
    java基础 第三章 上(终止循环 break,continue)
    Annotation 注解
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3249265.html
Copyright © 2011-2022 走看看