|
عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
|
افزايش كارآئی برنامه های وب در ASP.NET 2.0 (بخش پنجم) |
مديريت وب |
4107 |
3 |
4.7 |
افزايش كارآيی برنامه های وب در ASP.NET 2.0
افزايش كارآئی برنامه های وب در ASP.NET 2.0
(بخش پنجم)
آنچه تاكنون گفته شده است :
-
بخش
های
اول و
دوم
: اشاره به مجموعه ای از نكات كه رعايت آنها در زمان طراحی می تواند زمينه پياده
سازی يك برنامه وب كارآ را فراهم نمايد .
-
بخش
سوم
: معرفی برخی ابزارها برای تست برنامه های وب
-
بخش
چهارم :
مفاهيم اوليه caching ، روش های
caching در ASP.NET ، نحوه استفاده از
output caching
در اين بخش
بحث خود را در ارتباط با output caching ادامه
داده و بر روی Caching و Query string متمركز خواهيم شد.
Caching و
Query string
يكی از نكات مهم در خصوص caching ، تصميم در
خصوص زمان
استفاده مجدد از صفحه و صحت اطلاعات است . اغلب پياده كنندگان تمايل زيادی
در ارائه اطلاعات به صورت بلادرنگ دارند و كمتر در انديشه استفاده بهينه از سيستم
caching می باشند . پياده كنندگان می توانند بدون نگرانی
در موارد متعددی از caching استفاده نمايند تا كارآئی
برنامه های وب را افزايش دهند .
در مواردی كه اطلاعات به صورت پويا توليد می گردد وضعيت caching
و يا استراتژی ايجاد و بكارگيری مجدد آن تا اندازه ای متفاوت
خواهد بود . به عنوان نمونه
، در صورتی كه در صفحه ای از session كاربر جاری استفاده
می شود تا بر اساس آن رابط كاربر سازماندهی گردد ، caching
تمام صفحه مناسب نخواهد بود چراكه
يك صفحه مشابه نمی تواند برای ساير كاربران مفيد و
قابل استفاده مجدد باشد . يك نمونه ديگر ، صفحه ای است كه اطلاعات دريافتی خود را
از يك صفحه ديگر و از طريق query string دريافت می نمايد . در چنين مواردی
صفحه به صورت پويا ايجاد و برای caching
آن می بايست از راهكارهائی ديگر استفاده
گردد.
در مثال اشاره شده در بخش
چهارم
به خصلت VaryByParam دايركتيو OutputCache
، مقدار
None نسبت داده شده بود . بدين ترتيب به
ASP. NET
اعلام شده است كه صرفا" يك نسخه از صفحه
را cache نمايد تا بتوان از آن در تمامی حالات
استفاده مجدد نمود . در چنين مواردی اگر درخواست صفحه به همراه اضافه كردن آرگومان
های query string به
URL باشد ، صرفا" از همان يك نسخه
cache شده بدون توجه به مقدار آرگومان های دريافتی استفاده
می گردد ( تا
زمانی كه تاريخ مصرف نسخه cache شده به اتمام نرسيده
باشد ) . شما می توانيد اين موضوع را با اضافه كردن يك
آرگومان
query string بطور دستی در مرورگر انجام دهيد . مثلا"
سعی كنيد صفحه را با
افزودن a=b ? در
انتهای URL اجراء
نمائيد. مشاهده خواهيد كرد كه خروجی
cache شده همچنان يكسان خواهد بود .
با توجه به نتايج فوق ممكن است اينگونه
برداشت شود كه
output caching برای صفحه ای كه از آرگومان های query
string استفاده می نمايد ، مناسب
نباشد . در اين رابطه
ASP.NET يك راه حل ديگر را ارائه نموده است . در چنين مواردی می
توان خصلت VaryByParam را
"*" در نظر گرفت تا مشخص گردد كه صفحه از
query string استفاده می نمايد و به
ASP.NET اعلام گردد كه نسخه های cache مجزاء را
برای مقادير مختلف آرگومان query string ذخيره نمايد .
|
<%@ OutputCache Duration="20"
VaryByParam="*" %> |
بدين ترتيب زمانی كه
صفحه به همراه اطلاعات query string
درخواست شود ،
در ابتدا ASP.NET مقدار query string
را بررسی می نمايد . در صورتی كه رشته دريافتی با درخواست قبلی مطابقت نمايد و يك
نسخه cache شده از صفحه موجود باشد ، از آن استفاده
خواهد كرد . در غير اينصورت يك نسخه جديد از صفحه ايجاد و بطور جداگانه
cache می گردد .
برای آشنائی بهتر با نحوه عملكرد فرآيند فوق ، فرض كنيد مجموعه ای از درخواست ها به
ترتيب زير دريافت
گردد:
-
كاربری صفحه ای را بدون
پارامتر query string درخواست
و نسخه A صفحه را دريافت می
نمايد .
-
كاربری صفحه را با
پارامتر ProductID=1 درخواست و نسخه B
صفحه را دريافت می نمايد .
-
كاربر ديگر صفحه را با
پارامتر ProductID=2 درخواست و نسخه
C صفحه را دريافت می نمايد .
-
كاربر ديگر صفحه را با
پارامتر ProductID=1 درخواست می
نمايد . در صورتی كه
تاريخ اعتبار نسخه B كه قبلا"
cache شده است به اتمام نرسيده باشد ،
اين نسخه برای
وی ارسال می گردد.
-
كاربر ديگر صفحه را
بدون پارامتر درخواست می نمايد
. در صورتی كه تاريخ اعتبار نسخه
A كه قبلا"
cache شده است به اتمام نرسيده باشد ،
اين نسخه برای
وی ارسال می گردد.
برای تست فوق و دريافت نتايج بهتر می توان مدت زمان اعتبار نسخه
cache شده را زياد كرد .
در
صورتی كه صفحه ای صرفا" در
ارتباط با داده سمت سرويس دهنده ( نظير داده موجود در يك بانك اطلاعاتی )
و يا داده موجود در query string باشد ،
بدون نگرانی می توان از
روش output caching استفاده
كرد .
در صورتی كه خروجی صفحه وابسته به اطلاعات خاص و مرتبط با كاربر نظير داده
session و يا كوكی باشد ، از روش
output caching نمی توان استفاده نمود چراكه مكانيزمی وجود ندارد كه بر اساس
آن بتوان تفاوت caching را بر اساس
session و يا كوكی تشخيص داد. output caching همچنين با صفحات پويائی كه محتويات
خود را در پاسخ به رويدادهای مرتبط با كنترل ها تغيير می دهند كار نمی كند . در
چنين مواردی ، می توان از fragment caching برای caching
يك بخش خاص از صفحه و يا از data caching
برای caching اطلاعات خاص
استفاده كرد.
caching با پارامترهائی خاص
بندرت مقدار VaryByParam معادل "*" در
نظر گرفته می شود و در اكثر موارد بهتر است كه يك متغير query string مهم را با نام
مشخص كرد . كد زير نحوه انجام اين كار را
نشان می دهد.
|
<%@ OutputCache Duration="20"
VaryByParam="ProductID" %> |
در چنين مواردی ،
ASP.NET مقدار query string
را بررسی و به دنبال پارامتر ProductID می گردد .
درخواست هائی با پارامترهای مختلف ProductID بطور
جداگانه cache و
از ساير پارامترها
صرفنظر خواهد شد .
در صورت لزوم می توان چندين پارامتر را كه توسط semicolon
از يكديگر جدا شده اند
به خصلت VaryByParam نسبت داد . كد زير نحوه انجام اين كار را نشان می دهد
.
|
<%@ 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" %>
<Script Runat="Server">
Protected Sub AnyButton_Click(ByVal sender As Object,ByVal e As
System.EventArgs )
Response.Redirect("QueryStringRecipient.aspx" &"?Version=" &
CType(sender, Control).ID)
End Sub
</Script>
<html dir="rtl">
<head >
<title>Caching Test</title>
</head>
<body style="font-family: Tahoma;">
<form id="form1" runat="server">
<div>
<asp:Button ID="cmd1" runat="server" Text="نسخه شماره
يك"
OnClick="AnyButton_Click" Width="133px" Font-Names="Tahoma" />
<br /><br />
<asp:Button ID="cmd2" runat="server" Text="نسخه شماره
دو"
OnClick="AnyButton_Click" Width="133px" Font-Names="Tahoma" />
<br /><br />
<asp:Button ID="cmd3" runat="server" Text="نسخه شماره سه"
OnClick="AnyButton_Click" Width="133px" Font-Names="Tahoma" />
</div>
</form>
</body>
</html> |
يك
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" %>
<Script Runat="Server">
Sub page_load ( )
lblDate.Text = "زمان و تاريخ جاری:<br />" & DateTime.Now.ToString()
Select Case Request.QueryString("Version")
Case "cmd1"
lblDate.Font.Size = FontUnit.XLarge
Case "cmd2"
lblDate.Font.Size = FontUnit.Large
Case "cmd3"
lblDate.Font.Size = FontUnit.Small
End Select
End Sub
</Script >
<html dir="rtl">
<head id="Head1" runat="server">
<title>Cache test</title>
</head>
<body style="font-family: Tahoma;">
<form id="form1" runat="server">
<div>
<asp:Label id="lblDate"
runat="server" Font-Size="X-Large" Font-Bold="True"
EnableViewState="False"></asp:Label>
</div>
</form>
</body>
</html> |
بدين ترتيب سه
خروجی جداگانه Html ايجاد
و با توجه به مدت زمان مشخص شده توسط خصلت
Duration دايركتيو OutputCache جهت استفاده
آتی cache می گردند .
در مثال فوق برای تشخيص تفاوت بين سه نسخه متفاوت صرفا" اندازه فونت تغيير داده شده
است . خروجی برنامه فوق در شكل 2 نشان داده شده است .

شكل 2 : ايجاد سه نسخه
cache جداگانه با توجه به مقدار پارامتر
Version
در بخش
ششم به بررسی ساير
روش های موجود برای output caching خواهيم پرداخت .