簡單的應用場景:分頁獲取日誌JSON信息。 很簡單的實現,簡單的記錄一下 未壓縮時候 使用PostMan請求http://localhost:34390/api/gpm/syslog/page?pageindex=1&pagesize=10 上圖用到了一些技術:AOP、IOC、Request/Res ...
簡單的應用場景:分頁獲取日誌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,提升效果十分明顯,細心的朋友會發現響應時間變長了,當然這是由於壓縮需要時間造成的,但是影響不大