Saturday 10 June 2017

Compressing web api response using GZip

In this post we are going to see how to create a compressed web api response to user,  because of compressing the result content-length will be less and it is more faster in get response. First let we create a new Web Api project.

    public class Student
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Department { get; set; }

        public int Marks { get; set; }

    }

   public IEnumerable<Student> Get()
   {
            List<Student> studs = new List<Student>();
            studs.Add(new Student() { Id = 1, Name = "rajesh",
Department ="CSE", Marks=83});
            studs.Add(new Student() { Id = 2, Name = "suresh",
Department = "ECE", Marks=92  });
            studs.Add(new Student() { Id = 2, Name = "ramesh",
Department = "CSE", Marks = 76 });
            studs.Add(new Student() { Id = 2, Name = "ramu",
Department = "ECE", Marks = 94 });
            return studs;

    }

From the above code we can see the student list is returning, now we test this in post man rest client.









from the above , you can see the result is content-length is 219, now we will enable the GZip compression. For this we have to create actionFilterAttribute there we have to set the content-encoding as gzip. we have to add a package DotnetZip from nuget package manager


public class GZipCompression
    {
        public static byte[] GzipByte(byte[] input)
        {
            if (input == null)
                return null;
            using (var result= new MemoryStream())
            {
                using(var compress = new Ionic.Zlib.GZipStream(result,
Ionic.Zlib.CompressionMode.Compress))
                {
                    compress.Write(input, 0, input.Length);
                }
                return result.ToArray();
            }
        }
    }



public class ZipCompressionAttribute:ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext                                                actionExecutedContext)
        {
            var content = actionExecutedContext.Response.Content;
            var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result;
            var compressedContent = bytes == null ? new byte[0] :                                                                            GZipCompression.GzipByte(bytes);

            actionExecutedContext.Response.Content = new ByteArrayContent(compressedContent);
            actionExecutedContext.Response.Content.Headers.Remove("Content-Type");
            actionExecutedContext.Response.Content.Headers.Add("Content-encoding", "gzip");
            actionExecutedContext.Response.Content.Headers.Add("Content-Type",                                                                             "application/json");
            base.OnActionExecuted(actionExecutedContext);
        }

    }


Finally we have to add this action filter above the api method

[ZipCompression]
public IEnumerable<Student> Get()
{
            List<Student> studs = new List<Student>();
            studs.Add(new Student() { Id = 1, Name = "rajesh",
Department ="CSE", Marks=83});
            studs.Add(new Student() { Id = 2, Name = "suresh",
Department = "ECE", Marks=92  });
            studs.Add(new Student() { Id = 2, Name = "ramesh",
Department = "CSE", Marks = 76 });
            studs.Add(new Student() { Id = 2, Name = "ramu",
Department = "ECE", Marks = 94 });
            return studs;

}


Now we see the response in post man client, content-length will be reduced.











From this post you can learn how to create a compressing web api response using Gzip.