//called to set the session for the current connection internal void SetSession(SessionState session) { _session = session; }
public static void LoadStateForConnection(HttpRequest request,Site site) { switch (site.SessionStateType) { case SiteSessionTypes.ThreadState: if (request.Cookie.SessionID == null) { Monitor.Enter(_lock); if (_ipSessionIds == null) _ipSessionIds = new Dictionary<string, CachedItemContainer>(); if (_ipSessionIds.ContainsKey(request.Connection.Client.ToString())) request.Cookie.SessionID = _ipSessionIds[request.Connection.Client.ToString()].Value.ToString(); Monitor.Exit(_lock); } if (request.Cookie.SessionID != null) { Monitor.Enter(_lock); if (_sessions == null) _sessions = new List<SessionState>(); for (int x = 0; x < _sessions.Count; x++) { SessionState session = _sessions[x]; if (session.ID == request.Cookie.SessionID) { session.Renew(site.SessionTimeoutMinutes); request.SetSession(session); _sessions.RemoveAt(x); _sessions.Insert(x, session); break; } } Monitor.Exit(_lock); } if (request.Session==null) { Monitor.Enter(_lock); while (true) { bool okay = true; string id = GenerateSessionID(); if (_sessions == null) _sessions = new List<SessionState>(); foreach (SessionState session in _sessions) { if (session.ID == id) { okay = false; break; } } if (okay) { if (_ipSessionIds == null) _ipSessionIds = new Dictionary<string, CachedItemContainer>(); _ipSessionIds.Add(request.Connection.Client.ToString(), new CachedItemContainer(id)); SessionState ss = new SessionState(id); ss.Renew(site.SessionTimeoutMinutes); _sessions.Add(ss); request.SetSession(ss); break; } } Monitor.Exit(_lock); request.ResponseCookie.SessionID = request.Session.ID; } break; case SiteSessionTypes.FileSystem: if (request.Cookie.SessionID == null) { Monitor.Enter(_lock); if (_ipSessionIds == null) _ipSessionIds = new Dictionary<string, CachedItemContainer>(); if (_ipSessionIds.ContainsKey(request.Connection.Client.ToString())) request.Cookie.SessionID = _ipSessionIds[request.Connection.Client.ToString()].Value.ToString(); Monitor.Exit(_lock); } if (request.Cookie.SessionID != null) { Monitor.Enter(_lock); DirectoryInfo di = new DirectoryInfo(site.TMPPath + Path.DirectorySeparatorChar + "Sessions"); if (!di.Exists) di.Create(); if (di.GetFiles(request.Cookie.SessionID + ".xml").Length > 0) { SessionState ss = new SessionState(request.Cookie.SessionID); ss.LoadFromFile(di.FullName + Path.DirectorySeparatorChar + request.Cookie.SessionID + ".xml"); ss.Renew(site.SessionTimeoutMinutes); ss.StoreToFile(di.FullName + Path.DirectorySeparatorChar + request.Cookie.SessionID + ".xml"); request.SetSession(ss); } Monitor.Exit(_lock); } if (request.Session == null) { Monitor.Enter(_lock); DirectoryInfo di = new DirectoryInfo(site.TMPPath + Path.DirectorySeparatorChar + "Sessions"); if (!di.Exists) di.Create(); while (true) { string id = GenerateSessionID(); if (_sessions == null) _sessions = new List<SessionState>(); if (di.GetFiles(id + ".xml").Length == 0) { if (_ipSessionIds == null) _ipSessionIds = new Dictionary<string, CachedItemContainer>(); _ipSessionIds.Add(request.Connection.Client.ToString(), new CachedItemContainer(id)); SessionState ss = new SessionState(id); ss.StoreToFile(di.FullName + Path.DirectorySeparatorChar + id + ".xml"); request.SetSession(ss); break; } } Monitor.Exit(_lock); request.ResponseCookie.SessionID = request.Session.ID; } break; } }