
這段時(shí)間,研究Flash結合c#上傳文件,在個(gè)別瀏覽器下遇到了緩存丟失問(wèn)題,通過(guò)全局緩存機制并結合Key取值方式得到了解決。但問(wèn)題似乎并沒(méi)處理的完美 ----- 就是會(huì )留下一個(gè)隨著(zhù)訪(fǎng)問(wèn)越來(lái)越大的Application,這里,算是對此類(lèi)問(wèn)題終極解決吧,不敢私藏,特拿來(lái)與各位分項 代碼如下:
/// <summary>
/// 網(wǎng)站全局緩存類(lèi)(可以封裝于DLL)
/// </summary>
public class Cache
{
/// <summary>
/// 強制清除所有服務(wù)端此程序產(chǎn)生的緩存
/// 可能對同時(shí)在線(xiàn)的其他用戶(hù)造成數據丟失風(fēng)險
/// </summary>
public static void Dispose()
{
HttpContext.Current.Application["Session"] = null;
}
public static void Clear()
{
Hashtable SessionTab = new Hashtable();
if (HttpContext.Current.Application["Session"] != null)
{
SessionTab = HttpContext.Current.Application["Session"] as Hashtable;
Hashtable VTab = new Hashtable();
ArrayList DeleteKey = new ArrayList();
//HttpContext.Current.Response.Write("總計:" + SessionTab.Count + "<br/>");
foreach (System.Collections.DictionaryEntry Obj in SessionTab)
{
//HttpContext.Current.Response.Write(Obj.Key + "<br/>");
VTab = Obj.Value as Hashtable;
// 獲取時(shí)間
// HttpContext.Current.Response.Write(VTab["創(chuàng )建時(shí)間"] + "<br/>");
DateTime Old_Time = (DateTime)VTab["創(chuàng )建時(shí)間"];
double Over_Time = (double)VTab["過(guò)期時(shí)間"];
DateTime Now_Time = DateTime.Now;
//HttpContext.Current.Response.Write(Old_Time + "<br/>");
//// 檢查過(guò)期
if ((Now_Time - Old_Time).TotalMilliseconds >= Over_Time)
{
DeleteKey.Add(Obj.Key);
//HttpContext.Current.Response.Write(Obj.Key + "超時(shí)<br/>");
}
}
for (int i = 0; i < DeleteKey.Count; i++)
{
SessionTab.Remove(DeleteKey[i]);
//HttpContext.Current.Response.Write(DeleteKey[i] + "被清理了<br/>");
}
}
}
/// <summary>
/// 注銷(xiāo)并清除當前線(xiàn)程下用戶(hù)的緩存數據
/// </summary>
/// <param name="Key"></param>
public static void Dispose(object Key)
{
if (Key != null)
{
Hashtable SessionTab = new Hashtable();
if (HttpContext.Current.Application["Session"] != null)
{
SessionTab = HttpContext.Current.Application["Session"] as Hashtable;
if (SessionTab.ContainsKey(Key))//若包含,則更新
{
SessionTab.Remove(Key);
}
}
HttpContext.Current.Application["Session"] = SessionTab;
}
}
/// <summary>
/// 設置(同時(shí)起到刷新值的作用)
/// </summary>
/// <param name="Key"></param>
/// <param name="Value"></param>
public static void Init(object Key, object Value)
{
double OverTime = 1000 * 10;
// 毫秒 -- 10 秒(默認)
//10秒過(guò)期,你可以設置的更長(cháng),也可以加入(Init)參數自行設定
if (Key != null)
{
Hashtable SessionTab = new Hashtable();
Hashtable MyValueTab = new Hashtable();
if (HttpContext.Current.Application["Session"] != null)
{
SessionTab = HttpContext.Current.Application["Session"] as Hashtable;
if (SessionTab.ContainsKey(Key))
{
// 存在 修改
MyValueTab = SessionTab[Key] as Hashtable;
MyValueTab[Key] = Value;
SessionTab[Key] = MyValueTab;
}
else
{
// 若有其他信息,再此處添加
MyValueTab.Add(Key, Value);
MyValueTab.Add("創(chuàng )建時(shí)間", DateTime.Now);
MyValueTab.Add("過(guò)期時(shí)間", OverTime);
SessionTab.Add(Key, MyValueTab);
}
}
else
{
// 若有其他信息,再此處添加
MyValueTab.Add(Key, Value);
MyValueTab.Add("創(chuàng )建時(shí)間", DateTime.Now);
MyValueTab.Add("過(guò)期時(shí)間", OverTime);
SessionTab.Add(Key, MyValueTab);
//不存在,首次添加
}
HttpContext.Current.Application["Session"] = SessionTab;
}
Clear(); // 執行后自動(dòng)清理過(guò)期緩存,詞句可以在程序內引用
}
/// <summary>
/// 取值
/// </summary>
/// <param name="Key"></param>
/// <returns></returns>
public static object Value(object Key)
{
if (Key != null)
{
Hashtable SessionTab = new Hashtable();
Hashtable MyValueTab = new Hashtable();
if (HttpContext.Current.Application["Session"] != null)
{
SessionTab = HttpContext.Current.Application["Session"] as Hashtable;
if (SessionTab.ContainsKey(Key))
{
MyValueTab = SessionTab[Key] as Hashtable;
return MyValueTab[Key];
}
else
{
return null;
}
}
else
{
return null;
}
}
else
{
return null;
}
Clear(); // 執行后自動(dòng)清理過(guò)期緩存
}
}
做適當調整后,直接通 Init(object Key, object Value),其他似乎基本用不上,這里方法(Init)命名為Add似更恰當。
代碼中建議在個(gè)別地方進(jìn)行報錯處理(Try...)后使用,若不修改,亦可使用,或許效率稍高一點(diǎn)
聯(lián)系客服