में एक नया एएसपी.NET सत्र उत्पन्न करना पाइपलाइन में हमारे कुछ उत्पादों के खिलाफ प्रवेश परीक्षा के परिणामस्वरूप, उस समय क्या होना चाहिए जब 'आसान' समस्या ठीक हो रही है toughy।वर्तमान HTTPContext
यह नहीं कि यह निश्चित रूप से होना चाहिए, मेरा मतलब है कि वर्तमान HTTPContext
के लिए एक नया नया सत्र क्यों उत्पन्न करना इतना मुश्किल हो सकता है? विचित्र!
Imports System.Web
Imports System.Web.SessionState
Public Class SwitchSession
Public Shared Sub SetNewSession(ByVal context As HttpContext)
' This value will hold the ID managers action to creating a response cookie
Dim cookieAdded As Boolean
' We use the current session state as a template
Dim state As HttpSessionState = context.Session
' We use the default ID manager to generate a new session id
Dim idManager As New SessionIDManager()
' We also start with a new, fresh blank state item collection
Dim items As New SessionStateItemCollection()
' Static objects are extracted from the current session context
Dim staticObjects As HttpStaticObjectsCollection = _
SessionStateUtility.GetSessionStaticObjects(context)
' We construct the replacement session for the current, some parameters are new, others are taken from previous session
Dim replacement As New HttpSessionStateContainer(_
idManager.CreateSessionID(context), _
items, _
staticObjects, _
state.Timeout, _
True, _
state.CookieMode, _
state.Mode, _
state.IsReadOnly)
' Finally we strip the current session state from the current context
SessionStateUtility.RemoveHttpSessionStateFromContext(context)
' Then we replace the assign the active session state using the replacement we just constructed
SessionStateUtility.AddHttpSessionStateToContext(context, replacement)
' Make sure we clean out the responses of any other inteferring cookies
idManager.RemoveSessionID(context)
' Save our new cookie session identifier to the response
idManager.SaveSessionID(context, replacement.SessionID, False, cookieAdded)
End Sub
End Class
यह काम करता है (कोड का प्रारूपण/पर प्रकाश डाला/विजुअल बेसिक मैं कुछ गलत कर किया जाना चाहिए के लिए क्षमा याचना): वैसे मैं करने के लिए एक मुखर छोटे उपयोगिता वर्ग "बस कर" लिखा है अनुरोध के शेष के लिए ठीक है, और सही ढंग से नए सत्र के रूप में स्वयं को पहचानता है (उदाहरण के लिए HTTPContext.Current.Session.SessionID
नए जेनरेट किए गए सत्र पहचानकर्ता को वापस देता है)।
आश्चर्य आश्चर्य तब, जब अगले अनुरोध सर्वर हिट, HTTPContext.Session
(एक HTTPSessionState
वस्तु) सही SessionID
साथ स्वयं का तादात्म्य है, लेकिन True
करने के लिए IsNewSession
सेट है, और, रिक्त है सब सत्र मूल्यों में सेट खोने पिछले अनुरोध
तो शुरुआती अनुरोध से हटाए गए पिछले HTTPSessionState
ऑब्जेक्ट के बारे में कुछ खास होना चाहिए, यहां एक ईवेंट हैंडलर, एक कॉलबैक है, जो कुछ अनुरोधों पर सत्र डेटा को बनाए रखने में सक्षम है, या बस कुछ जो मुझे याद आ रहा है?
किसी को साझा करने के लिए कोई जादू मिला है?
मैं इसे कुछ राज्य ('replacement' सत्र) और तारों के ऊपर सक्रिय ASP.NET अनुप्रयोग उदाहरण के लिए' SessionStateModule' घटनाओं देकर मेरी 'SwitchSession' वर्ग विकसित हुआ। जब 'स्टार्ट' ईवेंट आग लगती है, तो यह देखने के लिए जांच करता है कि क्या एएसपी.नेट के सत्र में सत्र 'सत्र आईडी' है और पिछले सत्र से सभी सत्र राज्य मानों की प्रतिलिपि बनाते हैं। जाहिर है केवल तभी काम करता है जब सभी अनुरोध 'HTTP अनुप्रयोग' उदाहरण के माध्यम से आते हैं जो पिछले अनुरोध को संभाला था। मैं 'सत्रस्टेट मॉड्यूल' में थोड़ा गहरा खोदने के लिए परावर्तक का उपयोग कर रहा हूं, लेकिन यह सुंदर नहीं है। कृपया इस सवाल को वोट दें! – Rabid
मुझे आपके जैसा ही स्थान मिला है (RemoveHttpSessionStateFromContext के लिए खोज करके अपने पृष्ठ पर पहुंचे)। दुर्भाग्य से, आपके जैसा ही दीवार भी मारा - एक नया सत्र उत्पन्न नहीं हो सकता है। कुंजी निश्चित रूप से सत्रस्टेट मॉड्यूल है। कॉम्पलेटएक्वार्डस्टेट(), जो कि प्राप्त करना बेहद मुश्किल है - युधि का प्रतिबिंब दृष्टिकोण इसे प्राप्त करने का एक तरीका होगा, लेकिन मुझे यकीन नहीं है कि यह परेशानी के लायक है। मुझे यह कहना होगा कि जितना मुझे सी # पसंद है, .NET की एपीआई एक बड़ी निराशाजनक रही है - वे इसका खुलासा कैसे कर सकते हैं! – marq
FYI: CompleteAququiredState() सत्र StateUtility.AddDelayedHttpSessionStateToContext() को कॉल करता है, जो एक नए सत्र के लिए सभी जादू करता है। – marq