۱- مقدمه ای بر
Caching در ASP.NET
•
Caching
عبارت است از قرار دادن حاصل اجرای يک صفحه در يک حافظه سريع جهت دسترسی سريع و
استفاده مجدد از آن در ارجاعات بعدی.
•
Caching
مهمترين فاکتور در ايجاد يک برنامه تحت وب با توانائی و کارائی بالا می باشد.
• محل های
Caching
عبارتند از Web server,
proxy server
و client browsers.
• انواع
Caching
عبارتند:
Output caching
Fragment caching
Data caching
۲-
Output Caching
Output Caching
چيست؟
• صفحاتی که از
Output Caching
استفاده می کنند برای بار اول اجرا می شوند و سپس حاصل آن
cache
می گردد. جهت پاسخگوئی به درخواستهای بعدی برای همين صفحه، از نسخه
cache
شده استفاده می گردد.
• فوايد Output Caching
در کاهش محسوس زمان پاسخ دهی سرور و کاهش بار اضافی بر روی
CPU
در سرور می باشد.
• استفاده صحيح از
Output Caching
سرعت و کارائی سايت را بطور محسوسی افزايش می دهد.
• از
Output Caching
می توان در فايل های با پسوند asmx.
،.aspx
و ascx.
استفاده نمود.
• با استفاده از دايرکتيو
OutputCache @ در بالای فايلهای
فوق بصورت زير می توان Output
Caching را فعال کرد:
<%@ OutputCache Duration="600" Location="Any" VaryByParm="none" %>
• يا از درون
برنامه بصورت زير هم می توان اين کار را انجام داد:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(600));
Response.Cache.SetCacheability(HttpCacheability.Public);
صفات
OutputCaching
•
Duration:
مدت زمان معتبر بودن
cache
را مشخص می کند. مقداردهی اين صفت الزامی است و مقدار آن بر اساس
ثانيه است.
• Location:
محل قرار گرفتن
cache را مشخص
می کند.
در حالت Server
صفحه cache
شده در حافظه سرور نگهداری می شود.
در حالت
Downstream صفحه
cache
شده بر روی proxy
server
نگهداری می گردد.
در حالت
Client صفحه
cache
شده بر روی مرورگر کاربر قرار می گيرد.
در حالت Any
صفحه cache
شده بر روی هر يک از موارد فوق می تواند قرار گيرد.
در حالت None
صفحه مربوطه عملا در هيچ کجا
cache
نخواهد شد.
• VaryByParam:
نسخه های cache
متفاوتی از صفحه مورد نظر براساس پارامترهای موجود در
QueryString
و Form
يا ترکيبی از آنها ايجاد می گردد.
<%@ OutputCache Duration="10" VaryByParam="location;count" %>
•
VaryByHeader:
نسخه های cache
متفاوتی براساس مقادير مختلف پارامتر تعيين شده در
HTTP header
ايجاد می گردد.
<%@ OutputCache Duration="60" VaryByHeader="Accept-Language" %>
•
VaryByCustom:
اگر مقدار اين صفت کلمه خاص "Browser"
باشد، cache
مورد نظر براساس نوع و نسخه اصلی مرورگرايجاد خواهد شد. اگر مقدار
آن يک رشته دلخواه باشد، آنگاه لازم است که شما متد
HttpApplication.GetVaryByCustomString
را در فايل
Global.asax را
بگونه دلخواه بازنويسی کنيد.
۳-
Fragment Caching
• علاوه بر
اينکه شما می توانيد تمام يک صفحه را
cache
کنيد، شما حتی می توانيد بخشی از يک صفحه را
cache
کنيد. به اين عمل
Fragment Caching
گويند.
• بدين منظور لازم است که شما بخش های مورد نظر را بصورت
User Control
يا کنترل کاربری ايجاد کرده باشيد.
• هر کنترل کاربری دايرکتيو
OutputCache@
مخصوص به خود را دارا می باشد.
• صفات مورد استفاده در اينجا عبارتند از
VaryByParam
و VaryByControl.
• امکان تعيين محل
cache با
استفاده از صفت
Location مقدور
نمی باشد و محل
cache همواره بر
روی سرور در نظر گرفته می شود.
• VaryByControl:
ششمين صفت موجود در دايرکتيو
Outputcache@
می باشد. تنها می توان در کنترلهای کاربری از آن استفاده کرد.
استفاده از آن سبب می شود تا
cacheهای
متعددی براساس خواص (properties)
کنترل کاربری ايجاد گردد.
جواب این پرسش را تایپ جدید
BigInteger داده است. اگر در برنامه فوق نوع متغیر res را به
BigInteger تغییر دهیم می توان فاکتوریل اعداد بزرگتری را محاسبه
کرد.
البته ذکر این نکته نیز مهم است که
استفاده از BigInteger سرعت برنامه را کمی کاهش می دهد. پس باید در
استفاده از این تایپ جدید جوانب احتیاط را در نظر گرفته و تنها در
صورت نیاز مبرم از BigInteger استفاده کنیم.
<%@ Language="C#" %>
<%@ OutputCache Duration="10" VaryByControl="State;Country" VaryByParam="*"%>
<script runat=server>
public String State {
get { return state.Value; }
set { state.Value = State; } }
public String Country {
get { return country.Value; }
set { country.Value = Country; } }
</script>
• می توان بصورت تودرتو
از کنترلهای کاربری با قابليت
cache
استفاده نمود. در اين صورت يک
cache
سلسله مراتبی بسيار قدرتمند خواهيم داشت. اين مساله اگر چه نياز به
هيچ نوع برنامه نويسی خاصی ندارد اما می تواند سبب مصرف حافظه
زيادی گردد.
• سعی نکنيد بصورت برنامه ای به يک کنترل کاربری موجود در
cache
دسترسی داشته باشيد. در غير اين صورت شما با يک
exception
برخورد خواهيد کرد. زيرا اين نوع کنترلها در درخت کنترلهای موجود
قرار نمی گيرند.
۴- Data Caching
• با استفاده از
data cache
می توان داده های برنامه مانند رشته ها،
DataSetها
و ساير اقلام داده و آبجکت را بصورت زير
cache
کرد:
Cache ("counter") = mycount.text
• اگرچه اين مساله
مانند استفاده از متغيرهای از نوع
Application
است، اما بسيار قوی تر و کارآمدتر می باشد.
• هر قسمت از برنامه که از داده های موجود در
cache
استفاده می کند، بايد قادر باشد تا در صورت غيرمعتبر بودن
cache،
بتواند آن را دوباره بسازد.
Public Function GetProductData() As DataSet
If (IsNothing(Cache("ProductData")) Then
Cache("ProductData") = LoadDataSet()
End If
Return Cache("ProductData")
End Function
• توصيه می شود
جهت استفاده از
cache همواره از
مدل فوق استفاده نمائيد.
• جهت داشتن کنترل بيشتر بر
cache
يا استفاده از امکانات پيشرفته آن از متدهای
Cache.Insert
و Cache.Add
استفاده نمائيد.
• با استفاده از متد
Cache.Remove
می توانيد داده مورد نظر را از
cache
حذف نمائيد.