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