재우니의 블로그

asp.net mvc web api 성능을 높이기 위해 압축 기능을 사용해 보자. 이를 사용하면 데이터량이 축소된다. 


http://www.c-sharpcorner.com/article/compressing-web-api-response-to-using-dotnetzip/


A fork of the DotNetZip project without signing with a solution that compiles cleanly. This project aims to follow semver to avoid versioning conflicts. DotNetZip is a FAST, FREE class library and toolset for manipulating zip files. Use VB, C# or any .NET language to easily create, extract, or update zip files.


https://www.nuget.org/packages/DotNetZip/



1. 위의 사이트 접속하여 nuget 에서 설치한 후,  어트리뷰터를 만들어 본다.


using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Net.Http;  
using System.Web;  
using System.Web.Http.Filters;  
  
namespace Webapi2  
{  
     
  
      public class DeflateCompressionAttribute : ActionFilterAttribute  
      {  
    public override void OnActionExecuted(HttpActionExecutedContext actContext)  
   {  
       var content = actContext.Response.Content;  
       var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result;  
       var zlibbedContent = bytes == null ? new byte[0] :   
       CompressionHelper.DeflateByte(bytes);  
       actContext.Response.Content = new ByteArrayContent(zlibbedContent);  
       actContext.Response.Content.Headers.Remove("Content-Type");  
       actContext.Response.Content.Headers.Add("Content-encoding", "deflate");  
       actContext.Response.Content.Headers.Add("Content-Type","application/json");  
       base.OnActionExecuted(actContext);  
     }  
  
            }  
  
        public class CompressionHelper  
        {  
  
            public static byte[] DeflateByte(byte[] str)  
            {  
  
                if (str == null)  
                {  
  
                    return null;  
  
                }  
  
                using (var output = new MemoryStream())  
                {  
  
                    using (  
  
                    var compressor = new Ionic.Zlib.GZipStream(  
  
                    output, Ionic.Zlib.CompressionMode.Compress,  
  
                    Ionic.Zlib.CompressionLevel.BestSpeed))  
                    {  
  
                        compressor.Write(str, 0, str.Length);  
  
                    }  
  
                    return output.ToArray();  
  
                }  
  
            }  
  
        }    
    }  



2. 이를 컨트롤러에 적용해 본다. DeflateCompression 어트리뷰트를 넣으면 적용이 된다.


[HttpGet]  
       [Route("getData")]  
       [AllowAnonymous]  
       [DeflateCompression]  
       public async Task<IHttpActionResult> getData()  
       {  
           Stopwatch sw=new Stopwatch();  
           sw.Start();  
           Dictionary<object, object> dict = new Dictionary<object, object>();  
           List<Employee> li = new List<Employee>();  
           li.Add(new Employee {id="2",Name="Debendra",Id= "A123", Email="Debendra256@gmail.com"});  
           li.Add(new Employee { id = "3", Name = "Sumit", Id = "A124", Email = "Sumit@gmail.com" });  
           li.Add(new Employee { id = "4", Name = "Jayant", Id = "A125", Email = "jsyant@gmail.com" });  
           li.Add(new Employee { id = "5", Name = "Kumar", Id = "A126", Email = "KR@gmail.com" });  
     
           sw.Stop();  
            
           dict.Add("Details",li);  
           dict.Add("Time", sw.Elapsed);  
  
           return Ok(dict);  
  
       }  


3. 체크해 본다.


result


웹서비스에서 이를 사용하면 50% 데이터 압축 기능을 제공하여 빠른 속도로 바인딩을 해 준다.