/// <summary> /// Gets or creates a session for the session ID /// </summary> /// <param name="self">The session ID to use</param> /// <param name="request">The request to report to the creation callback</param> /// <returns>The values for the session</returns> public static async Task <Dictionary <string, object> > GetOrCreateSessionAsync(string id, TimeSpan duration = default(TimeSpan), IHttpRequest request = null, SessionCreateCallback createCallback = null, SessionExpireCallback expireCallback = null) { if (string.IsNullOrWhiteSpace(id)) { throw new ArgumentNullException(nameof(id)); } if (duration.Ticks < 0) { throw new ArgumentOutOfRangeException(nameof(duration)); } SessionItem res; bool created = false; lock (_lock) { _sessions.TryGetValue(id, out res); if (res == null) { _sessions[id] = res = new SessionItem(id, duration.Ticks == 0 ? SessionDuration: duration) { ExpireCallback = expireCallback }; created = true; } else { _expirations[res.Expires.Ticks].Remove(res.ID); } res.Expires = DateTime.Now.Add(res.Duration); _expirations.TryGetValue(res.Expires.Ticks, out var lst); if (lst == null) { _expirations[res.Expires.Ticks] = lst = new List <string>(); } _expirations[res.Expires.Ticks].Add(res.ID); } if (created) { if (createCallback != null) { await createCallback(request, res.ID, res.Values); } else if (SessionStarted != null) { await SessionStarted(request, res.ID, res.Values); } } StartExpireTimer(); return(res.Values); }
/// <summary> /// Gets or creates a session for the current request /// </summary> /// <param name="self">The request to use</param> /// <returns>The values for the session</returns> public static Task <Dictionary <string, object> > GetOrCreateSessionAsync(this IHttpRequest self, TimeSpan duration = default(TimeSpan), SessionCreateCallback createCallback = null, SessionExpireCallback expireCallback = null) => GetOrCreateSessionAsync(self.SessionID, duration, self, createCallback, expireCallback);