164 lines
6.7 KiB
C#
164 lines
6.7 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="SessionStateStore.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
/*
|
||
|
* SessionStateStoreProviderBase
|
||
|
*
|
||
|
*/
|
||
|
namespace System.Web.SessionState {
|
||
|
using System.Xml;
|
||
|
using System.Security.Permissions;
|
||
|
using System.Configuration.Provider;
|
||
|
using System.Collections.Specialized;
|
||
|
|
||
|
[FlagsAttribute()]
|
||
|
internal enum SessionStateItemFlags : int {
|
||
|
None = 0x00000000,
|
||
|
Uninitialized = 0x00000001,
|
||
|
IgnoreCacheItemRemoved = 0x00000002
|
||
|
}
|
||
|
|
||
|
[FlagsAttribute()]
|
||
|
public enum SessionStateActions : int {
|
||
|
None = 0x00000000,
|
||
|
InitializeItem = 0x00000001
|
||
|
}
|
||
|
|
||
|
// This interface is used by SessionStateModule to read/write the session state data
|
||
|
public abstract class SessionStateStoreProviderBase : ProviderBase {
|
||
|
public abstract void Dispose();
|
||
|
|
||
|
// Called by SessionStateModule to notify the provider that Session_End is defined
|
||
|
// in global.asax, and so when an item expires, it should call the expireCallback
|
||
|
// If the provider does not support session expiry, it should return false.
|
||
|
public abstract bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback);
|
||
|
|
||
|
// Called at the beginning of the AcquireRequestState event
|
||
|
public abstract void InitializeRequest(HttpContext context);
|
||
|
|
||
|
// Get and return a SessionStateStoreData.
|
||
|
// Please note that we are implementing a reader/writer lock mechanism.
|
||
|
//
|
||
|
// If successful:
|
||
|
// - returns the item
|
||
|
//
|
||
|
// If not found:
|
||
|
// - set 'locked' to false
|
||
|
// - returns null
|
||
|
//
|
||
|
// If the item is already locked by another request:
|
||
|
// - set 'locked' to true
|
||
|
// - set 'lockAge' to how long has the item been locked
|
||
|
// - set 'lockId' to the context of the lock
|
||
|
// - returns null
|
||
|
public abstract SessionStateStoreData GetItem(HttpContext context,
|
||
|
String id,
|
||
|
out bool locked,
|
||
|
out TimeSpan lockAge,
|
||
|
out object lockId,
|
||
|
out SessionStateActions actions);
|
||
|
|
||
|
// Get and lock a SessionStateStoreData.
|
||
|
// Please note that we are implementing a reader/writer lock mechanism.
|
||
|
//
|
||
|
// If successful:
|
||
|
// - set 'lockId' to the context of the lock
|
||
|
// - returns the item
|
||
|
//
|
||
|
// If not found:
|
||
|
// - set 'locked' to false
|
||
|
// - returns null
|
||
|
//
|
||
|
// If the item is already locked by another request:
|
||
|
// - set 'locked' to true
|
||
|
// - set 'lockAge' to how long has the item been locked
|
||
|
// - set 'lockId' to the context of the lock
|
||
|
// - returns null
|
||
|
public abstract SessionStateStoreData GetItemExclusive(HttpContext context,
|
||
|
String id,
|
||
|
out bool locked,
|
||
|
out TimeSpan lockAge,
|
||
|
out object lockId,
|
||
|
out SessionStateActions actions);
|
||
|
|
||
|
// Unlock an item locked by GetExclusive
|
||
|
// 'lockId' is the lock context returned by previous call to GetExclusive
|
||
|
public abstract void ReleaseItemExclusive(HttpContext context,
|
||
|
String id,
|
||
|
object lockId);
|
||
|
|
||
|
// Write an item.
|
||
|
// Note: The item is originally obtained by GetExclusive
|
||
|
// Because SessionStateModule will release (by ReleaseExclusive) am item if
|
||
|
// it has been locked for too long, so it is possible that the request calling
|
||
|
// Set() may have lost the lock to someone else already. This can be
|
||
|
// discovered by comparing the supplied lockId with the lockId value
|
||
|
// stored with the state item.
|
||
|
public abstract void SetAndReleaseItemExclusive(HttpContext context,
|
||
|
String id,
|
||
|
SessionStateStoreData item,
|
||
|
object lockId,
|
||
|
bool newItem);
|
||
|
|
||
|
// Remove an item. See the note in Set.
|
||
|
public abstract void RemoveItem(HttpContext context,
|
||
|
String id,
|
||
|
object lockId,
|
||
|
SessionStateStoreData item);
|
||
|
|
||
|
// Reset the expire time of an item based on its timeout value
|
||
|
public abstract void ResetItemTimeout(HttpContext context, String id);
|
||
|
|
||
|
// Create a brand new SessionStateStoreData. The created SessionStateStoreData must have
|
||
|
// a non-null ISessionStateItemCollection.
|
||
|
public abstract SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout);
|
||
|
|
||
|
public abstract void CreateUninitializedItem(HttpContext context, String id, int timeout);
|
||
|
|
||
|
// Called during EndRequest event
|
||
|
public abstract void EndRequest(HttpContext context);
|
||
|
|
||
|
internal virtual void Initialize(string name, NameValueCollection config, IPartitionResolver partitionResolver) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class SessionStateStoreData {
|
||
|
ISessionStateItemCollection _sessionItems;
|
||
|
HttpStaticObjectsCollection _staticObjects;
|
||
|
int _timeout;
|
||
|
|
||
|
public SessionStateStoreData(ISessionStateItemCollection sessionItems,
|
||
|
HttpStaticObjectsCollection staticObjects,
|
||
|
int timeout) {
|
||
|
_sessionItems = sessionItems;
|
||
|
_staticObjects = staticObjects;
|
||
|
_timeout = timeout;
|
||
|
}
|
||
|
|
||
|
virtual public ISessionStateItemCollection Items {
|
||
|
get {
|
||
|
return _sessionItems;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual public HttpStaticObjectsCollection StaticObjects {
|
||
|
get {
|
||
|
return _staticObjects;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual public int Timeout {
|
||
|
get {
|
||
|
return _timeout;
|
||
|
}
|
||
|
|
||
|
set {
|
||
|
_timeout = value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|