/// <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)); }
/// <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)); }