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

  • 相关阅读:
    Watchguard公司内部招聘:C Developer in Linux Requirements
    条件注释判断浏览器<![if !IE]><![if IE]><![if lt IE 6]><![if gte IE 6]>
    js之事件冒泡和事件捕获详细介绍
    javascript:;与javascript:void(0)使用介绍
    IE和FireFox中JS兼容之event .
    Adobe下周将推新补丁和新的更新模式 狼人:
    微软下周二发布11个补丁 修复25个安全漏洞 狼人:
    安全专家担心Adobe没有足够实力来阻止黑客攻击 狼人:
    保证安全 认清五种易被忽视的攻击方式 狼人:
    六成黑客攻击与PDF漏洞有关 远超微软 狼人:
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3249265.html
Copyright © 2011-2022 走看看