예제 #1
0
        /// <summary>
        /// Initializes a new instance of the RedisSessionAccessor class, which provides access to a
        ///     local Redis items collection outside of the standard ASP.NET pipeline Session hooks
        /// </summary>
        /// <param name="context">The context of the current request</param>
        public RedisSessionAccessor(HttpContextBase context)
        {
            try
            {
                this.RequestContext = context;
                this.SharedSessions = new LocalSharedSessionDictionary();

                // if we have the session ID
                if (this.RequestContext.Request.Cookies[RedisSessionConfig.SessionHttpCookieName] != null)
                {
                    this.SessionRedisHashKey = RedisSessionStateStoreProvider.RedisHashIdFromSessionId(
                        this.RequestContext,
                        this.RequestContext.Request.Cookies[RedisSessionConfig.SessionHttpCookieName].Value);
                }

                if (!string.IsNullOrEmpty(this.SessionRedisHashKey))
                {
                    RedisSessionStateItemCollection items =
                        this.SharedSessions.GetSessionForBeginRequest(
                            this.SessionRedisHashKey,
                            (string redisKey) =>
                    {
                        return(RedisSessionStateStoreProvider.GetItemFromRedis(
                                   redisKey,
                                   this.RequestContext,
                                   RedisSessionConfig.SessionTimeout));
                    });

                    this.Session = new FakeHttpSessionState(items);
                }
            }
            catch (Exception exc)
            {
                if (RedisSessionConfig.RedisSessionAccessorExceptionLoggingDel != null)
                {
                    string errMsg = string.Format(
                        "RedisSessionAccessor unable to get Redis session for id: {0}",
                        this.SessionRedisHashKey);

                    RedisSessionConfig.RedisSessionAccessorExceptionLoggingDel(
                        context,
                        errMsg,
                        exc);
                }
            }
        }
        /// <summary>
        /// Gets a Session from Redis, indicating a non-exclusive lock on the Session. Note that GetItemExclusive
        ///     calls this method internally, meaning we do not support locks at all retrieving the Session.
        /// </summary>
        /// <param name="context">The HttpContext of the current request</param>
        /// <param name="id">The Session Id, which is the key name in Redis</param>
        /// <param name="locked">Whether or not the Session is locked to exclusive access for a single request
        ///     thread</param>
        /// <param name="lockAge">The age of the lock</param>
        /// <param name="lockId">The object used to lock the Session</param>
        /// <param name="actions">Whether or not to initialize the Session (never)</param>
        /// <returns>The Session objects wrapped in a SessionStateStoreData object</returns>
        public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
        {
            locked  = false;
            lockAge = new TimeSpan(0);
            lockId  = null;
            actions = SessionStateActions.None;

            try
            {
                string parsedRedisHashId = RedisSessionStateStoreProvider.RedisHashIdFromSessionId(
                    new HttpContextWrapper(context),
                    id);

                LocalSharedSessionDictionary sharedSessDict = new LocalSharedSessionDictionary();

                RedisSessionStateItemCollection items = sharedSessDict.GetSessionForBeginRequest(
                    parsedRedisHashId,
                    (redisKey) => {
                    return(RedisSessionStateStoreProvider.GetItemFromRedis(
                               redisKey,
                               new HttpContextWrapper(context),
                               this.SessionTimeout));
                });

                return(new SessionStateStoreData(
                           items,
                           SessionStateUtility.GetSessionStaticObjects(context),
                           Convert.ToInt32(this.SessionTimeout.TotalMinutes)));
            }
            catch (Exception e)
            {
                if (RedisSessionConfig.SessionExceptionLoggingDel != null)
                {
                    RedisSessionConfig.SessionExceptionLoggingDel(e);
                }
            }

            return(this.CreateNewStoreData(context, Convert.ToInt32(this.SessionTimeout.TotalMinutes)));
        }