Example #1
0
 /// <summary>
 /// 在请求开始时:SessionStateModule 对象调用GetItemExclusive方法,在这个期间有一个AcquireRequestState事件,
 /// 当EnableSessionState 属性设置为true时,也是默认情形,
 /// 如果EnableSessionState属性设置为ReadOnly,SessionStateModule对象调用的方法就改为GetItem方法
 /// </summary>
 /// <param name="context"></param>
 /// <param name="id"></param>
 /// <param name="locked"></param>
 /// <param name="lockAge"></param>
 /// <param name="lockId"></param>
 /// <param name="actions"></param>
 /// <returns></returns>
 public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out System.Web.SessionState.SessionStateActions actions)
 {
     return(this.GetSessionStoreItem(true, context, id, out locked, out lockAge, out lockId, out actions));
 }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="lockRecord"></param>
        /// <param name="context"></param>
        /// <param name="id"></param>
        /// <param name="locked"></param>
        /// <param name="lockAge"></param>
        /// <param name="lockId"></param>
        /// <param name="actionFlags"></param>
        /// <returns></returns>
        public SessionStateStoreData GetSessionStoreItem(bool lockRecord, HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out System.Web.SessionState.SessionStateActions actionFlags)
        {
            //init out
            SessionStateStoreData item = null;

            lockAge     = TimeSpan.Zero;
            lockId      = null;
            locked      = false;
            actionFlags = 0;
            //要存储的内容
            string serializedItems = "";
            int    timeout         = 0;
            bool   found           = false;
            bool   deleted         = false;

            var model = this.cache.Get <SessionStateList>(id);

            if (lockRecord)
            {
                if (model == null || model.SessionModels == null || model.SessionModels.Count() == 0)
                {
                    locked = true;
                }
                else
                {
                    var lockedList = from n in model.SessionModels
                                     where !n.IsLocked && n.LockDate > DateTime.Now
                                     select n;

                    if (lockedList.Count() == 0)
                    {
                        locked = true;
                    }
                    else
                    {
                        locked = false;
                    }

                    foreach (var n in model.SessionModels)
                    {
                        if (!n.IsLocked && n.LockDate > DateTime.Now)
                        {
                            n.IsLocked = true;
                            n.LockDate = DateTime.Now;
                        }
                    }
                }
            }

            if (model != null && model.SessionModels != null && model.SessionModels.Count() > 0)
            {
                //删除数据
                var first = model.SessionModels.OrderByDescending(o => o.LockDate).FirstOrDefault();
                if (first != null)
                {
                    if (first.ExpireDate < DateTime.Now)
                    {
                        locked  = false;
                        deleted = true;
                    }
                    else
                    {
                        found = true;
                    }

                    serializedItems = first.SessionText;
                    lockAge         = DateTime.Now.Subtract(first.LockDate);
                    lockId          = first.LockId;
                    actionFlags     = (System.Web.SessionState.SessionStateActions)first.ActionFlag;
                    timeout         = first.Timeout;
                }
            }
            if (!found)
            {
                locked = false;
            }

            if (deleted)
            {
                model.SessionModels = new SessionState[0];
            }

            if (found && !locked)
            {
                lockId = (long)lockId + 1;
                foreach (var session in model.SessionModels)
                {
                    session.LockId     = (long)lockId;
                    session.ActionFlag = SessionStateActions.None;
                }
                if ((model.ExpireDate - DateTime.Now).Minutes <= 0)
                {
                    model.ExpireDate = DateTime.Now.AddMinutes(sessionCfg.Timeout.TotalMinutes);
                }

                this.cache.Set(id, model, model.ExpireDate - DateTime.Now);
            }

            //以分钟为单位
            if (actionFlags == (System.Web.SessionState.SessionStateActions)SessionStateActions.InitializeItem)
            {
                item = this.CreateNewStoreData(context, (int)sessionCfg.Timeout.TotalMinutes);
            }
            else
            {
                item = new System.Func <SessionStateStoreData>(() =>
                {
                    using (var ms = new MemoryStream(Convert.FromBase64String(serializedItems)))
                    {
                        var sessionItems = new SessionStateItemCollection();
                        if (ms.Length > 0)
                        {
                            BinaryReader reader = new BinaryReader(ms);
                            sessionItems        = SessionStateItemCollection.Deserialize(reader);
                        }
                        return(new SessionStateStoreData(sessionItems, SessionStateUtility.GetSessionStaticObjects(context), timeout <= 0 ? (int)sessionCfg.Timeout.TotalMinutes : timeout));
                    }
                }).Invoke();
            }

            return(item);
        }
 public System.Web.SessionState.SessionStateStoreData GetItem(bool lockRecord, System.Web.HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out System.Web.SessionState.SessionStateActions actions)
 {
     return(GetSessionStoreItem(lockRecord, context, id, out locked, out lockAge, out lockId, out actions));
 }