सत्र राज्य को बदलना
के बारे में
मैंने पिछले कुछ वर्षों में कस्टम सामग्री प्रबंधन प्रणालियों के साथ छेड़छाड़ करते हुए बिताया है, जिसकी परिणति औसिया के नवीनतम संस्करण में हुई है।
पिछले संस्करणों ने हमेशा ASP.NET सत्र स्थिति का उपयोग पोस्टबैक के बीच आइटम बनाए रखने के लिए, या एक अनुरोध होने पर जानकारी रखने के लिए किया था, एक कस्टम अनुरोध हैंडलर के संयोजन में जो विभिन्न पेज रूट डेटा आइटम को पॉप्युलेट करता है।
सत्र स्थिति डेटा संग्रहीत करने का एक आसान तरीका है, लेकिन मुझे बॉक्स के बाहर की कार्यक्षमता में कुछ कमियां मिलीं;
- यदि कोई उपयोगकर्ता एक लंबा दस्तावेज़ संपादित कर रहा था, तो सत्र समाप्त हो सकता है इससे पहले कि वह आइटम को सहेजे
- संपूर्ण एप्लिकेशन को चलाने वाली एकल IIS प्रक्रिया तक सीमित।
मैं ओसिया को एक मानक कार्यकर्ता प्रक्रिया से एक वेब गार्डन में स्थानांतरित करने के लिए देख रहा था, और मुझे पता था कि मुझे डेटा क्रॉस प्रक्रिया को याद रखने का कोई वैकल्पिक तरीका खोजना होगा। कुछ समाधान जिनका मैंने पहले ऑनलाइन उपयोग किया था या सामना किया था, उनमें विभिन्न पक्ष और विपक्ष शामिल थे;
Options
- HttpContext
- ViewState
- Cookies
- SessionState in SQL Server
के बारे में
तर्क ने मुझे (वैसे भी मेरा तर्क) तय किया कि मुझे डेटा के उद्देश्य को दो में विभाजित करना था।
क्या यह क्रॉस-पेज/क्रॉस-अनुरोध डेटा था, या कुछ ऐसा जिसे मुझे याद रखने की आवश्यकता थी, अनुरोध को संसाधित करने में लगने वाले समय के लिए?
अनुरोध प्रसंस्करण मूल्य - आसान जीत
मुझे बहुत जल्दी एहसास हुआ कि अनुरोध को संसाधित करने में लगने वाले समय के लिए डेटा को याद रखने के लिए सत्रस्टेट का उपयोग करने की कोई आवश्यकता नहीं है। इसे HttpContext द्वारा आसानी से नियंत्रित किया गया था।
मैं इसका उपयोग जटिल पोस्टबैक परिदृश्यों में अनुरोध श्रृंखला के नीचे स्क्रीन दृश्यता सेट करने के लिए कर सकता हूं, इन पंक्तियों के साथ कुछ। इस स्विच को बनाने के लिए, जिसकी मैं अनुशंसा करता हूं, तो आप नीचे दिए गए कोड के समान कुछ देख रहे हैं।
VB.NET
अनुरोध प्रसंस्करण मूल्य - आसान जीत
यह इतना आसान था, सचमुच कोड को सत्र से संदर्भ में बदल दें और आधी समस्याएं दूर हो गई थीं।
यह पोस्टबैक के बीच डेटा को याद रखने की प्रक्रिया को हल नहीं करता था, हालांकि, इसमें अधिक विचार होगा।
क्रॉस अनुरोध डेटा
मैंने डेटा क्रॉस रिक्वेस्ट को याद रखने के लिए कुकीज़ का उपयोग करने का फैसला किया, लेकिन सोचा कि मैं डेटा को स्टोर करने और एक्सेस करने के मामले में इसे अगले स्तर पर ले जाऊंगा, कार्यों और उप की एक श्रृंखला बनाकर जो इस डेटा तक पहुंचने के लिए कहीं और आसान बना देगा, क्रॉस उप डोमेन।
डोमेन फ़ंक्शन
डिफ़ॉल्ट रूप से, IIS में बनाई गई कुकी पूरे डोमेन स्तर पर होगी और केवल उस डोमेन तक ही पहुंच योग्य होगी। यह मेरे पास क्लेटाबेस और gsclayton.net दोनों साइटों पर मौजूद विभिन्न उप डोमेन के साथ मदद नहीं करेगा। सौभाग्य से आप कुकी डोमेन सेट कर सकते हैं।
मैंने पाया कि अन्य भागों के लेखन के दौरान मैं इस डोमेन कार्यक्षमता का पुन: उपयोग कर रहा था, इसलिए इसे एक अलग फ़ंक्शन में ले जाया गया। आंतरिक सर्वर पर कुकीज़ सेट करने के लिए यह आवश्यक था।
VB.NET
कुकी समाप्ति
हां, कुकीज़ आपके द्वारा भेजी गई समाप्ति तिथि के साथ वापस नहीं आती हैं।
शीर्ष युक्ति - कुकी के भीतर समाप्ति को टिक के रूप में सहेजें।
VB.NET
कुकी मान सेट करना
कुकी मान बनाने और सेट करने के लिए अब दो उप की आवश्यकता है। इन्हें काम करने के लिए पैरामीटर के रूप में अनुरोध और प्रतिक्रिया, कुकी नाम, डोमेन और मिनटों में टाइमआउट दोनों की आवश्यकता होती है।
मानों की सेटिंग उप के दूसरे भाग में होती है, और आप बस अतिरिक्त फ़ील्ड और मान को स्ट्रिंग्स के रूप में पास करते हैं।
VB.NET
If IsNothing(Request.Cookies(CookieName)) Then
Dim PersistenceCookie As New HttpCookie(CookieName)
Domain = UpdDomain(Domain)
PersistenceCookie.Domain = Domain
PersistenceCookie.Expires = DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime())
PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
Response.Cookies.Add(PersistenceCookie)
End If
End Sub
Public Shared Sub PersistenceSet(Request As HttpRequest, Response As HttpResponse, CookieName As String, Domain As String, TimeOut As Integer,
Field As String, Value As String)
If IsNothing(Request.Cookies(CookieName)) Then
PersistenceCreate(Request, Response, CookieName, Domain, TimeOut)
End If
Dim PersistenceCookie As HttpCookie = Request.Cookies(CookieName)
Dim Expires As Long = GetExpires(PersistenceCookie)
Domain = UpdDomain(Domain)
PersistenceCookie.Domain = Domain
If Expires < DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime()).Ticks Then
PersistenceCookie.Expires = DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime())
PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
Else
PersistenceCookie.Expires = New DateTime(Expires)
PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
End If
PersistenceCookie.Item(Field) = Value
Response.Cookies.Add(PersistenceCookie)
End Sub
कुकी मान प्राप्त करना
ये एक ही चीज़ के दो अलग-अलग स्वाद हैं। पहला कुकी से एक मान लौटाता है यदि यह मौजूद है या एक खाली स्ट्रिंग है, तो दूसरा एक साधारण बूलियन है यदि कुकी मान इनपुट चर के बराबर है।
VB.NET
If Not IsNothing(Request.Cookies(CookieName)) Then
If Not IsNothing(Request.Cookies(CookieName)(Field)) Then
r = Request.Cookies(CookieName)(Field).ToString
End If
End If
Return r
End Function
Public Shared Function PersistenceCheck(Request As HttpRequest, CookieName As String, Field As String, Value As String) As Boolean
If Not IsNothing(Request.Cookies(CookieName)) Then
If Not IsNothing(Request.Cookies(CookieName)(Field)) Then
If Request.Cookies(CookieName)(Field) = Value Then
r = True
End If
End If
End If
Return r
End Function
कुकी पुनर्चक्रण
थोड़ी देर रूकें! अभी पिछले बिट्स के साथ भागो मत। यहां जादू पैदा होता है।
आप जल्दी से महसूस करेंगे कि कुकी की समय सीमा समाप्त हो जाएगी जब तक कि आप बार-बार किसी मान को रीसेट नहीं करते। अन्य बातों के अलावा हमारी दृढ़ता कुकी को याद रखने के लिए इसे हमारे अनुरोध हैंडलर में प्लग किया गया है। यदि कुकी 20 मिनट से कम हो जाती है तो यह बस कुकी की समाप्ति को रीसेट कर देता है।
If Not IsNothing(HttpContext.Current.Request.Cookies(CookieName)) Then
Dim PersistenceCookie As HttpCookie = HttpContext.Current.Request.Cookies(CookieName)
Dim Expires As Long = GetExpires(PersistenceCookie)
Domain = UpdDomain(Domain)
If Expires < DateAdd(DateInterval.Minute, 20, Now.ToUniversalTime()).Ticks Then
PersistenceCookie.Expires = DateAdd(DateInterval.Minute, 20, Now.ToUniversalTime())
PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
PersistenceCookie.Domain = Domain
Response.Cookies.Add(PersistenceCookie)
End If
End If
End Sub
पुनर्कथन और उपयोग
कार्यों का उपयोग करना आसान नहीं हो सकता। अगली बार उपयोगकर्ता के वापस आने पर ड्रॉपडाउन फ़ील्ड चयनित मान सेट करने का एक सरल उदाहरण हो सकता है। इस परिदृश्य में हम इसे निम्नानुसार उपयोग करेंगे।
परीक्षण करने के लिए, एक साधारण ड्रॉपडाउन के साथ एक नया वेब फ़ॉर्म बनाएं, परिवर्तन पर ऑटो पोस्टबैक पर सेट करें।
HMTL
<asp:ListItem Value="2">Value 2</asp:ListItem>
<asp:ListItem Value="3">Value 3</asp:ListItem>
<asp:ListItem Value="4">Value 4</asp:ListItem>
</asp:dropdownlist>
VB.NET
Protected Sub CookieDrop_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CookieDrop.SelectedIndexChanged
'Set the cookie for one minute...
PersistenceSet(Request, Response, "DropDownTest", "", 1, "SelectedValue", CookieDrop.SelectedValue)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
GetData()
PersistenceRecycle(Request, Response, "DropDownTest", "")
If Not IsPostBack Then 'Delete if you want to remove ViewState!
SetDropDownVal()
End If
End Sub
Protected Sub Page_PreRender() Handles Me.PreRender
End Sub
Protected Sub GetData()
'Bind Data to DropDown
End Sub
Protected Sub SetDropDownVal()
Dim DropDownVal As Integer
If PersistenceGet(Request, "DropDownTest", "SelectedValue") <> "" Then
If IsNumeric(PersistenceGet(Request, "DropDownTest", "SelectedValue")) Then
DropDownVal = PersistenceGet(Request, "DropDownTest", "SelectedValue")
Try
CookieDrop.SelectedValue = DropDownVal
Catch
End Try
End If
End If
End Sub
End Class
क्लेटाबेस द्वारा वेबसाइट डिजाइन
यह कोड का एक भाग है जिसे Ousia सामग्री प्रबंधन प्रणाली कोड से संशोधित किया गया है, जो बाजार पर सबसे तेज और सबसे अनुकूलित प्रणालियों में से एक है, जो हमारी वेबसाइट डिजाइन सेवाओं का हिस्सा है।
ये लगभग £500 से शुरू होने वाली साइटों के साथ उपलब्ध हैं।