1. 程式人生 > >.net webService儲存全域性變數中

.net webService儲存全域性變數中

遇到坑,然後找到解決方案,我就習慣做個記錄。

情景:通過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 }