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,提升效果十分明顯,細心的朋友會發現響應時間變長了,當然這是由於壓縮需要時間造成的,但是影響不大

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM