Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);