فشرده سازی فایلها قبل از ارسال آنها به مرورگر مزایای بسیاری دارد. صفحه سریع تر و باز شده و پهنای باند کمتری مصرف میکند که در نتیجه رضایتمندی کاربر و کاهش هزینه ها را در پی خواهد داشت. پیاده سازیهای متفاوتی از ماژول فشرده سازی HTTP وجود دارد اما برای فشرده سازی WebResource.axd چندان پیاده سازی جالبی به چشم نمیخورد. لذا در این مقاله تصمیم داریم تا یک راه حل مناسب برای فشرده سازی ارائه دهیم
این پیاده سازی 3 بخش دارد. بخش اول فشرده سازی صفحات وب است. برای این بخش از برخی پیاده سازی سازیهایی که قبلا انجام گرفته شده استفاده میکنیم.در این مثال از این فشرده سازی که توسط Flanders پیاده سازی شده است استفاده میکنیم.
بخش دوم ترکیب فایلهای جاوا اسکریپت و css متعدد در یک فایل و فشرده سازی آن است. این تکنیک بدین شرح است که بهتر است تنها یک فایل جاوا اسکریپت و یک فایل css داشته باشیم. به این دلیل که مرورگر نمیتوان این نوع فایلها را به صورت موازی دانلود کند، بنابر این بهتر است آنها را ترکیب کرده و فشرده سازی کنیم.
تصور کنید که به جای داشتن 5 فایل جاوا اسکریپت با حجم 177 کیلوبایت در یک وب سایت، تنها یک فایل 52 کیلو بایتی داشته باشیم. در این مثال ما 5 فایل به این شکل داریم : 2 فایل ScriptResource.axd، 2 فایل WebResource.axd و یک فایل js . این فایلها به صورت عادی 329 کیلوبایت حجم دارند اما زمانی که از این تکنیك برای فشرده سازی استفاده کنیم تنها 89 کیلوبایت حجم خواهند داشت که این یک صرفه جویی عظیم به شمار میرود.
بخش سوم فشرده سازی WebResource.axd است. بیانی مختصر برای فشرده سازی منابع تحت وب. نکته اینجاست که اگر این منبع فشرده سازی شود دیگر قابل فراخوانی توسط بخشهای دیگر برنامه نخواهد بود. برای حل این مشکل، ابتدا درخواست یا فراخوانی انجام شده را بررسی میکنیم تا ببینیم که آیا WebResource.axd است یا خیر. اگر چنین است سپس CompleteRequest را فراخوانی میکنیم تا درخواست انجام شده مستقیما به EndRequest برود. در این حالت هیچ پردازشی بر روی درخواست صورت نگرفته است. آنگاه در EndRequest، درخواست را به شیء CompressWebResource میفرستیم. این کار باعث میشود تا بررسی شود که آیا هیچ Etag ای به درخواست مربوطه اختصاص یافته است یا خیر.اگر چنین باشد درخواست را به هدر ویرایش نشده میفرستد.
سپس بررسی میکنیم که آیا یک فایل روی دیسک کش شده است؟ اگر پاسخ مثبت باشد، فایل کش شده را ارسال میکنیم. در غیر اینصورت یک HttpWebRequest ایجاد کرده و WebResource.axd را درخواست میکنیم.البته عبارت u=1 را به هر query string ارسالی میچسبانیم تا مشخص شود که قرار است این فایل حتما بارگذاری شود. سپس content-type را بررسی میکنیم. اگر نه جاوا اسکریپت بود و نه css ، آن را به مرورگر میفرستیم. البته این کار را پس از آنکه یک Etag به منظور کش شدن در مرورگر اضافه کردیم انجام میدهیم.
چنانچه content-type، جاوا اسکریپت یا css باشد، encoding مورد نظر را گرفته و داده ها را رمزنگاری کرده و بر روی حافظه کش میکنیم.
البته مسلما راههای بهتری نیز برای این کار ممکن است وجود داشته باشد و این راه نیز جای بهبود دارد. نکته این که این پروژه توسط محیط Visual studio 2005 و C# 2.0 نوشته شده است و احتمال دارد در محیط .NET 1.1 جواب ندهد.
Using the code
ابتدا تغییرات کمی در فشرده سازی Flanders انجام داده ایم.همچنین کد زیر را برای این که ماژول مورد نظر بتواند با پانل های به روز شده کار کند به ابتدای متد context_PostReleaseRequestState اضافه کرده ایم.
if (app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
ویرایش فایل Web.config
تنها تغییراتی که در این فایل داده ایم در بخشهای <IncludedMimeTypes>, <IncludedPaths> , <CacheSettings>, and <PathSettings>. هستند
<IncludedMimeTypes> به ماژول فشرده سازی میگوید که چه mime type هایی را باید فشرده سازی کند. شما متیوانید از * برای فشرده سازی کلیه mime type ها با بهره گیری از این ماژول استفاده کنید.
<CacheSettings> برای کش کردن فایلهای جاوا اسکریپت و css به کار میرود که شامل WebResource.axd هم میشوند)
<PathSettings> مکان قرار گرفتن فایلهای جاوا اسکریپت و css را نشان میدهد.
به طور پیش فرض این تنظیمات برقرار هستند:
cacheFiles=false, path=cache, jsPath=javascript, cssPath=css
کد مربوط به فایل web.config را ملاحظه میکنید :
<configSections>
<sectionGroup name="DCWeb">
<section name="HttpCompress" type="DC.Web.HttpCompress.Configuration,
DC.Web.HttpCompress"/>
</sectionGroup>
</configSections>
<DCWeb>
<HttpCompress compressionType="GZip">
<CacheSettings cacheFiles="true" path="cache"/>
<PathSettings jsPath="javascript" cssPath="css" />
<IncludedMimeTypes>
<add mime="text/html" />
</IncludedMimeTypes>
<!--<ExcludedMimeTypes>
<add mime="text/html" />
</ExcludedMimeTypes>-->
<ExcludedPaths>
<add path="~/NoCompress/Default.aspx" />
</ExcludedPaths>
</HttpCompress>
</DCWeb>
<!-- The js.axd and css.axd must be enabled to allow javascript and css
compression -->
<httpHandlers>
<add verb="*" path="js.axd,css.axd"
type="DC.Web.HttpCompress.CompressionHandler,DC.Web.HttpCompress"/>
</httpHandlers>
<!-- The compression module must be enabled for the WebResource.axd to be
compressed -->
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
<add name="HttpCompressModule"
type="DC.Web.HttpCompress.HttpModule,DC.Web.HttpCompress"/>
</httpModules>
برای ضمیمه کرده فایلهای جاوا اسکریپت و css این کار را انجام میدهیم
<script type="text/javascript" src="js.axd?files=*" ></script>
<link href="~/css/css.axd?files=StyleSheet.css,StyleSheet2.css"
rel="stylesheet" type="text/css" />
فایل js.axd با httpHander در فایل web.config مطابقت دارد و منظور آن این است که نوع فایل جاوا اسکریپت است. همین موضوع برای فایل css هم برقرار است. همانگونه که میبنید لیستی ار فایلها که با , از همدیگر جدا شده اند در خطوط کد بالا آورده شده اند. منظور از این کد این است که این فایلها میبایست ضمیمه شوند. چنانچه از عبارتی مثل js.axd?files=* استفاده کنیم، همه فایهای موجود در پوشه جاوا اسکریپت ضمیمه میشوند. نکته این که این کار باعث ضمیمه شدن فایلهای در زیر پوشه ها نمیشود.
همچنین دقت داشته باشید که از ~/css/ برای مشخص کردن css استفاده کرده ایم. این به خاطر آن است که اگر از داخل فایل css به تصاویر ارجاعی داشتیم مشکلی پیش نیاید.
کش کردن فایلها
فایل ترکیب شده فایلهای جاوا اسکریپت و css و WebResource.axd میتواند بر روی دیسک کش شود تا دیگر نیازی به این که هر بار این فایلها ترکیب شده و کش شوند نداشته باشیم. پوشهاي که قرار است فایل کش شده را داخل آن قرار دهیم میبایست توسط asp.net قابل نوشتن باشد.
منبع : codeproject.com