在我的ASP.NET Web应用程序中,我希望存储一个数据数组,该数据可供网站的所有用户访问,但保留一个状态,可由任何用户登录进行修改。对此最好的方法是什么?我知道我可能会使用Application wide变量的路线,但有更好的选择吗?我还考虑过简单地将状态存储在数据库中并检索每个请求。
提前致谢 伊恩
答案 0 :(得分:2)
最好的方法是通过System.Web.HttpContext.Current.Cache,如果状态不必持久。
缓存在页面上下文中也是可用的。
答案 1 :(得分:1)
我的经验是使用System.Web.HttpContext.Current.Cache
和缓存文件。如果操作系统内存不足,IIS将清除所有缓存。如果要保留所有用户的状态,则应保留文件中的状态副本(序列文件中的对象)。
例如:我想在Cache中保留队列列表以供很多用户使用。如果IIS重置了Cache对象,它可以在缓存文件中读取它。
Stack<string> list = null;
List<string> returnlist = new List<string>();
try
{
if (System.Web.HttpContext.Current.Cache["PushQueueList"] != null)
{
try
{
list = (Stack<string>)System.Web.HttpContext.Current.Cache["PushQueueList"];
}
catch (Exception ex)
{
list = null;
//Log.LogToFile("PushQueueListError1:" + ex.Message);
}
}
if (list == null)//memory cache is null ,then read cache file
{
try
{
list = (Stack<string>)Serialize.DeSerializeObj("pushqueue");//Deserialize object from file
}
catch (Exception ex)
{
list = null;
//Log.LogToFile("PushQueueListError2:" + ex.Message);
}
}
if (list == null || list.Count == 0)
{
if (list!=null && list.Count == 0)
{
return new List<string>();
}
try
{
System.Web.HttpContext.Current.Cache.Remove("PushQueueList");
}
catch (Exception)
{
}
//Log.LogToFile("PushQueueList is empty,reload it");
DataSet ds = DB.GetSendQueueUserIDList(); ;
if (ds != null)
{
list = new Stack<string>();
DataView dv = ds.Tables[0].DefaultView;
for (int i = 0; i < dv.Count; i++)
{
list.Push(dv[i].Row["UserID"].ToString());
}
dv.Dispose();
ds.Dispose();
}
}
}
catch (Exception ex)
{
//Log.LogToFile("PushQueueListError:" + ex.Message);
}
if (list != null && list.Count > 0)
{
for (int i = 0; i < ReturnCount; i++)
{
if (list.Count > 0)
{
returnlist.Add(list.Pop());
}
else
{
Log.LogToFile("PushQueueList OK");
break;
}
}
System.Web.HttpContext.Current.Cache.Add("PushQueueList", list, null, DateTime.Now.AddDays(1),
TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default,
null);
Serialize.SerializeObj(list, "pushqueue");
}
return returnlist;
}
序列方法如下:
public static bool SerializeObj(object obj, string FileName)
{
string LogFileDir = System.Configuration.ConfigurationManager.AppSettings["LogFile"];
if (!System.IO.Directory.Exists(LogFileDir))
{
System.IO.Directory.CreateDirectory(LogFileDir);
}
string FilePath = LogFileDir + FileName + "_" + DateTime.Now.ToString("yyyyMMdd") + ".bin";
try
{
IFormatter _formatter = new BinaryFormatter();
using(Stream _stream = new FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
_formatter.Serialize(_stream, obj);
_stream.Close();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
public static object DeSerializeObj(string FileName)
{
try
{
string LogFileDir = System.Configuration.ConfigurationManager.AppSettings["LogFile"];
if (!System.IO.Directory.Exists(LogFileDir))
{
System.IO.Directory.CreateDirectory(LogFileDir);
}
object objStd = null;
string FilePath = LogFileDir + FileName + "_" + DateTime.Now.ToString("yyyyMMdd") + ".bin";
using(Stream _stream = File.Open(FilePath, FileMode.Open))
{
BinaryFormatter _b = new BinaryFormatter();
objStd = _b.Deserialize(_stream);
_stream.Close();
}
return objStd;
}
catch (Exception ex)
{
return null;
}
}