ASP.NET2005
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

state managementدرasp.net(بخش نهم ودهم)

اذهب الى الأسفل

state managementدرasp.net(بخش نهم ودهم) Empty state managementدرasp.net(بخش نهم ودهم)

پست  asie ahmadi الإثنين نوفمبر 23, 2009 3:10 pm

State Management در ASP. NET 2.0 (بخش نهم)


مثال
در اين مثال هدف آشنائی با نحوه ذخيره و بازيابی داده در session است . بدين منظور يك شی با نام Articles و شامل سه فيلد عمومی به شرح زير تعريف شده است :

*

Title : عنوان يك مقاله را در خود ذخيره می نمايد .
*

Abstract : شرح مختصری از مقاله را در خود ذخيره می نمايد .
*

ViewCount : تعداد دفعات مشاهده يك مقاله را مشخص می نمايد .

شی فوق از يك constructor خاص استفاده می نمايد تا فرآيند ايجاد و مقداردهی آن به سادگی انجام شود .
Public Class Articles

Public Title As String
Public Abstract As String
Public ViewCount As Integer

Public Sub New(ByVal Title As String, ByVal Abstract As String, ByVal ViewCount As Integer)
Me.Title = Title
Me.Abstract = Abstract
Me.ViewCount = ViewCount
End Sub

End Class

اشياء Articles در زمان استقرار صفحه در حافظه ايجاد و در session state ذخيره می گردند . در ادامه و پس از انتخاب يك آيتم توسط كاربر از طريق ليست موجود ، شی مرتبط با آيتم انتخاب شده از session بازيابی و اطلاعات مرتبط با آن در خروجی نمايش داده می شود .

صفحه SessionStateExample.aspx

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">

Public Class Articles
Public Title As String
Public Abstract As String
Public ViewCount As Integer
Public Sub New(ByVal Title As String, ByVal Abstract As String, ByVal ViewCount As Integer)
Me.Title = Title
Me.Abstract = Abstract
Me.ViewCount = ViewCount
End Sub
End Class

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
If Me.IsPostBack = False Then

مرحله اول : ايجاد اشياء '

Dim ArticleInfo1 As New Articles("State Management در ASP. NET 2.0 (بخش هشتم) ", _
" بررسی Session State ", 43)
Dim ArticleInfo2 As New Articles("State Management در ASP. NET 2.0 (بخش هفتم) ", _
" كوكی های سفارشی و نحوه عملكرد آنها", 94)
Dim ArticleInfo3 As New Articles("State Management در ASP. NET 2.0 (بخش ششم) ", _
" نحوه انتقال اطلاعات بين صفحات با استفاده از Query String", 103)
Dim ArticleInfo4 As New Articles(" State Management در ASP. NET 2.0 (بخش پنجم) ", _
" نحوه دريافت اطلاعات از صفحه مبداء در cross-page posting", 99)

مرحله دوم : اضافه كردن اشياء به session state '

Session("Article1") = ArticleInfo1
Session("Article2") = ArticleInfo2
Session("Article3") = ArticleInfo3
Session("Article4") = ArticleInfo4

مرحله سوم :‌ اضافه كردن سطر به ليست '

lstItems.Items.Clear()
lstItems.Items.Add(ArticleInfo1.Title)
lstItems.Items.Add(ArticleInfo2.Title)
lstItems.Items.Add(ArticleInfo3.Title)
lstItems.Items.Add(ArticleInfo4.Title)

End If

نمايش برخی اطلاعات پايه در رابطه با session '
جهت بررسی اطلاعات پيكربندی '

Dim strCookieLess As String
Dim strNewSession As String

If Session.IsCookieless Then
strCookieLess = "بلی"
Else
strCookieLess = "خير"
End If

If Session.IsNewSession Then
strNewSession = "بلی"
Else
strNewSession = "خير"
End If

lblSession.Text = "شناسه : " & Session.SessionID
lblSession.Text &= "<br>تعداد اشياء : "
lblSession.Text &= Session.Count.ToString()
lblSession.Text &= "<br>مد : " & Session.Mode.ToString()
lblSession.Text &= "<br>آيا session ايجاد شده Cookieless است؟ "
lblSession.Text &= strCookieLess
lblSession.Text &= "<br> آيا session جديد است ؟ "
lblSession.Text &= strNewSession
lblSession.Text &= "<br> اعتبار session (بر حسب دقيقه ) : "
lblSession.Text &= Session.Timeout.ToString()
End Sub

Protected Sub cmdMoreInfo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdMoreInfo.Click
If lstItems.SelectedIndex = -1 Then
lblRecord.Text = "آيتمی انتخاب نشده است"
Else

مرحله اول :ايجاد نام كليد صحيح بر اساس ايندكس '

Dim Key As String
Key = "Article" & (lstItems.SelectedIndex + 1).ToString()

مرحله دوم : بازيابی اشياء از session state '

Dim ArticleInfo As Articles = CType(Session(Key), Articles)

مرحله سوم : نمايش اطلاعات مرتبط با شی بازيابی شده '

lblRecord.Text = "عنوان مقاله :" & ArticleInfo.Title
lblRecord.Text &= "<br>شرح: "
lblRecord.Text &= ArticleInfo.Abstract
lblRecord.Text &= "<br>تعداد دفعات مشاهده : " & ArticleInfo.ViewCount.ToString()

End If

End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<head runat="server">
<title>تست session </title>
</head>
<body>
<form id="form1" runat="server">
<asp:Label id="lblSession" runat="server" Width="472px" Height="61px" Font-Size="Smaller"
Font-Names="Tahoma" Font-Bold="False"></asp:Label><br /><br />
<div >
<asp:ListBox id="lstItems" runat="server" Width="345px" Height="106px"
Font-Names="Tahoma"></asp:ListBox><br /> <br />
<asp:Button id="cmdMoreInfo" runat="server" Text="اطلاعات بيشتر "
Font-Names="Tahoma"></asp:Button><br /><br /><br />
<asp:Label id="lblRecord" runat="server" Font-Size="Small"
Font-Names="Tahoma" ></asp:Label>
</div>
</form>
</body>
</html>


شكل 1 نحوه عملكرد و خروجی برنامه فوق را نشان می دهد .

http://www.srco.ir/Articles/images/StateManagement8.jpg

حتی المقدور می بايست از تعداد session اندكی در برنامه استفاده گردد چراكه مديريت آنها مستلزم انجام عمليات اضافه و استفاده از منابع محدود موجود در سمت سرويس دهنده است . پياده كنندگان برنامه های وب برای رفع اين نگرانی می توانند يك دكمه Log out را در صفحه مورد نظر خود پيش بينی نمايند تا پس از كليك بر روی آن ، با استفاده از متد Session.Abandon اقدام به حذف session گردد ( آزاد سازی حافظه سرويس دهنده زودتر از موعد مقرر و مشخص شده توسط خصلت Timeout ) .
________________________________________

State Management در ASP. NET 2.0 (بخش دهم)


پيكربندی session در برنامه های وب
پياده كنندگان برنامه های وب برای پيكربندی session state می توانند از فايل web.config ( موجود در دايركتوری مجازی شامل فايل های aspx . ) استفاده نمايند . با استفاده از فايل فوق می توان گزينه های پيشرفته ای نظير timeout و مد session state را پيكربندی كرد . در صورتی كه از ويژوال استوديو برای ايجاد يك برنامه وب استفاده شده باشد ، همزمان با ايجاد پروژه ، بطور اتوماتيك يك فايل web.config نيز ايجاد می گردد .
كد زير يك نمونه فايل web.config را به همراه مهمترين خصلت های تاثيرگذار در پيكربندی session state را نشان می دهد .
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
...
<sessionState
cookieless="UseCookies" cookieName="ASP.NET_SessionId"
regenerateExpiredSessionId="false"
timeout="20"
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
sqlCommandTimeout="30"
allowCustomSqlDatabase="false"
customProvider=""
/>
</system.web>
</configuration>

در ادامه به تشريح هر يك از خصلت های فوق خواهيم پرداخت .

Cookieless
مقدار خصلت فوق بر اساس شرايط زير تعيين می گردد .

*

UseCookies : گزينه پيش فرض است و همواره از كوكی استفاده خواهد شد حتی اگر مرورگر و يا دستگاه سرويس گيرنده از آن حمايت نكند و يا آن را غيرفعال كرده باشد . در صورتی كه دستگاه سرويس گيرنده از كوكی حمايت نكند ، اطلاعات session در بين درخواست های متوالی گم می شود . چراكه هر درخواست يك ID جديد را خواهد گرفت .
*

UseUri : از كوكی صرفنظر از قابليت های مرورگر و يا دستگاه سرويس گيرنده استفاده نخواهد شد . در چنين مواردی ، شناسه session در يك URL ذخيره می گردد .
*

UseDeviceProfile : معيار انتخاب ASP. NET جهت استفاده از cookieless session ، بررسی نتايج حاصل از بكارگيری شی BrowserCapabilities است . شی فوق صرفا" پتانسيل هائی را كه دستگاه مورد نظر از آنها حمايت می نمايد مشخص می كند ( خود را درگير مواردی نظير غيرفعال كردن كوكی توسط كاربر نمی كند ) .
*

AutoDetect : در اين روش ، در آغاز ASP. NET سعی می كند تشخيص دهد كه آيا مرورگر از كوكی حمايت می نمايد . بدين منظور يك كوكی بر روی كامپيوتر سرويس گيرنده ايجاد و در ادامه آن را بازيابی می نمايد . ماحصل فرآيند فوق می تواند اين موضوع را به اثبات رساند كه مرورگر از كوكی حمايت می نمايد ولی توسط كاربر غير فعال شده است ( در چنين مواردی از مد cookieless استفاده می گردد )

كد زير بر استفاده از مد cookieless تاكيد می نمايد ( مناسب برای تست ) .
<sessionState cookieless="UseUri" ...="" />

در مد cookieless ، شناسه session بطور اتوماتيك درون يك URL قرار می گيرد . زمانی كه ASP. NET يك درخواست را دريافت می نمايد ، شناسه آن را حذف ، مجموعه session را بازيابی و درخواست دريافتی را برای دايركتوری مورد نظر ارسال می نمايد .
با توجه به اين كه شناسه session درون URL جاری قرار می گيرد ، لينك های مربوطه نير بطور اتوماتيك قادر به استفاده از شناسه session خواهند بود . به عبارت ديگر ، در صورتی كه كاربر بر روی page1.aspx باشد و بر روی لينك مربوط به page2.aspx كليك نمايد ، لينك مربوطه شامل شناسه session جاری به عنوان بخشی از URL مورد نظر خواهد بود . سناريوی فوق در مواردی كه از متد Response.Redirect به همراه يك URL نسبی استفاده شده باشد نيز صدق می كند .
Response.Redirect("Page2.aspx")

مثال
در اين مثال با نحوه استفاده از session آشنا خواهيم شد . بدين منظور از دو صفحه با مد cookieless استفاده شده است ( در فايل web.config مقدار cookieless معادل " UseUri" در نظر گرفته شده است ) . اولين صفحه ( Cookieless1.aspx ) شامل يك كنترل Hyperlink و دو دكمه است . دومين صفحه ( Cookieless1.aspx) ، صفحه ای است كه كاربر پس از كليك بر روی يكی از گزينه های موجود به آن هدايت شده و پس از بازيابی session ، اطلاعات در خروجی نمايش داده می شود .
شكل 1 ، نحوه عملكرد صفحه Cookieless1.aspx را نشان می دهد .

http://www.srco.ir/Articles/images/StateManagement9.jpg

*

لينك به همراه مسير نسبی : خصلت Hyperlink.NavigateUrl از طريق كد مقدار Cookieless1.aspx را می گيرد. در صورت كليك بر روی لينك فوق ، شناسه session بازيابی و می توان از اطلاعات session در صفحه جديد ( Cookieless2.aspx) استفاده كرد .
*

تغيير مسير ( مسير نسبی ) : تعيير مسير از طريق كد با مد cookieless نيز كار می كند ( همانند بكارگيری يك مسير نسبی ) . در مثال فوق از متد Response. Redirect برای هدايت كاربر به صفحه Cookieless2.aspx استفاده شده است . در صورت كليك بر روی دكمه فوق ، شناسه session بازيابی و امكان استفاده از اطلاعات session در صفحه جديد فراهم می گردد . كد زير نحوه انجام اين كار را نشان می دهد .

Protected Sub cmdLink_Click(ByVal sender As Object,ByVal As EventArgs) Handles cmdLink.Click
Response.Redirect("Cookieless2.aspx")
End Sub

*

تغيير مسير ( مسير مطلق ) : تنها محدوديت cookieless ، عدم امكان استفاده از لينك های absolute است . چراكه ASP. NET نمی تواند شناسه session را درون آنها قرار دهد . مثلا" در صورتی كه بر روی دكمه دوم كليك شود ، امكان استفاده از session جاری در صفحه Cookieless2.aspx وجود نخواهد داشت . كد زير نحوه انجام اين كار را نشان می دهد .

Protected Sub cmdLinkAbsolute_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdLinkAbsolute.Click
Dim url As String = "http://" & Request.Url.Authority & _
Request.Url.Segments(0) & Request.Url.Segments(1) & "Cookieless2.aspx"
Response.Redirect(url)
End Sub

كد صفحات Cookieless1.aspx و Cookieless2.aspx در جداول زير نشان داده شده است .

صفحه Cookieless1.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">

Protected Sub cmdLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLink.Click
Response.Redirect("Cookieless2.aspx")
End Sub

Protected Sub cmdLinkAbsolute_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim url As String = "http://" & Request.Url.Authority & Request.Url.Segments(0) &_
Request.Url.Segments(1) & "Cookieless2.aspx"
Response.Redirect(url)
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Session("test") = "Test String"
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>تست session </title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server">
<div>
<strong> تست session <br /> </strong>
<br />
<asp:HyperLink id="lnkRedirect" runat="server" Width="191px" Height="25px"
NavigateUrl="Cookieless2.aspx">لينك به همراه مسير نسبی</asp:HyperLink><br />
<br />
<asp:Button id="cmdLinkAbsolute" runat="server" Width="183px"
Text="تغيير مسير(مسير مطلق)" Font-Names="Tahoma" Font-Size="Small" ></asp:Button><br /><br />
<asp:Button id="cmdLink" runat="server" Width="187px"
Text="تغيير مسير ( مسير نسبی ) " Font-Names="Tahoma" Font-Size="Small" ></asp:Button>
</div>
</form>
</body>
</html>



صفحه Cookieless2.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Session("test") Is Nothing Then
lblInfo.Text = "اطلاعات session موجود نمی باشد"
Else
lblInfo.Text = "اطلاعات session با موفقيت بازيابی گرديد " & CType(Session("test"), String)
End If
End Sub

</script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server">
<div>
<asp:Label ID="lblInfo" runat="server" Font-Bold="True"
Font-Names="Tahoma" Font-Size="Small"
Height="52px" Style="z-index: 101; left: 488px; position: absolute; top: 25px"
Width="353px" ForeColor="#C04000"></asp:Label>
</div>
</form>
</body>
</html>

به صورت پيش فرض ، ASP. NET امكان استفاده مجدد از يك شناسه session را فراهم می نمايد. مثلا" در صورتی كه درخواستی ايجاد و query string شامل يك session باشد كه مدت زمان اعتبار آن به پايان رسيده باشد ، ASP. NET يك session جديد را ايجاد و از شناسه session استفاده می نمايد .
مشاهده ناخودآگاه يك شناسه session در يك مكان عمومی نظير نتايج ارائه شده توسط يك موتور جستجو يكی از چالش های مهم روش فوق محسوب می گردد كه ممكن است زمينه دستيابی چندين كاربر به سرويس دهنده با استفاده از شناسه session مشابه را فراهم نمايد .
برای پيشگيری از اين تهديد امنيتی ، می بايست از خصلت regenerateExpiredSessionId با مقدارtrue استفاده شود ( زمانی كه از session با مد cookieless استفاده شده باشد ) . در چنين مواردی ، در صورتی كه يك كاربر با يك شناسه session كه تاريخ اعتبار آن به اتمام رسيده است به سرويس دهنده متصل شده باشد ، يك شناسه session جديد برای وی ايجاد خواهد شد . تنها نكته قابل تامل در اين روش ، از دست دادن مقادير موجود در view sate و داده موجود در فرم است ، چراكه ASP. NET برای حصول اطمينان از اين موضوع كه مرورگر دارای يك شناسه جديد session است ، عمليات redirect را انجام خواهد داد .
________________________________________

asie ahmadi
کاربر عادی
کاربر عادی

تعداد پستها : 16
تاريخ التسجيل : 2009-11-08

بازگشت به بالاي صفحه اذهب الى الأسفل

بازگشت به بالاي صفحه

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
شما نمي توانيد در اين بخش به موضوعها پاسخ دهيد