فشرده سازی خروجی فایلهای استاتیک سایت
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

زمانیکه صفحه‌ای لود می‌شود، به همراه خود محتویاتی از قبیل تصویر و فایلهای جاوا اسکریپت را نیز به سیستم کاربر حمل می‌کند. در ASP.NET می‌توان از خاصیت فشرده سازی gzip , gzip  جهت ارائه محتویات سرور استفاده کرد:

برای پیاده سازی آن می‌توان از رویداد Application_PreRequestHandlerExecute در فایل Global.asax استفاده کرد:

using System;
using System.IO.Compression;
using System.Web;
using System.Web.UI;

namespace GZipTest
{
    public class Global : HttpApplication
    {
        void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            var app = sender as HttpApplication;
            if (app == null) return;

            var acceptEncoding = app.Request.Headers["Accept-Encoding"];
            var prevUncompressedStream = app.Response.Filter;

            if (!(app.Context.CurrentHandler is Page ||
              app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
                return;

            if (string.IsNullOrEmpty(acceptEncoding))
                return;

            acceptEncoding = acceptEncoding.ToLower();

            if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
            {
                // defalte
                app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "deflate");
            }
            else if (acceptEncoding.Contains("gzip"))
            {
                // gzip
                app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "gzip");
            }
        }
    }
}
  • #
    ‫۱۲ سال و ۱ ماه قبل، چهارشنبه ۱۵ شهریور ۱۳۹۱، ساعت ۱۷:۵۲
    در مورد تصویر ارسالی:
    در این سایت از این روش  (System.Web.Optimization) استفاده می‌شود. روش یاد شده در IIS7 خروجی فشرده شده با GZip نیز دارد؛ اما نه در IIS6. ولی در هر دو حالت، کش را تنظیم می‌کند:

    به همین جهت در بار بعدی مشاهده سایت، دیگر درخواست اضافه‌ای جهت دریافت اسکریپت‌ها و شیوه نامه‌ها ارسال نخواهد شد:



    • #
      ‫۱۲ سال و ۱ ماه قبل، چهارشنبه ۱۵ شهریور ۱۳۹۱، ساعت ۱۷:۵۸
      ممنون،راهکارهایی که شما قبلا برای کاهش درخواست بین کلاینت و سرور داده بودید حداقل برای بنده خیلی کارگشا بوده و این مطلب برای استفاده بهتر از امکان فشرده سازی آورده شده.
      پ ن:عکس برای درک مسئله آورده شده بود!
  • #
    ‫۱۲ سال و ۱ ماه قبل، چهارشنبه ۱۵ شهریور ۱۳۹۱، ساعت ۱۹:۵۴
    روی ویندوز سرور‌های 2008 (IIS 7 و بالاتر) این فشرده سازی توسط IIS فقط با تنظیم ساده ای در web.config انجام می‌شود. در اغلب هاستینگ هایی هم که من استفاده کردم این قابلیت فعال بوده است و نیازی به کدنویسی نیست. و البته بستگی به نوع پروژه هم ندارد.
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" doStaticCompression="true"/>
    <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="*/*" enabled="false" />
    </staticTypes>
    </httpCompression>
        <urlCompression doStaticCompression="true" doDynamicCompression="false" />

    اطلاعات بیشتر :
    HTTP Compression
    Scheme
    URL Compression
  • #
    ‫۱۲ سال و ۱ ماه قبل، پنجشنبه ۱۶ شهریور ۱۳۹۱، ساعت ۰۴:۱۲
    آقای نصیری ممنونم از این مطلبتون اما ی سوال :
    من روی سرورم IIS 6 دارم و بدون هیچ گونه تنظیم خاصی می‌بینم که در سربرگ Net، همه Response‌ها بطور خودکار gzip شدن. بدون اینکه کدی نوشته باشم یا کاری کرده باشم.


    آیا خود IIS6 بطور خودکار این فشرده سازی را انجام می‌دهد؟ 
    • #
      ‫۱۲ سال و ۱ ماه قبل، پنجشنبه ۱۶ شهریور ۱۳۹۱، ساعت ۰۴:۱۵
      بله. سرور دار یک سری تنظیمات رو می‌تونه اعمال کنه تا اینکار برای تمام سایت‌های هاست شده خودکار شود.
      • #
        ‫۱۲ سال و ۱ ماه قبل، پنجشنبه ۱۶ شهریور ۱۳۹۱، ساعت ۰۴:۳۰
        ممنون از توجهتون.
  • #
    ‫۱۲ سال و ۱ ماه قبل، جمعه ۳۱ شهریور ۱۳۹۱، ساعت ۱۷:۵۳
    سلام و ممنون از مطالب مفیدتون،
    من به تازگی وب سایتی ساختم و با خوندن این مطلب ، فشرده سازی رو روی سایت انجام دادم. 
    اما مشکل اینجاست که این فشرده سازی تنها روی سرور IIS لوکال جواب میده و وقتی که سایت رو روی هاست آپلود می‌کنم ، هیچ فشرده سازی انجام نمیشه.
    لطفا راهنماییم کنید.
    با تشکر
    • #
      ‫۱۲ سال و ۱ ماه قبل، جمعه ۳۱ شهریور ۱۳۹۱، ساعت ۱۹:۵۴
      همونطور که مهندس نصیری در کامنت اول این پست گفتند این تنظیمات بر روی iis نسخه 7 به بالا به این صورت هم جواب میده ولی برای نسخه‌های پائین باید از iis خود سرور کمک گرفت ولی در  کل منظور از ایجاد این پست معرفی این نوع اعمال، برای سایتها است
    • #
      ‫۱۲ سال و ۱ ماه قبل، جمعه ۳۱ شهریور ۱۳۹۱، ساعت ۲۰:۲۴
      + AppendHeader عموما روی IIS6 مشکل ساز است و بهتر است از AddHeader استفاده شود. 
      • #
        ‫۱۲ سال و ۱ ماه قبل، شنبه ۱ مهر ۱۳۹۱، ساعت ۰۳:۲۴
        سلام
        ممنون از پاسختون...
        با AddHeader هم امتحان کردم... اما موفق نشدم... لطفا یک نگاهی به تصویر ضمیمه بیاندازید... شاید چیزی دستگیرتون بشه:

        • Open in Google Docs Viewer
        • Open link in new tab
        • Open link in new window
        • Open link in new incognito window
        • Download file
        • Copy link address
        • Edit PDF File on PDFescape.com

        با تشکر.

        • Open in Google Docs Viewer
        • Open link in new tab
        • Open link in new window
        • Open link in new incognito window
        • Download file
        • Copy link address
        • Edit PDF File on PDFescape.com
          • #
            ‫۱۲ سال و ۱ ماه قبل، شنبه ۱ مهر ۱۳۹۱، ساعت ۰۴:۲۲
            سلام و تشکر 
            از روش جناب صالحی هم استفاده کردم اما جواب نداد... سوالی که الان برام ایجاد شده اینه که آیا ممکنه هاست من استفاده از فشرده سازی رو غیرفعال کرده باشه؟
            و اینکه آیا مگر کش کردن و فشرده سازی مقوله‌های جدایی نیستند؟!
            با تشکر
            • #
              ‫۱۲ سال و ۱ ماه قبل، شنبه ۱ مهر ۱۳۹۱، ساعت ۰۴:۲۵
              - ممکنه این مورد روی IIS7.5 شما فعال نباشد. باید با پشتیبانی هاست صحبت کنید.
              - هستند. ولی اگر کش کردن را فعال کنید، کاربر یکبار که فایل استاتیک شما را دریافت کرد، بار بعد درخواستی را به سرور ارسال نمی‌کند. به همین جهت در کل بار کمتر و نتیجه بهتری نسبت به فشرده سازی دارد که هر بار باید اعمال شود.
              • #
                ‫۱۲ سال و ۱ ماه قبل، شنبه ۱ مهر ۱۳۹۱، ساعت ۰۴:۳۴
                خیلی ممنون از صبر و شکیباییتون...
                فقط یک سوال دیگه : 
                اگر این قابلیت از طرف هاست غیر فعال باشه ، روی کدهایی که درون رویداد Application_PreRequestHandlerExecute نوشته میشن هم تائیر داره؟
                اگر جواب منفی هست ، پس چرا به نظر میاد اصلا این رویداد روی هاست اجرا نمیشه؟
                ممنون
                • #
                  ‫۱۲ سال و ۱ ماه قبل، شنبه ۱ مهر ۱۳۹۱، ساعت ۰۴:۴۰
                  - خیر.
                  - من دسترسی به سرور و کدهای شما برای دیباگ ندارم. از ELMAH استفاده کنید. شاید خطایی در کار باشد که با ELMAH لاگ می‌شود. شاید اصلا این روال فراخوانی نمی‌شود که بهتر است این نوع کدها را به یک http module منتقل کرد و نه اینکه مستقیما داخل global.asax.cs نوشت.
  • #
    ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۱ بهمن ۱۳۹۲، ساعت ۰۶:۱۴
    سلام من از این کد چطوری استفاده کنم در برنامم؟
    • #
      ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۱ بهمن ۱۳۹۲، ساعت ۱۳:۰۹
      همانطور که در متن نوشتند، این کدها رو باید به فایل global.asax.cs برنامه اضافه کنید. عینا داخلش قرار بدید کار می‌کند.