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

时间: 2024-11-05 18:56:36

谈mvc开发中gzip压缩的应用的相关文章

浅谈MVC框架中View层的优雅设计及实例

设计 在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑.在N年前的脚本语言时代,无论是asp.php还是jsp,我们基本是都是把这两者柔和在一起的.尽管我们想方设法做好很多函数或者包含文件来努力达到软件的复用,但仍然无法满足多变的用户需求,这主要是因为以前的纯脚本编码方式无法很好支持及应用面向对象(OO)领域中的强大功能. 在常见的B/S软件项目中,界面的设计包括html界面.Wap界面及其它由文本字符协议为基本表示的界面等.以我们接触最多的ht

浅谈Android开发中ListView控件性能的一些优化方法

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

浅谈实际开发中数据源在JDBC中的应用

数据|数据源 数据源在JDBC中的应用众所周知,JDBC(Java数据库连接)是Java2企业版的重要组成部分.它是基于SQL层的API.通过把SQL语句嵌入JDBC接口的方法中,用户可以通过Java程序执行几乎所有的数据库操作. JDBC只提供了接口,具体的类的实现要求数据库的设计者完成.通过生成这些接口的实例,即使对于不同的数据库,Java程序也可以正确地执行SQL调用.所以对于程序员来说,不必把注意力放在如何向数据库发送SQL指令,因为程序员需要了解和用到的只是JDBC的接口,只有在极少数

浅谈PHP开发中MySQL数据库索引的经验

假如我们创建了一个testIndex表:CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL); 我们随机向里面插入了1000条记录,其中有一条    i_testID    vc_Name      555    erquan     在查找vc_Name="erquan"的记录SELECT * FROM testIndex WHERE vc_Name='erquan';时,如果在vc_Na

MVC开发中,如何在客户端显示服务器上的图片,数据库中保存的图片是由后台操作保存,因此保存的路径是服务器自己的相对路径。

问题描述 我和一个同学合作一个项目,她负责后台管理的开发,我负责前端显示,数据都保存在她电脑上,我以她为服务器进行数据的访问和操作修改.如上图所示,图片路径picurl是她在后台上传图片后生成的,现在前端有一个web页面需要显示这个图片应该如何处理.现在我做的操作是放一个<imgsrc="file://zjy-pc/Images/20160321-175-5-1366x768.jpg"/>在调试谷歌浏览器提示Notallowedtoloadlocalresource:fil

apache启用gzip压缩的实现方法_Linux

一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小.这取决于文件中的内容. 利用Apache中的Gzip模块,我们可以使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器.这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度. 网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个

Asp.net,IBatis For .Net,DAOFactory在Web开发中的数据表示

asp.net|web|数据 摘要: 本文谈论的结合Asp.net,IBatis,DAOFactory谈Web开发中的数据表示,展现在ASP.Net开发中各层怎么来组织数据. IBatis For .Net是一个功能强大实用的SQL Map工具,不是ORM工具.它是将SQL语句映射成.NET对象,同时将这个.Net对象与ASP.NET页面中的数据(ASP.NET中Page DataSource我称之为FormBean吧(与J2EE中的FormBean不是同一个概念))结合起来,这样就可以达到这个

Android GZip的使用-开发中网络请求的压缩实例详解_Android

Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

浅谈ASP.NET MVC在前端开发中的局限性

ASP.NET MVC 如果你还没有接触过后端的MVC框架的话,不妨先看看下面这段ASP.NET MVC代码并且了解一下后端MVC的工 作原理.它摘自ASP.NET MVC教程中非常著名的项目MVC Music Store一段Controller组件代码: public class StoreManagerController : Controller { private MusicStoreEntities db = new MusicStoreEntities(); // GET: /Sto