Web API性能优化(一)压缩
简单的应用场景:分页获取日志JSON信息。
很简单的实现,简单的记录一下
未压缩时候
使用PostMan请求http://localhost:34390/api/gpm/syslog/page?pageindex=1&pagesize=10
上图用到了一些技术:AOP、IOC、Request/Response模式(个人觉得十分适合WebAPI),这里不介绍。ApiResullt是我封装的一个类(自动序列化),至于为什么自己造一个,只是本人觉得舒服!这个最重要。
响应结果:可以看到Size:2.04KB,Content-Length:1607
使用压缩
使用DotNetZip压缩,当然使用AOP方式,使用默认压缩级别
1 /// <summary> 2 /// 压缩返回信息 3 /// </summary> 4 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 5 public class CompressionAttribute : ActionFilterAttribute 6 { 7 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 8 { 9 var content = actionExecutedContext.Response.Content; 10 var acceptEncoding = actionExecutedContext.Request.Headers.AcceptEncoding. 11 Where(x => x.Value == "gzip" || x.Value == "deflate").ToList(); 12 if (acceptEncoding.HasItems() && content != null && actionExecutedContext.Request.Method != HttpMethod.Options) 13 { 14 var first = acceptEncoding.FirstOrDefault(); 15 if (first != null) 16 { 17 var bytes = content.ReadAsByteArrayAsync().Result; 18 switch (first.Value) 19 { 20 case "gzip": 21 actionExecutedContext.Response.Content = new ByteArrayContent(CompressionHelper.GZipBytes(bytes)); 22 actionExecutedContext.Response.Content.Headers.Add("Content-Encoding", "gzip"); 23 break; 24 case "deflate": 25 actionExecutedContext.Response.Content = new ByteArrayContent(CompressionHelper.DeflateBytes(bytes)); 26 actionExecutedContext.Response.Content.Headers.Add("Content-encoding", "deflate"); 27 break; 28 } 29 } 30 } 31 base.OnActionExecuted(actionExecutedContext); 32 } 33 } 34 /// <summary> 35 /// 压缩帮助类 36 /// </summary> 37 internal static class CompressionHelper 38 { 39 public static byte[] DeflateBytes(byte[] bytes) 40 { 41 if (!bytes.HasItems()) 42 { 43 return null; 44 } 45 using (var output = new MemoryStream()) 46 { 47 using (var compressor = new Ionic.Zlib.DeflateStream(output, Ionic.Zlib.CompressionMode.Compress, Ionic.Zlib.CompressionLevel.Default)) 48 { 49 compressor.Write(bytes, 0, bytes.Length); 50 } 51 return output.ToArray(); 52 } 53 } 54 55 public static byte[] GZipBytes(byte[] bytes) 56 { 57 if (!bytes.HasItems()) 58 { 59 return null; 60 } 61 using (var output = new MemoryStream()) 62 { 63 using (var compressor = new Ionic.Zlib.GZipStream(output, Ionic.Zlib.CompressionMode.Compress, Ionic.Zlib.CompressionLevel.Default)) 64 { 65 compressor.Write(bytes, 0, bytes.Length); 66 } 67 return output.ToArray(); 68 } 69 } 70 }
请求响应结果:Size:833B,Content-Length:329,提升效果十分明显,细心的朋友会发现响应时间变长了,当然这是由于压缩需要时间造成的,但是影响不大
作者:王家大人
出处:http://wms01.cnblogs.com
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?