1. 程式人生 > >.net webService保存全局變量中

.net webService保存全局變量中

需要 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保存全局變量中