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