一个静态数据管理类,实现了ViewState(Ajax中常常丢失信息)和Session(可能超时,TimeOut设太长会影响性能)。结合前面说的监视线程可以集中管理服务器所需的数据,进而可以根据服务器的当前性能自发调整操作。
环境:.NET,C#
/// <summary>
/// 页面状态类
/// </summary>
public class ViewStateOpt
{
public class ViewStateEx
{
public class ____Data____
{
public string name;
public object value;
public bool isImportant;
public ____Data____(string keyName, object keyValue, bool isPub)
{
this.name = keyName;
this.value = keyValue;
this.isImportant = isPub;
}
}
public string sessionId;
private IList<____Data____> viewStateData;
/// <summary>
/// 当前状态变量数,只读
/// </summary>
public int DataNumber
{
get { return viewStateData.Count; }
}
/// <summary>
///构造函数
/// </summary>
public ViewStateEx(string sessionId)
{
this.sessionId = sessionId;
this.viewStateData = new List<____Data____>();
}
/// <summary>
///访问状态变量
/// </summary>
public object this[string keyName]
{
get
{
foreach (____Data____ data in viewStateData)
{
if (data.name == keyName.Trim())
return data.value;
}
return null;
}
set
{
foreach (____Data____ data in viewStateData)
{
if (data.name == keyName.Trim())
{
data.value = value;
return;
}
}
viewStateData.Add(new ____Data____(keyName, value, false));
}
}
/// <summary>
/// 增加一个状态变量
/// 可以指定为全局变量
/// </summary>
public void Add(string keyName, object keyValue, bool isPub)
{
viewStateData.Add(new ____Data____(keyName, keyValue, isPub));
}
/// <summary>
/// 删除一个状态变量
/// </summary>
public bool Delete(string keyName)
{
foreach (____Data____ data in viewStateData)
{
if (data.name == keyName)
{
viewStateData.Remove(data);
return true;
}
}
return false;
}
/// <summary>
/// 清除所有临时状态变量
/// </summary>
public int Clear()
{
int num = 0;
for (int i = 0; i < viewStateData.Count; )
{
if (viewStateData.isImportant == false)
{
viewStateData.RemoveAt(i);
num++;
}
else
i++;
}
return num;
}
/// <summary>
/// 清除所有状态变量
/// </summary>
public int ClearAll()
{
int num = 0;
num = viewStateData.Count;
viewStateData.Clear();
return num;
}
}
static protected int objectNumber = 0;
private IList<ViewStateEx> sessionData;
/// <summary>
/// 当前已创建的实例数,只读
/// </summary>
public int ObjectNumber
{
get { return objectNumber; }
}
/// <summary>
/// 当前会话数,只读
/// </summary>
public int SessionNumber
{
get { return sessionData.Count; }
}
/// <summary>
/// 会话变量数
/// </summary>
public int viewStateNum(int index)
{
if (index >= SessionNumber)
return -1;
return sessionData[index].DataNumber;
}
/// <summary>
/// 默认构造函数
/// </summary>
public ViewStateOpt()
{
sessionData = new List<ViewStateEx>();
objectNumber++;
}
/// <summary>
///访问当前会话状态变量
/// </summary>
public object this[string keyName]
{
get
{
ViewStateEx inData = CurrentViewState();
if (inData == null)
return null;
return inData[keyName];
}
set
{
ViewStateEx inData = CurrentViewState();
if (inData == null)
{
inData = new ViewStateEx(new SessionIDManager().GetSessionID(HttpContext.Current));
sessionData.Add(inData);
}
inData[keyName] = value;
}
}
/// <summary>
/// 增加一个当前会话的状态变量
/// 可以指定为全局变量
/// </summary>
public void Add(string keyName, object keyValue, bool isPub)
{
ViewStateEx inData = CurrentViewState();
if (inData == null)
{
inData = new ViewStateEx(new SessionIDManager().GetSessionID(HttpContext.Current));
sessionData.Add(inData);
}
inData.Add(keyName, keyValue, isPub);
}
/// <summary>
/// 删除当前会话的一个状态变量
/// </summary>
public bool Delete(string keyName)
{
ViewStateEx inData = CurrentViewState();
if (inData == null)
return false;
return inData.Delete(keyName);
}
/// <summary>
/// 清除当前会话的所有临时状态变量
/// </summary>
public int Clear()
{
ViewStateEx inData = CurrentViewState();
if (inData == null)
return 0;
return inData.Clear();
}
/// <summary>
/// 删除指定会话及其所有变量
/// </summary>
public int DelViewState(string sessionId)
{
int num = 0;
sessionId = sessionId.Trim();
foreach (ViewStateEx data in sessionData)
{
if (data.sessionId == sessionId)
{
num = data.ClearAll() + 1;
sessionData.Remove(data);
break;
}
}
return num;
}
/// <summary>
/// 获取当前会话的所有状态变量
/// </summary>
private ViewStateEx CurrentViewState()
{
foreach (ViewStateEx data in sessionData)
{
if (data.sessionId == new SessionIDManager().GetSessionID(HttpContext.Current))
return data;
}
return null;
}
}