0

ضرورت مدیریت state در برنامه های وب ASP . NET

 
mohamadaminsh
mohamadaminsh
کاربر طلایی1
تاریخ عضویت : دی 1389 
تعداد پست ها : 25772
محل سکونت : خوزستان

ضرورت مدیریت state در برنامه های وب ASP . NET
چهارشنبه 24 خرداد 1391  6:30 PM

ضرورت مدیریت state در برنامه های وب ASP . NET



یکی از مهمترین تفاوت های موجود بین برنامه های وب و Desktop  ، مدیریت state است که در آن می بایست به این پرسش پاسخ داده شود که نحوه نگهداری اطلاعات در ارتباط با کاربر جاری به چه صورت است ؟
در یک برنامه سنتی ویندوز ، state بطور اتوماتیک مدیریت می گردد . حافظه به حد فراوان یافت می شود و همواره در دسترس است . در برنامه های وب داستان بگونه ای دیگر است . هزاران کاربر ممکن است بطور همزمان برنامه ای مشابه را بر روی کامپیوتری یکسان ( سرویس دهنده وب ) اجراء و هر یک از آنان از طریق پروتکل HTTP ( برگرفته شده از  Hypertext Transfer Protocol) که دارای ماهیتی stateless است با سرویس دهنده وب ارتباط برقرار نمایند . مجموعه شرایط فوق باعث شده است که نتوان برنامه های وب را با سناریوئی دقیقا” مشابه با برنامه های سنتی ویندوز طراحی و پیاده سازی کرد .
هیچگونه فریمورک برنامه نویسی وب ، صرفنظر از میزان پیشرفته بودن آن ، نمی تواند ماهیت stateless بودن پروتکل HTTP را تغییر دهد. پس از هر درخواست و پاسخ به آن ، ارتباط منطقی سرویس گیرنده با سرویس دهنده قطع خواهد شد . معماری فوق ، این اطمینان را ایجاد می نماید که برنامه های وب بتوانند به هزاران کاربر بطور همزمان و بدون نگرانی در خصوص حافظه پاسخ دهند . استفاده از روش های مختلف برای ذخیره اطلاعات بین درخواست های متعدد یک کاربر و بازیابی آنها در زمانی که به آنها نیاز است از جمله مشکلات معماری فوق برای پیاده کنندگان برنامه های وب محسوب می گردد .
آشنائی و درک مناسب نسبت به محدودیت های  state ، یکی از مفاهیم کلیدی در زمان ایجاد برنامه های وب کارآ و قدرتمند است .
در مجموعه مقالاتی که در این خصوص آماده و بتدریج بر روی سایت منتشر خواهد شد به بررسی موارد زیر خواهیم پرداخت :
آشنائی با مفاهیم ، جایگاه و لزوم مدیریت state در برنامه های وب
آشنائی با پتانسیل های ارائه شده در ASP. NET 2.0 برای ذخیره سازی و مدیریت اطلاعات
آشنائی با گزینه های متفاوت موجود به منظور مدیریت state نظیر View state ، Session state ، کوکی های سفارشی
نحوه انتقال اطلاعات از یک صفحه به صفحه دیگر
مدیریت state و مسائل در ارتباط با آن
در یک برنامه سنتی ویندوز ، کاربران با یک برنامه در حال اجراء بطور پیوسته ارتباط برقرار می نمایند . بخشی از حافظه موجود بر روی کامپیوتر Desktop  برای ذخیره  تنظیمات جاری اطلاعات محیط کار کاربر اختصاص داده می شود .
در یک برنامه وب ، داستان کاملا” متفاوت است . شاید از دید کاربران یک سایت حرفه ای اینگونه برداشت شود که یک برنامه بطور مستمر در حال اجراء است و به آنان سرویس های لازم را می دهد . علی رغم این که ظاهر موضوع درست بنظر می آید ولی در پس پرده داستان بگونه ای دیگر دنبال می شود .  برنامه های وب از یک الگوی دستیابی غیرمتصل کارآ استفاده می نمایند . در این الگو ، سرویس گیرنده پس از ارتباط با سرویس دهنده از آن درخواست یک صفحه را می نماید . پس از پاسخ به سرویس گیرنده ،ارتباط منطقی ایجاد شده قطع و سرویس دهنده بی خیال هر گونه اطلاعاتی در رابطه با سرویس گیرنده می گردد . پس از دریافت صفحه درخواستی توسط سرویس گیرنده ، برنامه اجراء خود را متوقف و ASP.NET engine اشیاء مربوط به صفحه را دور می اندازد .
با توجه به این که سرویس گیرندگان لازم است در اکثر موارد صرفا” برای چندین ثانیه متصل باشند ، یک سرویس دهنده وب می تواند به هزاران درخواست با کارآئی مطلوب پاسخ دهد .
در صورتی که لازم است اطلاعات بین چندین عملیات کاربر نگهداری شوند ، می بایست از راهکارهای مختلفی به منظور مدیریت state استفاده کرد .
View state
همانگونه که اطلاع دارید کنترل های سرویس دهنده ASP.NET از view state برای بخاطر سپردن state استفاده می نمایند . اطلاعات view state در یک فیلد مخفی نگهداری شده و بطور اتوماتیک پس از هر postback برای سرویس دهنده ارسال می گردد . view state محدود به کنترل های سرویس دهنده نمی گردد و در صورت ضرورت می توان مجموعه ای از اطلاعات مورد نیاز را مستقیما” در مجموعه view state ذخیره تا امکان بازیابی آنها پس از هر postback فراهم شود . نوع های مختلفی را می توان در view state ذخیره نمود . نوع های داده ساده و اشیاء سفارشی نمونه هائی در این زمینه می باشند .
خصلت ViewState صفحه، مجموعه view state را ارائه می نماید . این خصلت یک نمونه از کلاس مجموعه StateBag است .برای اضافه کردن و حذف آیتم هائی در این کلاس ، از گرامری  مشابه با یک دیکشنری استفاده می گردد  که در آن هر آیتم دارای یک نام منحصر بفرد  است .
کد زیر نحوه استفاده از view state را نشان می دهد .
ViewState(“Counter”) = 1
دستور فوق ، مقدار ۱ را در مجموعه view state قرار داده و به آن یک نام منحصربفرد را نسبت می دهد ( Counter  ) . در صورتی که آیتم دیگری با همین نام در view state موجود نباشد ، یک آیتم جدید بطور اتوماتیک به آن اضافه می گردد . در صورتی که یک آیتم با نام Counter در view state موجود باشد ، با مقدار فوق جایگزین می گردد .
برای بازیابی آیتم های ذخیره شده در view state  از نام نسبت داده شده به هر یک از آنها استفاده می گردد . همچنین ، لازم است که مقدار بازیابی شده را با استفاده از گرامر casting به نوع داده مناسب تبدیل نمود چراکه مجموعه ViewState تمامی آینم ها را به عنوان اشیاء عام ذخیره می نماید تا بتواند با نوع های داده مختلف سرو کار داشته باشد .
کد زیر نحوه بازیابی مقدار نسبت داده شده به Counter از view state  و تبدیل آن به یک عدد صحیح را نشان می دهد .
Dim counter As Integer
counter = CType(ViewState(“Counter”), Integer)
در صورت عدم وجود اطلاعات مورد نظر در view state با یک NullReferenceException مواجه خواهیم شد . بنابراین ، لازم است که همواره قبل از بازیابی و تبدیل داده ذخیره شده در view state از وجود آن در ساختار فوق اطمینان حاصل نمود .
برای آشنائی بیشتر با نحوه بکارگیری view state در برنامه های وب به بررسی یک نمونه مثال کاربردی خواهیم پرداخت .
مثال : ثبت تعداد دفعاتی که بر روی یک دکمه کلیک می گردد
کد زیر یک برنامه ساده شمارنده را نشان می دهد که در آن تعداد دفعاتی که بر روی یک دکمه کلیک می شود تشخیص داده شده و تعداد آن در خروجی نمایش داده می شود . بدون استفاده از یک راهکار مناسب برای مدیریت state ، شمارنده بطور دائم عدد ۱ را در خروجی نشان خواهد داد .
برای ایجاد خروجی مورد نظر ، می بایست از یک راهکار مناسب (view state ) جهت مدیریت state استفاده گردد .
<%@ Page Language=”VB” Culture=”fa-IR” UICulture=”fa-IR” %>
<script runat=”server”>
Sub cmdIncrement_Click(ByVal sender As Object,ByVal e As EventArgs) Handles cmdIncrement.Click
Dim Counter As Integer
If ViewState(“Counter”) Is Nothing Then
Counter = 1
Else
Counter = CType(ViewState(“Counter”), Integer) + 1
End If
ViewState(“Counter”) = Counter
lblCount.Text = “مقدار شمارنده برابر است با : “ & Counter.ToString()
End Sub
</script>
<html xmlns=”http://www.w3.org/1999/xhtml” dir=”rtl” >
<head id=”Head1″ runat=”server”>
<title>تست view state </title>
</head>
<body style=”font-family: Tahoma”>
<form id=”form1″ runat=”server”>
<div>
<asp:Button ID=”cmdIncrement” runat=”server”
Text=”افزایش شمارنده” Font-Names=”Tahoma” /><br /><br />
<asp:Label ID=”lblCount” runat=”server”
Font-Names=”Tahoma”></asp:Label>&nbsp;
</div>
</form>
</body>
</html>
در کد فوق قبل از تلاش برای بازیابی آیتم مورد نظر  از view state ، وجود آن در ساختار فوق بررسی می گردد .  شکل ۱ خروجی برنامه فوق را نشان می دهد .

شکل ۱ : استفاده از view state برای نگهداری مقدار counter
برای حل مسئله مدیریت state در مثال فوق و نگهداری مقدار  counter در بین چندین postback از روش هائی دیگر نیز می توان استفاده کرد . به عنوان مثال ، می توان برای کنترل سرویس دهنده label ویژگی view state را فعال و از label برای ذخیره مقدار counter استفاده نمود . هر مرتبه که بر روی دکمه “افزایش شمارنده ” کلیک گردد ،  مقدار جاری از طریق خصلت text کنترل label بازیابی و پس از تبدیل به یک عدد صحیح در خروجی نمایش داده می شود .
از روش فوق نمی توان همواره به عنوان یک راهکار مناسب استفاده کرد . مثلا” ممکن است قصد ایجاد برنامه ای را داشته باشیم که تعداد دفعاتی را که بر روی یک دکمه کلیک می گردد ثبت نماید ولی قصد نمایش نتایج را در خروجی نداشته باشیم . در چنین مواردی می توان همچنان اطلاعات را در یک کنترل سرویس دهنده ذخیره نمود ولی مجبور خواهیم بود که آن را مخفی نگاه داریم .
پس از انجام تمامی این کارها ، به چیزی می رسیم که view state  آن را در اختیار ما قرار می دهد . view state ، اطلاعات را بطور اتوماتیک در یک فیلد مخفی خاص در صفحه نگهداری می نماید . با توجه به این که ASP. NET با جزئیات این کار سروکار دارد ، کد نوشته شده توسط پیاده کنندگان از خوانائی بیشتری برخوردار خواهد بود .

کریمی که جهان پاینده دارد               تواند حجتی را زنده دارد

 

دانلود پروژه و کارآموزی و کارافرینی

تشکرات از این پست
دسترسی سریع به انجمن ها