public override void CreateUninitializedItem(HttpContext context, string id, int timeout) { id = "sessionstates/" + id; using (var session = _documentStore.OpenSession()) { var expireDate = DateTime.UtcNow.AddMinutes(timeout); var sessionState = new SessionState { Id = id, ApplicationName = ApplicationName, ExpireDate = expireDate }; session.Store(sessionState); session.Advanced.GetMetadataFor(sessionState)["Raven-Expiration-Date"] = new RavenJValue(expireDate); session.SaveChanges(); } }
public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) { id = "sessionstates/" + id; var sessionItems = new Dictionary<string, string>(); for (var i = 0; i < item.Items.Count; i++) { sessionItems.Add(item.Items.Keys[i],item.Items[i].ToString()); } using (var session = _documentStore.OpenSession()) { SessionState sessionState; if (newItem) { sessionState = session.Query<SessionState>() .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) .SingleOrDefault( x => x.Id == id && x.ApplicationName == ApplicationName && x.ExpireDate < DateTime.UtcNow); if (sessionState != null) { throw new InvalidOperationException(string.Format("Item aleady exist with SessionId={0} and ApplicationName={1}", id, lockId)); } sessionState = new SessionState { Id = id, ApplicationName = ApplicationName }; session.Store(sessionState); } else { sessionState = session.Query<SessionState>() .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) .Single(x => x.Id == id && x.ApplicationName == ApplicationName && x.LockId == (int)lockId); } var expireDate = DateTime.UtcNow.AddMinutes(_sessionStateConfig.Timeout.TotalMinutes); sessionState.ExpireDate = expireDate; session.Advanced.GetMetadataFor(sessionState)["Raven-Expiration-Date"] = new RavenJValue(expireDate); sessionState.SessionItems = sessionItems; sessionState.IsLocked = false; session.SaveChanges(); } }