更改windows服務的配置文件(app.config)必須重啟服務才能生效嗎?


這個問題是前一階段寫windows服務碰到的。本來在寫獲取配置文件的某個配置的值的時候,通常我都是寫類似下面的這么一個靜態方法來獲取:

   1:          /// <summary>
   2:          /// 獲取每次處理記錄數
   3:          /// </summary>
   4:          /// <returns></returns>
   5:          private static int GetRecordCount()
   6:          {
   7:              int recordCount = 10000;
   8:              try
   9:              {
  10:                  recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"]));
  11:                  if (recordCount==0)
  12:                  {
  13:                      recordCount = 10000;
  14:                  }
  15:              }
  16:              catch 
  17:              {
  18:                  recordCount = 10000;
  19:              }
  20:              return recordCount;
  21:          }

RecordCount表示每次從數據庫讀取的記錄數。在服務寫好安裝后測試的時候,這個參數改過好幾次,起初它的默認值是10000,后來分別改過為500,100,50和10。可是改完之后我不得不重啟服務才能讓配置文件起作用。經過幾次這種折騰之后,感覺體驗太差了。上網一搜,找到了這一篇:Do you have to restart a windows service if you change the app.config? 在原問題中,一個哥們給出了解答,就是通過ConfigurationManager.RefreshSection刷新某一配置節點,我們獲取配置值的時候就不需要重啟服務了:

        /// <summary>
        /// 獲取每次處理記錄數 /// </summary> /// <returns></returns> private static int GetRecordCount() { int recordCount = 10000; try { ConfigurationManager.RefreshSection("appSettings");// 刷新命名節,在下次檢索它時將從磁盤重新讀取它。 recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"])); if (recordCount == 0) { recordCount = 10000; } } catch { recordCount = 10000; } return recordCount; }

經過測試,確實如此。

你可能會問,為什么加了那一行ConfigurationManager.RefreshSection(命名節點);就可以了呢?

查看MSDN,解釋是這樣的:“刷新命名節,這樣在下次檢索它時將從磁盤重新讀取”。下面是VS里的函數說明:

        //
        // 摘要: // 刷新命名節,這樣在下次檢索它時將從磁盤重新讀取它。 // // 參數: // sectionName: // 要刷新的節的配置節名稱或配置路徑和節名稱。 public static void RefreshSection(string sectionName);

原來,更改配置文件之后,應用程序讀取配置的順序不是從物理文件讀取,而是從其緩存中讀取(ConfigurationManager.RefreshSection方法在不影響其他節的前提下使指定配置節的緩存失效),必須強制刷新配置文件,才能讀取到更改后的配置節信息 。

毫無疑問,和正常的讀取配置文件節點方法相比,這個讀取配置的方法在性能上應該有點影響,至於損失多少,會不會造成性能瓶頸,你懂的。

最后,從MSDN的例子我們也可以看出來,這個方法對於動態寫入/讀取配置文件非常有效。不過對於web應用程序這個方法可能不適合,因為大家知道,修改web.config相當於重啟了web應用程序。

 

 轉載自:http://www.cnblogs.com/jeffwongishandsome/archive/2011/04/24/2026381.html
 
程序員的基礎教程: 菜鳥程序員


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM