استفاده از کامپوننت GZip برای فشرده سازی Web API

پنجشنبه 1 مرداد 1394

اطلاعات و داده ها در وبسایت به صورت پکیج توسط شبکه اینترنت به سرور ارسال می شود ، حجم این پیکج ها یکی از عامل های مهم در سرعت و عملکرد وبسایت می باشد ، فشرده سازی این داده ها در کاهش حجم تاثیر بسزایی دارد. در این مقاله با چگونگی فشرده سازی توسط GZip آشنا می شویم.

برای فشرده سازی از افزونه های زیادی می توان استفاده کرد ولی در این مقاله ما قصد داریم با کامپوننت DotNetZip که از NuGet قابل دانلود است استفاده کنیم به همین منظور برروی نام پروژه راست کلیک کرده و گزینه Mannage Package Console را کلیک کرده و در پنجره ظاهر شده عبارت DotNetZip را جست و جو میکنیم ، در تصویر زیر بعد از زدن کلید Install تیک سبزی کنار پکیج مشاهده میکنید که نشان دهنده اضافه شدن به پروژه است.

سپس بعد از مراحل فوق (ایجاد پروژه ، اضافه کردن DotNetZip) اقدام به ایجاد پوشه ای با نام Filters در پروژه و سپس در آن یک کلاس به نام CompressFilter.cs ایجاد می کنیم.


کد های زیر نشان دهنده کلاس CompressFilter.cs هستند.

using System;  
using System.Collections.Generic;  
  
using System.IO;  
  
using System.IO.Compression;  
  
using System.Linq;  
  
using System.Net.Http;  
  
using System.Web;  
  
using System.Web.Http.Filters;  
  
namespace Test.API.Filters  
  
{  
  
    public class DeflateCompressionAttribute: ActionFilterAttribute  
  
    {  
  
        public override void OnActionExecuted(HttpActionExecutedContext actContext)  
  
        {  
  
            var content = actContext.Response.Content;  
  
            string contentencoding = ApiHeaderValue.AppContentEncoding.ToString();  
  
            if (contentencoding == "GZip")  
  
            {  
  
                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", "GZip");  
  
                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();  
  
            }  
  
        }  
  
    }  
  
}  

در کلاس قبل متغیر با نام contentencoding ایجاد می کنیم.
سپس در آن سه مقدار در نظر می گیریم GZip/Deflate/No اگر No پاس داده شد بود اطلاعات به روش Json اطلاعات را بر میگرداند.

سپس از کلاس زیر استفاده می کنیم به عنوان متد ارسالی.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 4 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید