# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework >  اصل مهم - فشرده سازی صفحات وب در ASP.NET 2.0

## Behrouz_Rad

*توجه:
کلیه ی حقوق این مقاله متعلق به سایت www.barnamenevis.org می باشد.
استفاده از مطالب این مقاله منوط به ذکر نام منبع است.*

*فایل ضمیمه ی مقاله را از انتهای همین مقاله داونلود کنید.*

در این مقاله فرض بر آن است که خواننده، آشنایی در حد متوسط با ASP.NET و برخی مفاهیم مقدماتی آن دارد.
کدهای این مقاله با زبان VB.NET ارائه شده اند.

در دنیای امروز، انتقال سریع اطلاعات یکی از ارکان اصلی توسعه ی رو به جلوی فناوری محسوب می شود. وب نیز از این قائده مستثنی نیست و تلاش در جهت دریافت پاسخ توسط کلاینت در حداقل زمان ممکن، مخصوصا در زمان استفاده از اینترنت ایرانی(!) کارایی قابل توجهی در افزایش کیفیت ارائه ی خدمات خواهد داشت.

همان طور که می دانید، در زمان ارسال درخواست از سمت کلاینت به سرور، تعدادی اطلاعات که به عنوان Header شناخته شده هستند نیز همراه با درخواست به سرور ارسال می شوند.
برای آگاهی از این Header ها می توانید خاصیت Trace دایرکتیو Page صفحه را به مقدار True تنظیم کنید. در این حالت، اطلاعاتی در مورد پردازش جاری در انتهای صفحه ی وب شما نمایش داده خواهد شد. اگر به قسمت Headers Collection دقت کنید، در جلوی عبارت "Accept-Encoding"، انواع فشرده سازی ساپورت شده توسط مرورگر شما نمایش داده خواهد شد.
معمولا دو مقدار "gzip" و "deflate" در این قسمت نمایش داده می شوند و این مشخص می کند که مرورگر شما کدام یک از انواع فشرده سازی را ساپورت می کند. از این اطلاعات می توان برای تشخیص نوع فشرده سازی مناسب در سمت سرور برای درخواستی خاص بهره جست.

تکمیلی:
فشرده سازی داده ها، یکی از امکاناتی است که در نسخه ی 1.1 پروتوکول Http قرار داده شده و هر مرورگری که از این پروتوکول استفاده می کند (که تمامی مرورگرها این کار را می کنند)، می تواند از این امکان نیز استفاده کند.
در IE این قابلیت به طور پیش فرض فعال است. منوی Tools، گزینه ی Internet Options، سر برگ Advanced، قسمت HTTP 1.1 Settings، گزینه ی Use HTTP 1.1


یکی از امکانات جدیدی که در ASP.NET 2.0 گنجانده شده، امکان فشرده سازی داده ها است.
نیم اسپیس جدید System.IO.Compression شامل دو کلاس GzipStream و DeflateStream است.
این دو کلاس، دو نوع مختلف از عملیات فشرده سازی را ساپورت می کنند.
در حقیقت با استفاده از این دو کلاس، تعداد بایت های ارسالی به کلاینت را کاهش می دهیم.
این کاهش حجم، به معنای واقعی کلمه خواهد بود!

از آنجا که فشرده سازی باید بر روی تمامی درخواست ها انجام پذیرد، باید بتوان تمامی درخواست های ارسالی را هندل کرد.
استفاده از HttpHandler و HttpModule ها بهترین گزینه بدین منظور است.
HttpModule ها کنترل بیشتری بر روی درخواست ها خواهند داشت؛ پس بهترین کار، ایجاد یک HttpModule است که بر روی تمامی درخواست ها کنترل داشته باشد.

ابتدا یک کلاس به پروژه ی خود اضافه کنید. نام کلاس را "HttpCompression" می گذاریم.
این کلاس را در یک نیم اسپیس، مثلا با نام "Behrouz.Compression" قرار دهید.
نیم اسپیس های Web، IO و Compression را به کلاس اضافه کنید.
از آنجا که این کلاس نقش یک Http Module را بازی می کند، باید اینترفیس "IHttpModule" را نیز بدین منظور به کار بگیریم:
کد توضیحات فوق:

Imports Microsoft.VisualBasic
Imports System.Web
Imports System.IO
Imports System.IO.Compression

Namespace Behrouz.Compression
    Public Class HttpCompressionModule
        Implements IHttpModule
    End Class
End Namespace

اینترفیس IHttpModule، دو متد دارد. متد Dispose و متد Init
متد Init مشخص می کند که HttpModule باید در چه رویدادی از رویدادهای پردازش فراخوانی شود.
برای اینکه این رویداد را به HttpModule معرفی کنیم، متدی تعریف می کنیم و سپس با استفاده از دستور AddHandler، این متد را به روال مربوطه نسبت می دهیم.

Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
   AddHandler context.BeginRequest, AddressOf Me.onZip
End Sub

آرگومان context که یکی از پارامترهای متد Init است، به برنامه ی جاری اشاره می کند.
روال BeginRequest بهترین مکان برای گرفتن درخواست هاست. به متد Init می گوییم که متدی با نام onZip تعریف خواهیم کرد که باید در روال BeginRequest فراخوانی شود.
قسمت اصلی کار در روال onZip خواهد بود.
در این روال، داده هایی را که باید به کلاینت ارسال شوند، قبل از ارسال، فشرده می کنیم.

Public Sub onZip(ByVal sender As Object, ByVal e As EventArgs)
   Dim myApp As HttpApplication = CType(sender, HttpApplication)
   Dim encodings As String = myApp.Request.Headers.Get("Accept-Encoding")
   If encodings Is Nothing Then Return
   Dim myStream As Stream = myApp.Response.Filter
   encodings = encodings.ToLower()
   If (encodings.Contains("gzip")) Then
      myApp.Response.Filter = New GZipStream(myStream, CompressionMode.Compress)
      myApp.Response.AddHeader("Content-Encoding", "gzip")
   ElseIf encodings.Contains("deflate") Then
      myApp.Response.Filter = New DeflateStream(myStream, CompressionMode.Compress)
      myApp.Response.AddHeader("Content-Encoding", "deflate")
   End If
End Sub

sender، مرجعی است که قصد فشرده سازی را دارد و این مرجع، برنامه ی جاری است. به آن یک ارجا پیدا می کنیم.
مقدار هدر "Accept-Encoding" در متغیر encodings قرار می گیرد. در صورتی که این مقدار وجود نداشته باشد، مرورگر به هر دلیلی فشرده سازی داده ها را ساپورت نخواهد کرد. در این صورت، برنامه با دستور Return به کار خود پایان خواهد داد.
متد Filter کلاس Response، فیلتری را به داده هایی که قرار است به سمت کلاینت ارسال شوند اعمال می کند. این داده ها به شکل Stream خواهند بود.
در ابتدا باید نوع فشرده سازی ای که توسط مرورگر ساپورت می شود را تشخیص دهیم. این کار با متد Contains متغیر encodings امکان پذیر است. در ابتدا وجود عبارت gzip بررسی می شود و در صورتی که این مقدار جز مقادیر هدر بود، نوع فشرده سازی Gzip به آن اعمال می شود و مقدار هدر "Content-Encoding" به "gzip" تنظیم می شود. این مقدار برای آگاهی از نوع فشرده سازی است که بر روی داده های دریافتی اعمال می شود.
در صورتی که فشرده سازی gzip توسط مرورگر ساپورت نشود، وجود مقدار "deflate" بررسی می شود و این نوع فشرده سازی به داده ها اعمال می شود.

توجه:
فشرده سازی Gzip و Deflate تفاوتی در میزان کاهش حجم داده ها ندارند. جزئیات فشرده سازی Gzip در RFC 1952 و فشرده سازی Deflate در RFC 1951 شرح داده شده است. در این مراجع شرح داده شده است که این نوع فشرده سازی ها از ترکیبی از الگوریتم های "LZ77" و "هافمن" استفاده می کنند و حداکثر میزان فشرده سازی آنها برای داده هایی با حداکثر حجم "چهار گیگابایت" است.
_فرمت Gzip یک استاندارد فشرده سازی Open Source  و جزء فرمت های متداول در سیستم عامل هایی همچون لینوکس هست._

خسته نباشید! تنها کار باقیمانده، تبدیل کلاس به فایل DLL است.
با استفاده از کامپایلر VB.NET (فایل vbc.exe) و یا کامپایلر C#‎.NET (فایل csc.exe) می توانید این کار را انجام دهید.
فایل های فوق در مسیر زیر وجود دارند:

drive:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
با استفاده از خط فرمان DOS فایل را کامپایل می کنیم.
از منوی Start ویندوز، گزینه ی Run را انتخاب کنید. عبارت "cmd" را وارد کنید.
با دستور cd به مسیر فوق بروید و سپس عبارت زیر را وارد کنید:

vbc /t:library /r:System.dll,System.Web.dll D:\inetpub\wwwroot\myApp\App_Code\HttpCompression.  vb
مسیر فایل HttpCompression.vb را بر مبنای سیستم خود تنظیم کنید.
پس از اجرای دستور فوق، فایل DLL حاصل در پوشه ی App_Code قرار خواهد گرفت.
حال پوشه ای با نام "bin" ایجاد کنید و DLL فوق را به آن انتقال دهید.
برای شناساندن این HttpModule به برنامه، باید آن را در فایل Web.Config تعریف کرد.
پس از عبارت <system.web> دستورات زیر را بنویسید:

<httpModules>
   <add name="HttpCompressionModule" 
      type="Behrouz.Compression.HttpCompressionModule, HttpCompressionModule"/>
</httpModules>


بهترین راه برای دیدن نتیجه ی کار، استفاده از مرورگر Firefox است!
پس از اجرای برنامه در Firefox، از منوی Tools گزینه ی Page Info را انتخاب کنید.
به عنوان مثال، من صفحه ای رو در هر دو حالت نرمال و فشرده مقایسه کردم. نتیجه واقعا شگفت انگیز بود!
به دو عکس زیر دقت کنید:




همان طور که ملاحظه می کنید، حجم خروجی صفحه پس از فشرده سازی، تقریبا یک هشتم حجم صفحه در حالت نرمال است!

*فشرده سازی را به عنوان یک اصل ثابت در تمامی برنامه های خود به کار ببرید.*

موفق باشید.

----------


## hanif_x90

چرا در IE کار نمی کند.

----------


## Behrouz_Rad

مشکل از خودته!

----------


## rtech

برای من این ارور رو میده :

Could not load file or assembly 'HttpCompressionModule' or one of its dependencies. The system cannot find the file specified

از این خط : 

  type="Behrouz.Compression.HttpCompressionModule, HttpCompressionModule"/>

من تمام کارهایی رو که گفتید انجام دادم

----------


## Behrouz_Rad

خطای فوق نشان میده که DLL پیدا نشده!
DLL ایجاد شده باید در پوشه ی Bin قرار داده بشه.

موفق باشی.

----------


## rtech

مشکل حل شد من عبارت Onenter  در فایلی که آپلود کرده بودید رو با Onzip  عوض کردم مشکل حل شد .

----------


## یاسر مددیان

آقای راد اگه مشکل لود نشدن عکسها هم حل بشه عالی می شه. من که نتونستم کاری بکنم اگه میشه شما کمک کنید.



با تشکر

----------


## rtech

> آقای راد اگه مشکل لود نشدن عکسها هم حل بشه عالی می شه. من که نتونستم کاری بکنم اگه میشه شما کمک کنید.
> 
> 
> 
> با تشکر


وقتی که سایت رو آپلود کنی این مشکل هم حل میشه منم این مشکل رو داشتم ولی وقتی سایت رو پابلیش و آپلود کردم مشکل حل شد

----------


## anubis_ir

مقاله جالبی در این باره
Compression support in ASP.NET 2.0
http://www.microsoft.com/belux/msdn/...mpression.mspx

----------


## Navid7h

> آقای راد اگه مشکل لود نشدن عکسها هم حل بشه عالی می شه. من که نتونستم کاری بکنم اگه میشه شما کمک کنید.
> 
> 
> 
> با تشکر


سایت رو IIS قرار بده. از cassini استفاده نکن !
من این مشکل رو داشتم اما وقتی که روی IIS ؛ Publish کردم بر طرف شد !

*مرسی آقای راد*

----------


## bardia goharbin

آقای راد من در تبدیل به Dll با csc با مشکل مواجه هستم ولی با vbc مشکلی نیست
دستوری که اجرا میکنم 
csc /t:library /r:System.dll,System.Web.dll c:\Temp\HttpCompressionModule.vb
و خطایی که میده
c:\Temp\HttpCompressionModule.vb(1,1): error CS0116: A namespace does not
        directly contain members such as fields or methods

----------


## Behrouz_Rad

چون داری یک فایل VB رو با کامپایلر #C کامپایل می کنی!

----------


## یاسر مددیان

ولی اون مشکلی که من گفتم هنوز وجود داره وقتی این و فراخونی می کنیم عکسها یه موقع لود میشن یه موقع لود نمیشن ( عکسهای تو سایت ) ؟؟؟؟!!!!!

آقای راد واسه اینم یه کاری کن ( لطفاً). اگه این بشه این کامپوننت فوق العاده ای میشه .

----------


## Behrouz_Rad

آیا از Forms Authentication استفاده می کنی؟

----------


## یاسر مددیان

آره ، ولی همون اول که صفحه اول سایت میاد بالا این مشکل وجود داره !

----------


## Behrouz_Rad

بسیار خوب.
Forms Authentication رو کاملا در Web.Config غیر فعال کن و نتیجه رو بگو.

----------


## یاسر مددیان

چشم .
اگه اکانتم اجازه نداد فردا جواب رو میذارم .

بازم ممنون که کمک می کنید .

----------


## lollypop

سلام
من dll رو ساختم و در فولدر bin وب سایت هم گذاشتم ولی موقع اجرا پیغام میده که نمیتونه ماژول من رو پیدا کنه. اگه تو web.config آخرین عبارت (اسم کلاس) رو با اسم dll یا namespace عوض کنم اجرا میشه ولی هیچ فشرده سازی انجام نمیده. موضوع چیه؟

----------


## manager

من یه مشکل عجیب پیدا کردم، یه ماژول Compressor نوشتم که تقریبا شبیه همین ماژوله ولی مشکل اینجاست که از کدهای جاوا اسکریپت دات نت خطا می گیره !!!

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

----------


## manager

ماژول معرفی شده در این بخش و همچنین مقاله معرفی شده در صفحه قبل دارای یک مشکل بزرگ هست و اون هم اینکه این ماژول هرچیزی را علاوه بر صفحات aspx فشرده می کند که این خود باعث بروز مشکلات می شود که عملا استفاده از آن را غیر ممکن می سازد. البته این مشکل با تغییر کوچکی حل می شود. فقط کافیست صفحات مورد نیاز خود را فشرده کنید. مثلا من فقط نیاز به فشرده سازی صفحات aspx,htm و html داشتم که به تغییر کوچکی این مهم حل شد :

        void Zip(object sender, EventArgs e)
        {
            HttpResponse resp = ((HttpApplication)sender).Response;
            HttpRequest req = ((HttpApplication)sender).Request;

            string absolutePath = req.Url.AbsolutePath;
            string ext = absolutePath.Substring(absolutePath.LastIndexOf('.  ') + 1);
            if (!String.IsNullOrEmpty(ext))
            {
                ext = ext.ToLower();
                if (ext.Equals("aspx") || ext.Contains("htm"))
                {
                    string encoding = req.Headers.Get("Accept-Encoding");
                    if (!String.IsNullOrEmpty(encoding))
                    {
                        encoding = encoding.ToLower();
                        if (encoding.Contains("gzip"))
                        {
                            resp.Filter = new GZipStream(resp.Filter, CompressionMode.Compress);
                            resp.AddHeader("Content-Encoding", "gzip");
                        }
                        else
                            if (encoding.Contains("deflate"))
                            {
                                resp.Filter = new DeflateStream(resp.Filter, CompressionMode.Compress);
                                resp.AddHeader("Content-Encoding", "deflate");
                            }
                    }
                }
            }
        }

----------


## Behrouz_Rad

> ماژول معرفی شده در این بخش و همچنین مقاله معرفی شده در صفحه قبل دارای یک مشکل بزرگ هست و اون هم اینکه این ماژول هرچیزی را علاوه بر صفحات aspx فشرده می کند که این خود باعث بروز مشکلات می شود


کدی که نوشتی عملا کار خاصی انجام نمیده!
این مشکلی هست که در حال حاضر تنها برای WebResource.axd اتفاق می افته!

صورت مسئله اینه:
*
ماژولر WebResource.axd با قابلیت جدید فشرده سازی در ASP.NET 2.0 ناسازگار است.*
در نتیجه، تو نمی تونی کاری کنی که این ماژولر که برخی کنترل ها و متدها، منابع خودشون رو از اون دریافت میکنند، در کدهای صفحه ظاهر نشه؛ در نتیجه مشکل پابرجاست.

اما....
تا اینجا متوجه شدی که ماژولر WebResource.axd ناگزیر باید وجود داشته باشه ولی اگر راهی وجود داشته باشه که به ماژول فشرده سازی گفته بشه فایل خاصی رو از منابع پردازشی خودت مستثنی کن، مشکل برطرف میشه.
خوشبختانه راه حل منطقی و جالبی در دات نت 2.0 بدین منظور قرار داده شده که می تونه این مشکل رو برطرف کنه.
با استفاده از المنت <ExcludedPaths> در Web.Config و ذکر WebResource.axd در این قسمت، به ماژولر فشرده سازی میگی که فایلی با چنین نامی رو از لیست منابعی که فشرده می کنی حذف کن.

به همین سادگی...

_البته اگر اشتباه نکنم Hotfix ای برای حل این مشکل عرضه شده..._

موفق باشید.

----------


## manager

> کدی که نوشتی عملا کار خاصی انجام نمیده!


 نه آقای راد، مشکل رو حل می کنه و فقط فایل های مورد نظر رو فشرده می کنه من عملا امتحان کردم و جواب داده !!! جالبه بدونید که علاوه بر WebResource.axd ها HttpHandlerها و فایل های ashx نیز از این قاعده مستثنا نبودند و همین مشکل را داشتند که با این روش ساده حل شدند.

----------


## Behrouz_Rad

این نکته رو هم اضافه کنم که فایل هایی رو که فکر می کنید فشرده سازی در کم کردن حجم اونها تاثیر چندانی نداره از لیست منابع پردازشی ماژولر حذف کنید تا در منابع سرور و زمان پاسخگویی صرفه جویی بشه.
به عنوان مثال برای مستثنی کردن تمامی فایل های JPEG از فشرده سازی:

<ExcludedMimeTypes>
     <add mime="image/jpeg"/>
</ExcludedMimeTypes>

موفق باشید.

----------


## PrinceDotNet

میشه بگید تگهای <ExcludedPaths> و <ExcludedMimeTypes> رو دقیقا در کجای web.config باید قرار بدم ؟

----------


## PrinceDotNet

بابا کسی نیست جواب ما رو بده ؟
این دو تا تگ رو دقیقا باید کجای Web.Config قرار داد ؟

----------


## hamed_bostan

به من این error  رو میده :




*Configuration Error* 

*Description: * An error occurred during the processing of a configuration file required to  service this request. Please review the specific error details below and modify  your configuration file appropriately. 

*Parser Error Message: * Could not load file or assembly 'HttpCompressionModule' or one of its  dependencies. The system cannot find the file specified.  (D:\Programming\company\InfoWebsite\InfoWebSite\we  b.config line  10)

*Source Error:* 

   Line 8:      <httpModules>
Line 9:        <add name="HttpCompressionModule" 
Line 10:          type="Bostan.Compression.HttpCompressionModule, HttpCompressionModule"/>
Line 11:     </httpModules>
Line 12:         <compilation debug="true" strict="false" explicit="true">
*Source  File:* D:\Programming\company\InfoWebsite\InfoWebSite\web  .config*    Line: * 10 






فایل dll هم داخل شاخه bin هست و ئاخل web.config هم که همونطور که توی خطا می بینین tag  رو اضافه کردم.

----------


## hamed_bostan

> سلام
> من dll رو ساختم و در فولدر bin وب سایت هم گذاشتم ولی موقع اجرا پیغام میده که نمیتونه ماژول من رو پیدا کنه. اگه تو web.config آخرین عبارت (اسم کلاس) رو با اسم dll یا namespace عوض کنم اجرا میشه ولی هیچ فشرده سازی انجام نمیده. موضوع چیه؟



منهم به این مشکل برخوردم اگه ممکنه کمک کنید.

----------


## manager

فرمت add در بخش httpModules باید به شکل زیر باشه :
<add name="ModuleName"
   type=".NET Class, Assembly"/>و به عنوان نمونه :

<?xml version="1.0"?>
<configuration >
   <configSections>
   <system.web>
     <httpModules>
      <add name="AspCompression" 
         type="Farahy.Compression.AspxCompression, AspxCompression"/>
    </httpModules>
...


اگر ماژول شما ماژول همین بخش باشه باید کار کنه...

----------


## manager

> میشه بگید تگهای <ExcludedPaths> و <ExcludedMimeTypes> رو دقیقا در کجای web.config باید قرار بدم ؟





> منهم به این مشکل برخوردم اگه ممکنه کمک کنید.


در مورد تگ های ExcludedPathes و ExcludedMimeTypes باید بگم این تگ های از تگ های استاندارد دات نیستند و می بایست توسط شما پیاده سازی بشن، البته پیاده سازی این تگها کاری نداره و آسونه و اگر یاد بگیرید چه طوری تگ تنظیماتی ایجاد کنید فوق العاده برای شما مفید خواهد بود. من یک نمونه آماده پیدا کردم و براتون گذاشتم، خواستید می تونید دانلود کنید و لذت ببرید.
http://www.codeproject.com/aspnet/HttpCompress.asp
اگر خیلی وقت کم دارید و می خواین هرچه سریع تر کارتون راه بیافته می تونید از همون روشی که من معرفی کردم و کدش رو هم گذاشتم استفاده کنید، اون هم همین کار رو می کنه.

----------


## hamed_bostan

> فرمت add در بخش httpModules باید به شکل زیر باشه :
> <add name="ModuleName"
>    type=".NET Class, Assembly"/>و به عنوان نمونه :
> 
> 
> اگر ماژول شما ماژول همین بخش باشه باید کار کنه...


به خدا من عین همین نوشتم :


  <httpModules>
        <add name="HttpCompressionModule" 
           type="Behrouz.Compression.HttpCompressionModule, HttpCompressionModule"/>
      </httpModules>


کمکککککککککککککککک

----------


## Behrouz_Rad

نام روال OnEnter رو به OnZip تغییر بده.

----------


## manager

شما از کجا می فهمید که ماژولتون اجرا نمی شه ؟ سورس ماژول را در این بخش قرار بدین تا بررسی کنیم. به هر حال این کاری هست که ما انجام دادیم و کار کرده، احتمالا شما در جائی قصور کرده اید...

----------


## hamed_bostan

> نام روال OnEnter رو به OnZip تغییر بده.



من دقیقا همین کار رو کردم .حتی رو local هم جواب نمیده و error ای که گفتم رو میده . کم پله پله همراه اموزشی که داده بودین تو پست اول قدم بهقدم اومدم جلو :



Imports Microsoft.VisualBasic
Imports System.Web
Imports System.IO
Imports System.IO.Compression

Namespace Behrouz.Compression
    Public Class HttpCompressionModule
        Implements IHttpModule

        Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

        End Sub

        Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
            AddHandler context.BeginRequest, AddressOf Me.OnZip
        End Sub

        Public Sub OnZip(ByVal sender As Object, ByVal e As EventArgs)
            Dim app As HttpApplication = CType(sender, HttpApplication)
            Dim encodings As String = app.Request.Headers.Get("Accept-Encoding")
            If encodings Is Nothing Then Return
            Dim baseStream As Stream = app.Response.Filter
            encodings = encodings.ToLower()
            If (encodings.Contains("gzip")) Then
                app.Response.Filter = New GZipStream(baseStream, CompressionMode.Compress)
                app.Response.AddHeader("Content-Encoding", "gzip")
            ElseIf encodings.Contains("deflate") Then
                app.Response.Filter = New DeflateStream(baseStream, CompressionMode.Compress)
                app.Response.AddHeader("Content-Encoding", "deflate")
            End If
        End Sub
    End Class
End Namespace



بعد  این رو اجرا کردم:



vbc /t:library /r:System.dll,System.Web.dll D:\inetpub\wwwroot\myApp\App_Code\HttpCompression.  vb



با ادرس فایل خودم و dll تولید شد . بعد هم تو web.config نوشتم :



    <system.web>
      <httpModules>
        <add name="HttpCompressionModule" 
           type="Behrouz.Compression.HttpCompressionModule, HttpCompressionModule"/>
      </httpModules>
        <compilation debug="true" strict="false" explicit="true">
            <assemblies>
                <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
                <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies></compilation>
        <pages>
...
...


جای دیگه که کاری نباید می کردم ؟؟؟ dll هم توی bin کپی کردم

مطلب خیلی مهم و مفید و به درد بخوریه و نمی خوام از دستش بدم . ممنون می شم راهنماییم کنین

----------


## manager

اسم فایل dll شما HttpCompression یا HttpCompressionModule ؟
همون طور که خودتون هم می دونید مشکل از پیدا کردن فایل و لود کردن اسمبلی هست و کدها مشکلی نداره !!

----------


## ali_kolahdoozan

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

----------


## hamed_bostan

> اصول فشرده سازی رو آقای راد گزاشتن . دستشون هم درد نکنه اما تنها منبع قابل مراجعه در جهان که نیست . توی کتابها هست . صد جای دیگه هم هست . قسمتی رو خود استفاده کننده ببره جلو و همین رو با دانش خودش بیامیزد . نه اینکه همه منتظر ایشان هستید و یکجورهایی یک عده یک حالت طلبکاری پیدا کردند که درست نیست



من فکر نمی کنم جایی  طلبکاری کرده باشم ؟!!!
ضمنا بنده بار اولمه با آین نحوه dll استفاده کردن و با httphandler ها کار می کنم .  توی اینترنت هم search کردم اما اگه به کد نگاهی بندازید می بینید مشکل از پیدا نکردن فایله و احتمالا یه جایی یه اشتباهی چیزی کردم .   کمک هم نخوایم چشم

بهروز جان به هر حال ممنون از مقاله ات و توجهت .
یا حق

----------


## PrinceDotNet

با این روش <ExcludedPaths> مشکل که دقیقا فایل WebRecource هستش حل میشه.ولی وقتی روی وب امتحان می کنم باز همون مشکلات قبلی باقی می مونه.
مشکل کجا می تونه باشه ؟

----------


## hamed_bostan

شاید اینها کمک کنه.

----------


## iman_22a

سلام دوستان
از آقای راد برای مقاله ارزشمندشون تشکر می کنم .
من طبق تاپیک پیش رفتم و تمامی توصیه های دوستان رو هم خوندم و توی نمونه پروژم بکار بردم و در نهایت به اونجایی رسیدم که توی FireFox تفاوت بین حجم صفحه در حالت با Compression و در حالت بدون Compression خیلی چشمگیره ولی یک سری مشکلات هست ، در نمایش صفحه با Firefox تصاویر بخوبی نمایش داده می شوند ولی اشکالاتی در کنترل های Navigator و Treeview ایجاد می شود .
در Ie6 که تست کردم Treeview مشکلی ندارد ولی کنترل Rotator از ‍ComponentArt اصلا نمایش داده نمی شود و پایین صفحه در Statusbar از صفحه ارور می گیرد که مربوط به همان Rotator است ولی تفاوتی از لحاظ حجمی بین دو حالت وجود ندارد.
از پست جناب Manager هم استفاده کردم ولی همانطور که جناب راد فرمودند عملا کاری انجام نمی داد چون اصلا جلوی Compression را می گرفت .
از پست حامد بوستان عزیز هم خواستم استفاده کنم و برام مشکل بود چون یخورده پیچیده بود و چون به زبان سی شارپم بود نتونستم چیز زیادی ازش بفهمم .

اگر ممکنه در این موارد بحث کنید ... ممنون می شوم

----------


## manager

> از پست جناب Manager هم استفاده کردم ولی همانطور که جناب راد فرمودند عملا کاری انجام نمی داد چون اصلا جلوی Compression را می گرفت .


دقیقا اصلا برای همین ایجاد شد که جلوی Compression فایل های ناخواسته گرفته بشه. من دیگه با نوشته شما به شک افتادم نکنه اشتباه کرده باشم، ولی دیدم که dll که تهیه کردم به خوبی کار می کنه و حجم صفحات را چیزی در حدود 80% کاهش می ده. من مجددا dll رو آپلود می کنم، مطمئن هستم که مشکلتون حل می شه.

دانلود

----------


## iman_22a

ممنون تست می کنم ، جوابشو بهتون می دم

----------


## iman_22a

جناب Manager مرسی ، ممنون
هیچکدوماز مشکلاتی که قبلا گفتم الان به چشم نمی خوره  :متعجب: 
حجم صفحه در Firefox بدون Comp. برابر 44.5 kb بود که الان 8 Kb   :کف کرده!: 
البته فکر کنم IE حجم رو درست نمی زنه چون هیچ تغییری در دوحالت نشون نمی ده ، بیخیال
دستتون درد نکنه ، عالی بود
 :خجالت:

----------


## flashswf

با سلام
دوستان عزیزی که مشکل کامپایل فایل و همین طور اجرا رو داشتن یا اینکه نمی خوان یک dll مجزا به پروژه شون اضافه کنن می تونن خیلی ساده بعد از اضافه کردن کلاس به پروژه شون در Web.Config به جای کد قبل این کد رو قرار بدن


<httpModules>
        <add name="HttpCompressionModule" type="Behrouz.Compression.HttpCompressionModule"/>
      </httpModules>


به همین سادگی دیگه نیازی به کامپایل فایل هم نیست

در مورد فایل های عکس و جاوا اسکریپت اگه اونها رو Compress کنید بروزر نمی تونه اونها رو باز کنه در نتیجه خیلی از کامپونت های دات نت که با جاوا اسکریپت کار نمی کنه 
روش آقای manager برای حل این مشکل به نظر من خیلی خوبه

موفق باشید

----------


## jasadeghi

سلام آقا بهروز
برنامه خیلی جالبی بود و من در تمام پروژهام اون رو گذاشتم که خیلی هم تاثیر گذار بود.
ولی یک اشکال بزرگ برای من به وجود اومد و اون هم اینکه دیگه ولیدشن های من تو این پروژها غیر فعال میشن.
اگر راهی داره تا این اشکال هم برطرف بشه ممنون میشم .
در ضمن این رو هم بگم که من تا دستور 



<httpModules>
<addname="HttpCompressionModule"
type="Behrouz.Compression.HttpCompressionModule, HttpCompressionModule"/>
</httpModules>


رو از داخل webconfig بر میدارم validation ها هم درست کار می کنن.

باز هم تشکر بابت آموزش جالبتون

----------


## manager

> سلام آقا بهروز
> برنامه خیلی جالبی بود و من در تمام پروژهام اون رو گذاشتم که خیلی هم تاثیر گذار بود.
> ولی یک اشکال بزرگ برای من به وجود اومد و اون هم اینکه دیگه ولیدشن های من تو این پروژها غیر فعال میشن.
> اگر راهی داره تا این اشکال هم برطرف بشه ممنون میشم .
> در ضمن این رو هم بگم که من تا دستور 
> 
> 
> 
> <httpModules>
> ...


با دقت بیشتری پست ها رو دنبال کنید.

----------


## mahdi_negahi

آقا منم از ajax استفاده میکنم و از updatePanle وقتی صفحه update میشه به من خطای Response.Wrie میگیره وقتی zip حذف میکنم درست میشه

----------


## rtech

چند روز پیش مقاله ای دریافت کردم در ضمینه فشرده سازی CSS  ،  Javascript ,axd  و فایلهای دیگر که میتونه در کنار این فشرده سازی بر کل سایت تاثیر بسیار مثبتی بزاره که به زودی این مقاله رو برای شما در اینجا قرار میدم

----------


## tc1000

با سلام
آیا فشرده سازی در IE  انجام نمی شود که ظرفیت فایل را آنطور نشان میدهد و یا فشرده سازی می کند اون ضاهری اونطوریه؟

----------


## mahdi_negahi

سلام دوستان یک نگاهی به این مقاله بندازید خیلی جالبه
http://www.codeproject.com/aspnet/httpcompression.asp

----------


## elvis_programmer

خوب همونطور که جناب راد گفتن نتیجه عملکرد این فشرده سازی جالب هست و کمی هم شگفت انگیز اما چیز جالبتر برای من این بود که هر چی CSS در سایت و برنامه استفاده میشد دیگر کار نمیکرد و بعد از برداشتن این تکنیک دوباره CSS ها اعمال میشدند.کسی تا بحال به این نکته توجه کرده یا نه ؟ ممکنه این قضیه فقط برای من اتفاق افتاده باشه لطفا دوستان یک بررسی بفرمایند همینجا اعلام کنند.  :متفکر:

----------


## Behrouz_Rad

شما کل تاپیک رو بررسی کن تا به جوابت برسی!

----------


## elvis_programmer

والا جناب راد من نددیم تا بحال کسی به این مشکل بر بخوره منظور شما دقیقا چی هست ؟؟؟

----------


## elvis_programmer

اقا شما از کجا توی IE نگاه میکنید که میگید حجمش کم نشده ؟؟؟

----------


## RezaKia

سلام،

من مدت زیادی هست دارم با برنامه HttpCompress کار میکنم. برنامه جالب خوبی است اگر:

1. هیچ کدی تو پروژه نداشته باشی که State صفحه رو عوض کنه.
2. هیچ کدوم از کدهای پروژه IHttpModule و IHttpHandler رو تغییر ندن.
3. هیچ نوع Page Content Proxy نداشته باشی.
4. به هیچ وجه تقاضای ارتباط دوسویه یا Streaming نداشته باشی.

اگر این ها در پروژه شما نباشد، که قضیه حله. نسخه اصلی این رو از سایت سازنده اون بگیرید رایگان هم هست.

دو تا دایرکتوری داره، یکی VB و دیگری هم #C. راحت با اضافه کردن دوخط کد به Web.Config و اضافه کردن Dll به Bin تمام کارها بعهده خودشه.  :لبخند: 

اما اگر تو پروژه از این تکنیکهای لازم و حرفه ای استفاده کرده باشید، مجبورید مثل من تمام این کارها رو مدیریت کنید.


در ضمن خود توسعه دهندگان HttpCompress اعلام کردند این قابلیت فقط برای پروژه های کوچک و غیر حرفه ای طراحی شده.  :گریه:  و همچنین این تکنیک امکلن حذف عناصر اصلی صفحه از جمله فاصله اندازها، کدهای کنترل و ... را دارد.

لذا بهتر است این گونه تکنیک ها را با احتیاط و نه برای هر پروژه های استفاده کنید.


*قطعاً لازم است از حرکت زیبای آقای راد برای شروع این بحث تشکر کنم.*


موفق باشید.

----------


## rtech

> سلام،
> 
> من مدت زیادی هست دارم با برنامه HttpCompress کار میکنم. برنامه جالب خوبی است اگر:
> 
> 1. هیچ کدی تو پروژه نداشته باشی که State صفحه رو عوض کنه.
> 2. هیچ کدوم از کدهای پروژه IHttpModule و IHttpHandler رو تغییر ندن.
> 3. هیچ نوع Page Content Proxy نداشته باشی.
> 4. به هیچ وجه تقاضای ارتباط دوسویه یا Streaming نداشته باشی.
> 
> ...


من هم حرف های ایشون رو تایید میکنم طبق تجربه هایی که داشتم برای پروژه های حرفه ای این  عمل به خوبی صورت نمیگره اما برای پروژه های کوچک واقعا کاربردی هست .

----------


## ali643

من یه مشکل دارم که تو IE حجم صفحه کم نمیشه اما تو FF حجم صفحه 4/1 میشه.
در FF عکس منو رو Load نمیکنه اما در IE همه چیز درسته.
مشکل چی میتونه باشه؟؟؟؟

مرسی.

----------


## jasadeghi

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

چند ماهی از آغاز این بحث که به همت جناب راد شروع شد میگذره.

اگر به خاطر داشته باشید اولین ورژن DotNetNuke که به بازار اومد سرعت لود خیلی کمی داشت ، ولی در نسخه های جدید این ضعف رو از بین برد و در حال حاظر سرعت مناسبی داره علاوه بر اینکه با AJAX هم کار میکنه و هیچ کدوم از اسکریپ ها و یا CSS ها و یا ... اون با خطا مواجه نمیشه. 

من در سایت جدیدی که با AJAX طراحی کردم برای حل مشکل سرعت اون از DotNetNuke.HttpModules.Compression.dll استفاده کردم و تمام مشکلاتی رو که تا الان با کمپرسور ها داشتم بر طرف شد، و سرعت لود سایت هم بسیار بهتر شد. 

تنها مشکلی که برای من به وجود اومد این بود که دیگه فایل Default.aspx من در هیچ کدوم از پوشه ها کار نمی کرد و با خطا مواجه می شد، که این مشکل رو هم با عوض کردن نام این فایل بر طرف کردم.

من فایلهای این کمپرسور رو که یک فایل dll و یک فایل config است، در اینجا قرار می دم تا شما هم بتونید از اون استفاده کنید، و اگر احیانا راه حلی برای حل مشکل نام Default.aspx هم پیدا کردید در اینجا قرارش بدین.


 
<httpModules>
<addname="Compression"type="DotNetNuke.HttpModules.Compression.HttpModule, DotNetNuke.HttpModules.Compression" />
</httpModules>
 



با آرزوی بهروزی

----------


## maxpayn2

سلام
من کد های آقای راد رو به C#‎ تبدیل کردم ولی وقتی میخوام کلاس رو به dll تبدیل کنم ارور میده ، طریقه تبدیل به dll و ارور رو ضمیمه میکنم ، لطفا اشکال کار رو بفرمایید

----------


## rtech

در ویستا معمولا باید Permission  لازم را برای اجرای بعضی از فایلها داشته باشید بهتر است از یوزر Administrator  استفاده کنید .

----------


## maxpayn2

این رو هم ببینید ، بد نیست
http://www.codeproject.com/KB/aspnet...mpression.aspx

----------


## mp2009

> دقیقا اصلا برای همین ایجاد شد که جلوی Compression فایل های ناخواسته گرفته بشه. من دیگه با نوشته شما به شک افتادم نکنه اشتباه کرده باشم، ولی دیدم که dll که تهیه کردم به خوبی کار می کنه و حجم صفحات را چیزی در حدود 80% کاهش می ده. من مجددا dll رو آپلود می کنم، مطمئن هستم که مشکلتون حل می شه.
> 
> دانلود



ممنون دوست عزیز . میشه بگید چه جوری توی web.config اونو فراخونی بکنیم؟

----------


## mp2009

دوستان العان من 4 روز هست که این سوال رو کردم. یعنی یه جوانمرد پیدا نمیشه جوابشو بده؟

----------


## FirstLine

> دروود به تمامی دوستان
> 
> چند ماهی از آغاز این بحث که به همت جناب راد شروع شد میگذره.
> 
> اگر به خاطر داشته باشید اولین ورژن DotNetNuke که به بازار اومد سرعت لود خیلی کمی داشت ، ولی در نسخه های جدید این ضعف رو از بین برد و در حال حاظر سرعت مناسبی داره علاوه بر اینکه با AJAX هم کار میکنه و هیچ کدوم از اسکریپ ها و یا CSS ها و یا ... اون با خطا مواجه نمیشه. 
> 
> من در سایت جدیدی که با AJAX طراحی کردم برای حل مشکل سرعت اون از DotNetNuke.HttpModules.Compression.dll استفاده کردم و تمام مشکلاتی رو که تا الان با کمپرسور ها داشتم بر طرف شد، و سرعت لود سایت هم بسیار بهتر شد. 
> 
> تنها مشکلی که برای من به وجود اومد این بود که دیگه فایل Default.aspx من در هیچ کدوم از پوشه ها کار نمی کرد و با خطا مواجه می شد، که این مشکل رو هم با عوض کردن نام این فایل بر طرف کردم.
> ...


با سلام
  من این دو تا فایل رو به پرزژه اضافه کردم اما پیغام خطا میده:


Server Error in '/ACP' Application.
--------------------------------------------------------------------------------

Configuration Error 
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. 

Parser Error Message: Could not load file or assembly 'DotNetNuke.HttpModules.Compression' or one of its dependencies. The system cannot find the file specified. (D:\www\ACP\web.config line 70)

Source Error: 


Line 68:     
Line 69:     <httpModules>
Line 70:       <add name="Compression" type="DotNetNuke.HttpModules.Compression.HttpModul  e, DotNetNuke.HttpModules.Compression" />
Line 71:     </httpModules>
Line 72:   
 




با تشکر

----------


## Modifier

با سلام

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

1 - چرا ما باید کلاس رو به پروژه اضافه کنیم و آیا نمیشه این کلاس رو بسازیم و بعد بزاریمش توی BIN ؟

2 - و آیا خود browser ها کار فشرده سازی رو انجام نمیده پس برای چی ساپورت میکنه ؟

3 - و این طور که من خوندم این کار برای IE اثری ندارد و اگه این طوره چه سودی داره ؟

یا علی

----------


## Behrouz_Rad

> 1 - چرا ما باید کلاس رو به پروژه اضافه کنیم و آیا نمیشه این کلاس رو بسازیم و بعد بزاریمش توی BIN ؟


در نهایت هم در bin قرار می گیره.



> 2 - و آیا خود browser ها کار فشرده سازی رو انجام نمیده پس برای چی ساپورت میکنه ؟


خیر انجام نمیده. فشرده سازی قابلیتی هست که نسخه ی 1.1 پروتوکول HTTP از اون حمایت می کنه و هر مرورگری که از این پروتوکول استفاده می کنه، قابلیت دریافت داده ها به صورت فشرده رو هم داره و فشرده سازی رو هم ساپورت می کنه.



> 3 - و این طور که من خوندم این کار برای IE اثری ندارد و اگه این طوره چه سودی داره ؟


خیر اینطور نیست. IE هم از نسخه ی 1.1 پروتوکول HTTP حمایت می کنه.

موفق باشید.

----------


## IranVisual

من توی وب سایتم استفاده کردم ولی صفحه من بهم میریزه بعضی موقع بعضی عکساش لود نمیشه بعد فلشهای کنار treeview هم بهم میریزه البته این مشکلات بعد از Upload فایلها توی سرور اتفاق میفته

----------


## e-shahshahani

من سایتم روی یه هاست هست که iis اون هاست خودش http compression را انجام میده و هیچ مشکلی هم برای سایت های روی اون هاست نیست. فایل های متنی از جمله aspx, html, js, css فشرده می شوند.
در iis یک گزینه هست که این کارو میکنه. http://www.google.com/search?q=http+...ient=firefox-a

موفق باشید.

----------


## chaalesh

آقای راد سلام
من از این روش استفاده کردم و همه چیز OK هست ولی حالا بجای host قبلی از dedicated server  استفاده می کنیم اصلا کار نمیکنه؟؟!!
تنظیمی روی سرور میخواد؟

----------


## Behrouz_Rad

خیر.
اصلا کاری به تنظیمات سرور نداره!

----------


## miladr

من برای فشرده سازی از راه Flanders استفاده کردم.
http://www.codeproject.com/KB/aspnet/HttpCompress.aspx
اما کلا این هم با Ajax مشکل داره.
راه حل آقا بهروزم ExcludedPaths داره مثل Flanders اما نمی دونم کجا باید استفاده کرد و اینکه ایا جواب میده یا نه؟

----------


## IranVisual

وقتی از فشرده ساز شما استفاده میکنم آقای راد نمیتونم از freetextbox استفاده کنم

----------


## explod_javad

آقا بهروز ما آخرش نفهمیدیم که این روش خوبه یا نه !!
یه لطفی کن جم بندی کن 
خوبه یا نه ؟
برای وب پروژه های بزرگ میشه استفاده کرد.

----------


## Behrouz_Rad

بله خوبه. به شرطی که بلد باشید ازش استفاده کنید و تمام این تاپیک رو مطالعه کنید.
من وظیفم رو در قبال این تاپیک انجام دادم و بقیش دست خود شماست که بتونید با هوش، ذکاوت، مطالعه ی کدهای پروژه های Open Source، جستجو ... به مزایا و معایب این روش پی ببرید.

موفق باشید.

----------


## explod_javad

عمل حذف فضاهای خالی (Remove White Space ) به وسیله چند روش قابل پیاده سازی می باشد .

روش RegularExpression  به صورت زیر هست :
  private static readonly Regex REGEX_BETWEEN_TAGS = new Regex(@">\s+<", RegexOptions.Compiled);

    private static readonly Regex REGEX_LINE_BREAKS = new Regex(@"\n\s+", RegexOptions.Compiled);

    protected override void Render(HtmlTextWriter writer)

    {

        using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new System.IO.StringWriter()))

        {

            base.Render(htmlwriter);

            string html = htmlwriter.InnerWriter.ToString();


            html = REGEX_BETWEEN_TAGS.Replace(html, "> <");

            html = REGEX_LINE_BREAKS.Replace(html, string.Empty);


            writer.Write(html.Trim());

        }

    }

این کد هارا می توانید در MasterPage بنویسید تا تمامی صفحاتی که از آن ارث میگیرند شامل شود .

این روش برای کسانی که از روش فشرده سازی هم استفاده می کنند بسیار مفید و کارامد هست .

دقت نمایید که برای استفاده از این روش باید فضا نام System.Text.RegularExpressions را ابتدا ایمپورت نمایید

امتحان کردم یه کمی تأثیر میزاره

----------


## Behrouz_Rad

@explode_javad
کدهایی که گذاشتی متعلق به Mads Kristensen، بنیانگذار BlogEngine.NET هست. منبع رو ذکر کن.
http://www.webdevelopernews.com/webd...ithASPNET.html

موفق باشید.

----------


## explod_javad

ما از یه جای دیگه گرفتیم
ولی حق با شماست باید منبع ذکر بشه . ایشالا دفعه بعد
http://www.how2learnasp.net/article....f-e8d479452ce8

----------

