如何对一个网站中所有接口的Response进行json响应压缩(.NET MVC)
一、响应压缩的作用
响应压缩,是对服务端的Response返回的Json进行文本压缩,可以最大程度地减少通过网络传输的字节数。
优点:相当于服务端对一个Json文本文件进行Zip压缩之后再进行网络传输,大大减少流量,大大降低服务器带宽资源,大大提高网络传输速度。
缺点: 相对于不做响应压缩前,唯一的代价就是服务端要额外做一次压缩操作(主要开销是cpu资源),浏览器要额外做一次解压操作。但响应压缩的这点代价在它带来的优势面前不足一提。
综合来说:响应压缩,可以用最小的改动,减少这些冗余数据的体积。优化服务器流量压力。
而.net 项目中可以通过过滤器或中间件的方式来实现全局压缩所有后端接口的Response。
二、怎么压缩
本文主要讲解过滤器方式的压缩
1、压缩过滤器代码文件:
-
using System;using System.Web.Mvc;using System.IO.Compression;namespace YourNameSpace.Utils.Filter{ public class CompressFilterAttribute : 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); } } }}
2、然后在web项目的基类控制器加上这个过滤器特性
using System.Web.Mvc;using NLog;using System.Net.Http;using YourNameSpace.Utils.Filter;namespace YourNameSpace.Controllers{ /// /// 基类控制器 /// [CompressFilter] public class BaseController : Controller { }}
其他控制器继承BaseController即可。
using System.Web.Mvc;using NLog;using System.Net.Http;namespace YourNameSpace.Controllers{ /// /// 首页控制器 /// public class HomeController : BaseController { }}
3、响应压缩前后效果对比:
浏览器查看http请求是否启用了响应压缩可参考文章:如何查看页面是否开启了gzip压缩
压缩前:
压缩后:
三、压缩之后流量情况展示
拿我最近在维护的网站举例,经过响应压缩之后可以看到服务器带宽压力骤降。从而为公司省下了一笔不小的流量费。
Demo
新人创作打卡挑战赛 发博客就能抽奖!定制产品红包拿不停!