.net webService儲存全域性變數中
阿新 • • 發佈:2018-12-18
遇到坑,然後找到解決方案,我就習慣做個記錄。
情景:通過webservice呼叫一個第三方的庫,在初始化第三方庫的時候需要花費較長時間
目的:希望通過初始化一次,快取下來,下次直接呼叫,而不必每次初始化。
處理思路:在web專案中新增全域性應用程式類(Global.cs),通過其Application_Start事件完成初始化,初始化後儲存到一個靜態類檔案的靜態物件中,需要的時候從靜態物件中獲取。
技術預研:
預研一、使用字串作為初始化的物件,達到預期目的,能存能取。
預研二、使用第三方物件作為初始化物件,能存不能取。發現每次呼叫webservice方法時:
a.Application_Start事件會被觸發,造成每次都初始化。
b.之前初始化的變數為空。
不甘心,以為是初始化快取方法不對,然後嘗試了Application、HttpContext.Chache燈方式來儲存初始化物件,得到相同的結果。
結論:事實似乎證明:使用基本的資料型別成功,使用其他物件型別不成功,複雜的資料物件(這裡指的是第三方的物件)會造成微博webservice的每次呼叫都重啟應用(即:觸發Application_Start事件)。
後來嘗試將複雜物件儲存到資料字典中,居然成功了。
終極結論:
在使用webservice儲存全域性變數的時,遇到複雜物件,需要將物件嵌入到資料字典(Dictionary)中 ,否則會觸發webservice 應用重啟。
記住,在初始化的方法裡面,不能出現其他複雜變數的引用,否則又會悲劇。
下面是程式碼:
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { if (AppContext.toolDic.Count == 0) { AppContext.InitQueueToolsDic(); } } }
public static class AppContext { #region 初始化 QueueTools,使用 AppContext.toolDic["QueueTools"] 獲取到初始化後的例項 /// <summary> /// 初始化字典 /// </summary> public static Dictionary<string, QueueTools> toolDic = new Dictionary<string, QueueTools>(); /// <summary> /// 初始化佇列物件,新增到字典 /// </summary> public static void InitQueueToolsDic() { //writelog("初始0 ");這裡不能寫日誌,因為寫日誌的方法裡出現複雜變數會造成服務重啟 string ConfigFile = AppDomain.CurrentDomain.BaseDirectory + "bin\\esbmqsdk-config.xml"; var queueTls = new QueueTools(ConfigFile); toolDic.Add("QueueTools", queueTls);
} #endregion 初始化 QueueTools }