را نشان مي دهد .
%@ OutputCache Duration=”20″ VaryByParam=”ProductID;CurrencyType” %
در چنين مواردي ، ASP.NET نسخه هائي جداگانه از صفحه را با توجه به مقادير متفاوت ارائه شده توسط ProductID و CurrencyType در cache نگهداري خواهد كرد . مثال : Caching چندين نسخه جداگانه از يك صفحه
در اين مثال از دو صفحه براي نشان دادن نحوه caching چندين نسخه جداگانه از يك صفحه وب استفاده شده است . اولين صفحه با نام QueryStringSender.aspx كه خود cache نمي گردد و در آن سه دكمه مطابق شكل 1 ارائه مي گردد :

شكل 1 : ايجاد سه دكمه براي تست caching چندين نسخه جداگانه از يك صفحه بر اساس مقدار پارامتر Version
صفحه QueryStringSender.aspx
%@ Page Language=”VB” Culture=”fa-IR” UICulture=”fa-IR” %



Caching Test



يك event handler ( با نام AnyButton_Click ) پس از كليك بر روي هر يك از سه دكمه موجود در صفحه فعال مي گردد . در روتين فوق پس از تشخيص اين كه بر روي كدام دكمه ( cmd2 ، cmd1 و cmd3 ) كليك شده است ، مقدار آن استخراج و به پارامتر Version نسبت داده مي شود و در نهايت كاربر به صفحه QueryStringRecipient.aspx هدايت مي گردد .
صفحه مقصد ( QueryStringRecipient.aspx ) يك پيام را متناسب با مقدار پارامتر Version در خروجي نمايش مي دهد . در صفحه فوق مقدار خصلت VaryByParam دايركتيو OutputCache معادل Version در نظر گرفته شده است.
(صفحه فوق به دنبال يك پارامتر query string با نام Version جهت ايجاد نسخه هاي جداگانه cache مي گردد ) .
%@ OutputCache Duration=”20″ VaryByParam=”Version” %
در صفحه QueryStringRecipient.aspx با توجه به مقدار پارامتر Version ، تاريخ و زمان جاري بر اساس يك فرمت خاص در خروجي نمايش و يك نسخه از آن نيز cache مي گردد .
صفحه QueryStringRecipient.aspx
%@ Page Language=”VB” Culture=”fa-IR” UICulture=”fa-IR” %
%@ OutputCache Duration=”30″ VaryByParam=”Version” %



Cache test



بدين ترتيب سه خروجي جداگانه Html ايجاد و با توجه به مدت زمان مشخص شده توسط خصلت Duration دايركتيو OutputCache جهت استفاده آتي cache مي گردند .
در مثال فوق براي تشخيص تفاوت بين سه نسخه متفاوت صرفا” اندازه فونت تغيير داده شده است . خروجي برنامه فوق در شكل 2 نشان داده شده است .

شكل 2 : ايجاد سه نسخه cache جداگانه با توجه به مقدار پارامتر Version
در بخش ششم به بررسي ساير روش هاي موجود براي output caching خواهيم پرداخت .
افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 (بخش ششم)
آنچه تاكنون گفته شده است :
بخش هاي اول و دوم : اشاره به مجموعه اي از نكات كه رعايت آنها در زمان طراحي مي تواند زمينه پياده سازي يك برنامه وب كارآ را فراهم نمايد .
بخش سوم : معرفي برخي ابزارها براي تست برنامه هاي وب
بخش چهارم : مفاهيم اوليه caching ، روش هاي caching در ASP.NET ، نحوه استفاده از output caching
بخش پنجم : Caching و Query string
در اين بخش بحث خود را در ارتباط با output caching ادامه داده و بر روي Custom Caching Control متمركز خواهيم شد.
Custom Caching Control
براي ذخيره چندين نسخه cache از يك صفحه تنها گزينه موجود استفاده از پارامترهاي query string نمي باشد . ASP.NET به پياده كنندگان برنامه هاي وب امكان ايجاد رويه هائي سفارشي را مي دهد كه به كمك آنها مي توان در خصوص caching يك نسخه جديد از يك صفحه و يا استفاده از نسخه موجود تصميم گيري كرد .
كد نوشته شده در هر يك از رويه هاي فوق مناسب بودن اطلاعات را بررسي و يك رشته را برمي گرداند . در ادامه ، ASP.NET از رشته فوق براي پياده سازي caching استفاده مي نمايد. در صورتي كه كد مورد نظر رشته مشابهي را براي درخواست هاي مختلف توليد نمايد ، ASP.NET از نسخه cache شده صفحه استفاده خواهد كرد و در صورتي كه كد فوق يك مقدار جديد را توليد نمايد ، ASP.NET يك نسخه جديد cache را ايجاد و آن را بطور جداگانه ذخيره مي نمايد .
به عنوان نمونه فرض كنيد قصد داريم نسخه هاي مختلفي از يك صفحه را بر اساس نوع مرورگر cache نمائيم . بدين منظور در ابتدا از دايركتيو OutputCache در ابتداي صفحاتي كه قصد caching آنها را داريم استفاده كرده و در ادامه از خصلت VaryByCustom براي مشخص كردن يك نام كه نوع caching سفارشي را مشخص مي نمايد ، استفاده مي نمائيم .
با توجه به اين كه قصد داريم صفحات بر اساس مرورگر كاربران cache نمائيم ، در نمونه كد زير از نام Browser استفاده شده است .
%@ OutputCache Duration=”10″ VaryByParam=”None” VaryByCustom=”Browser” %
در ادامه نياز داريم رويه اي را كه رشته سفارشي caching را توليد مي نمايد ، ايجاد نمائيم . رويه فوق مي بايست در فايل پيكربندي global.asax و يا فايل code-behind مربوطه باشد .
كد زير نحوه انجام اين كار را نشان مي دهد .
رويه اي براي ايجاد سفارشي چندين نسخه cache از يك صفحه
Function GetVaryByCustomString(ByVal context As HttpContext, ByVal arg As String) As String

If arg = “Browser”
Dim BrowserName As String
BrowserName = Context.Request.Browser.Browser
Return BrowserName
Else
Return MyBase.GetVaryByCustomString(context, arg)
End If
End Function

تابع GetVaryByCustomString يك رشته با مقدار VaryByCustom را از طريق پارامتر arg دريافت مي نمايد . بدين ترتيب مي توان برنامه اي را پياده سازي نمود كه چندين نوع از caching سفارشي را صرفا” در يك تابع مشابه پياده سازي نمايد . هر نوع از يك نام VaryByCustom مختلف استفاده مي نمايد ( نظير Browser ، BrowserVersion و يا DayOfWeek ) . تابع فوق مقدار VaryByCustom را از طريق آرگومان arg مشاهده و رشته caching مناسب را برمي گرداند . در صورتي كه رشته هاي caching براي درخواست هاي مختلف مطابقت نمايد ، ASP.NET از نسخه cache شده صفحه استفاده مي نمايد. در غير اينصورت ASP.NET براي هر رشته caching يك نسخه جداگانه را ايجاد ، ذخيره و cache مي نمايد .
دايركتيو OutputCache داراي يك خصلت سوم است كه از آن براي تعريف caching استفاده مي گردد . خصلت فوق كه VaryByHeader نام دارد ، به شما اجازه مي دهد كه نسخه هائي جداگانه از يك صفحه را بر اساس مقدار دريافتي يك HTTP header ذخيره نمائيد . در اين رابطه مي توان صرفا” يك header و يا مجموعه اي header كه توسط semicolon از يكديگر جدا شده اند را مشخص نمود . سايت هاي چند زباني مي توانند از روش فوق براي caching چندين نسخه از يك صفحه بر اساس زبان مرورگر سرويس گيرنده استفاده نمايند .
كد زير نحوه استفاده از خصلت VaryByHeader را نشان مي دهد .
%@ OutputCache Duration=”20″ VaryByParam=”None” VaryByHeader=”Accept-Language” %
Fragment Caching
در برخي موارد ممكن است نتوان تمامي يك صفحه را cache نمود ولي همچنان اصرار داريم كه بخشي از صفحه را كه بندرت تغيير مي يابد ( نظير ليست كالاهاي موجود ) و هزينه زيادي صرف ايجاد آن شده است را cache نمائيم . در چنين مواردي مي توان از روش هاي متعددي نظير data caching ( در بخش بعد اين پرو‍ژه با روش استفاده از آنها آشنا خواهيم شد ) و fragment Caching استفاده كرد .
براي پياده سازي fragment Caching مي بايست براي بخشي از صفحه كه قصد caching آن را داريم يك كنترل كاربر را ايجاد و دايركتيو OutputCache را به آن اضافه كرد . بدين ترتيب علي رغم اين كه صفحه cache نخواهد شد ولي كنترل كاربر cache مي گردد .
fragment Caching از لحاظ مفهومي مشابه caching يك صفحه است و صرفا” داراي يك تفاوت اساسي است . در صورتي كه صفحه يك نسخه cache شده از يك كنترل كاربر را بازيابي نمايد ، نمي تواند با آن و از طريق كد ارتباط برقرار نمايد . به عنوان نمونه در صورتي كه كنترل كاربر خصلت هائي خاص را ارائه مي نمايد ، صفحه وب مورد نظر نمي تواند به اين خصلت ها دستيابي و آنها را تغيير دهد . توجه داشته باشيد ، زماني كه از يك نسخه cache شده كنترل كاربر استفاده مي گردد ، يك بلاك از تگ هاي Html درون صفحه قرار خواهند گرفت و در عمل شي كنترل كاربر در دسترس نخواهد بود .
Cache Profiles
يكي از مسائل در ارتباط با output caching قرار دادن كد درون صفحه است ( در بخش aspx markup . و يا در بخش كد كلاس ) . با اين كه استفاده و پيكربندي خصلت هاي مرتبط با دايركتيو OutputCache در صفحات وب ساده تر بنظر مي آيد ولي اين روش مي تواند مسائل مديريتي و پشتيباني مختص به خود را نيز به دنبال داشته باشد (خصوصا” اگر ده ها صفحه cache شده ايجاد شده باشد ) . به عنوان نمونه در صورتي كه قصد داشته باشيم تغييراتي را در خصوص caching تمامي صفحات فوق انجام دهيم ( مثلا” تغيير مدت زمان caching از 30 ثانيه به 60 ثانيه ) ، مي بايست هر صفحه بطور جداگانه تغيير و در ادامه نيز توسط ASP.NET مجددا” ترجمه گردند .
در ASP.NET 2.0 با معرفي يك راهكار جديد اين امكان در اختيار پياده كنندگان گذاشته شده است تا بتوانند از تنظيمات caching مشابه براي گروهي از صفحات استفاده نمايند . به ويژگي فوق cache profile مي گويند و به كمك آن مي توان تنظيمات caching را در يك فايل web.config تعريف نمود . بدين ترتيب ، اعمال تغييرات صرفا” از طريق يك نقطه فراهم مي گردد . براي تعريف يك Cache Profile ، از تگ در بخش فايل web.config استفاده مي گردد . به cache profile ايجاد شده يك نام و مدت زمان مناسب نسبت داده مي شود . كد زير نحوه انجام اين كار را نشان مي دهد .
تعريف يك cache profile در فايل web.config












در ادامه مي توان از پروفايل فوق به كمك خصلت CacheProfile در يك صفحه استفاده نمود .
%@ OutputCache CacheProfile=”ProductItemCacheProfile” VaryByParam=”None” %
در صورتي كه بخواهيم ساير جزئيات caching نظير VaryByParam را نيز مشخص نمائيم مي توان آن را به عنوان يك خصلت در دايركتيو OutputCache و يا تگ در پروفايل مشخص نمود .
Output Caching در يك سرويس وب
از Output Caching مي توان براي متدهاي جداگانه در يك سرويس وب نيز استفاده كرد . براي انجام اين كار ، لازم است كه مقدار CacheDuration به WebMethod و قبل از تعريف متد اضافه گردد . كد زير نتايج يك متد وب را به مدت 30 ثانيه cache مي نمايد .
_
Public Function MyMethod(ByVal myParameter As Integer) As String

End Function
با توجه به اتمام بحث Output caching و روش هاي مختلف بكارگيري آن در برنامه هاي و

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