State Management در ASP. NET 2.0 (بخش دهم)
اين مطلب از طريق سايت شرکت سخاروش در اختيار شما گذاشته شده است .

State Management در ASP. NET 2.0

State Management در ASP. NET 2.0 (بخش دهم)
آنچه تاكنون گفته شده است :

 بخش اول

 مفاهيم اوليه

:

 ضرورت مديريت state در برنامه های وب

 بخش دوم  

 view state   

:  نحوه ايمن سازی اطلاعات ذخيره شده در view state
 بخش سوم  

view state

: نحوه نگهداری Member Variables و اشياء سفارشی
 بخش چهارم

cross-page posting

: انتقال اطلاعات از يك صفحه به صفحه ای ديگر
 بخش پنجم

cross-page posting

: نحوه دريافت اطلاعات  از صفحه مبداء
 بخش ششم

Query String

:  نحوه انتقال اطلاعات بين صفحات
 بخش هفتم  كوكی های سفارشی : نحوه عملكرد كوكی های سفارشی
 بخش هشتم 

Session State

: مفاهيم و معماری session  
 بخش نهم

Session State

: نحوه استفاده از session state

در اين بخش با نحوه پيكربندی session در برنامه های وب آشنا خواهيم شد.

پيكربندی 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
مقدار خصلت فوق بر اساس شرايط زير تعيين می گردد .

كد زير بر استفاده از مد 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 را نشان می دهد .

نحوه عملكرد session
شكل 1 ، نحوه عملكرد صفحه Cookieless1.aspx 

Protected Sub cmdLink_Click(ByVal sender As Object,ByVal As EventArgs) Handles cmdLink.Click
  Response.Redirect(
"Cookieless2.aspx")
End Sub
 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 را انجام خواهد داد . 
در بخش يازدهم به بررسی ساير خصلت های تاثير گذار در پيكربندی session خواهيم پرداخت .


استفاده از اين مطلب  با ذکر منبع و اهداف غيرانتفاعی بلامانع است .
http://www.srco.
ir