.net webService保存全局變量中
阿新 • • 發佈:2018-12-18
需要 ren queue 嵌入 發現 寫日誌 dict 三方 config
遇到坑,然後找到解決方案,我就習慣做個記錄。
情景:通過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 }
.net webService保存全局變量中