谈mvc开发中gzip压缩的应用

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 压缩view的内容,可加过滤器     public class GzipFilter : ActionFilterAttribute     {         public override void OnResultExecuting...

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

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
445 3
|
11月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
335 5
|
11月前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
601 2
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
249 2
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
1115 0
|
前端开发 测试技术 API
探索安卓应用的架构演进:从MVC到MVVM
本篇文章将深入探讨安卓应用开发中的架构演进,特别关注从传统的MVC(Model-View-Controller)到现代流行的MVVM(Model-View-ViewModel)架构的转变。通过对比两种架构的设计理念、实现方式和实际应用案例,解析MVVM在提高代码可维护性和可测试性方面的优势。
275 26
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
142 0
|
JSON 前端开发 Java
Springboot mvc开发之Rest风格及RESTful简化开发案例
Springboot mvc开发之Rest风格及RESTful简化开发案例
229 2
|
JSON 前端开发 Java
Spring第四课,MVC终章,应用分层的好处,总结
Spring第四课,MVC终章,应用分层的好处,总结
|
存储 JSON 前端开发
利用Spring MVC开发程序2
利用Spring MVC开发程序
143 1