تحسين أداء صفحات الـ ASP.NET بإستخدام الـ GZip و الـ Deflate Compression

18 ديسمبر 2016     406 مشاهدة    0 تعليق
تم النشر في #ASP.NET  #Compression  #Performance 

الكثير من مطورين الـ ASP.NET يلاحظ أن أداء صفحات الـ ASP.NET أسرع أثناء تطوير المشروع, ولكن يتفاجأ عند رفع الموقع على الخادم, ويتم إستخدامه لفتره من الزمن. طبعاً هنالك أسباب كثير لمشكلة البطء, منها أنه لم يتم تحسين الصفحات المراد طلبها وذلك بعمل ضغط لها Compression قبل أن يتم إرسالها من الخادم, طبعاً أقصد بالضغط هو ضغط محتوى الصفحه, فلو تلاحظ الكثير من مكتبات الـ CSS و الـ JavaScript تقوم بعمل ما يسمى الـ Minification وهو عملية ضغط للإستايلات أو السكربتات والغرض هو تقليل حجمها. فالفكره مقاربه هنا حيث أن ضغط محتوى الصفحة يؤدى إلى تقليل عدد البايتات التي يتم إرسالها من الخادم مما يحسن أداء الموقع.

طبعأ سنتعرف اليوم على كيفية إستخدام البروتوكولين GZip و الـ Defalte للقيام بعملية ضغط صفحات الـ ASP.NET. لحسن الحظ فأن بيئة الدوت نت تسمح لنا بعمل هذا الشيء ببساطه وذلك من خلال إستخدام الفئات الموجوده في فضاء الأسماء System.IO.Compression.

الفكرة أننا سنقوم بعمل Http Module تقوم بعمل ضغط للطلب قبل تنفيذه, وبالتأكيد سنستخدم الفئتين GZipStream و DeflateStream الموجودتين في فضاء الأسماء أعلاه.

public class PageCompressionModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(Context_BeginRequest);
    }

    private void Context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        string encoding = app.Request.Headers.Get("Accept-Encoding")ToLower();
        if (encoding == null)
            return;
        Stream stream = app.Response.Filter;
        if (encoding.Contains("gzip"))
        {
            app.Response.Filter = new GZipStream(stream, CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
        else if (encoding.Contains("deflate"))
        {
            app.Response.Filter = new DeflateStream(stream, CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
    }

    public void Dispose()
    {
    }
}

في المثال أعلاه نلاحظ أننا نقوم بفحص الـ Header المسمى Access-Encoding للتأكد من الطلب يدعم هذا النوع من أنوع الـ Compression, وعلى أساسه نقوم بعمل ضغط للطلب الحالي وذلك بإستخدام الفئتين التي تم ذكرهما سابقاً, وبعدها يتم إضافة Header جديد في الطلب بإسم Content-Encoding ليتم تحديد نوع الضغط.

طبعاً الخطوه الأخيره هي أن يتم تسجيل الـ PageHttpModule في ملف الـ Web.Config ليتم عمل ضغط لأي صفحة ASP.NET تم طلبها.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك