[C#,windows]設定windows環境變數,與自動切換SectionGroup 取得需要的appSetting資料

 寫好的程式,有時候可能部屬到不同的環境上,而有時候不同環境還有可能搭配不同的參數,此時寫在web.config的參數要如何切換不同環境取得不同參數值呢?

這邊提供一個思維,首先我們在各個環境上都建立一個環境變數,讓我們程式可以辨認目前是在哪一個環境上(若此環境變數未建立,預設是本機環境),並在web.config上建立「sectionGroup」,給予不同的「appSettings」值,如此一來便可以達到需求效果。

實作:

1.設定系統環境參數

    (1)以系統管理員開啟PowerShell


   (2)輸入欲設定的環境變數

  <!--本機-->
[environment]::SetEnvironmentvariable("Test_STAGING", "Dev", "Machine")
  <!--客戶正式機-->
[environment]::SetEnvironmentvariable("Test_STAGING", "pr", "Machine")
  <!--客戶測試機-->
[environment]::SetEnvironmentvariable("Test_STAGING", "qa", "Machine")
  <!--公司測試機-->
[environment]::SetEnvironmentvariable("Test_STAGING", "ta", "Machine")

ps:「Test_STAGING」是環境變數名稱,可以隨意取,Dev,pr,qa,ta通常代表本機,客戶正式機,客戶測試機,公司測試機可以依環境選擇設定,這邊範例選擇設定的是本基環境。

*檢查是否有設定成功
[environment]::GetEnvironmentVariable('Test_STAGING', "Machine")


*方法二 在 進階系統設定 設定環境變數




2.建立 終端解析 Helper

 /// <summary>
    /// Endpoint Helper
    /// </summary>
    public static class EndpointHelper
    {
        public static readonly NameValueCollection AppSettings = GetConfigurationUsingAppSettings();

        /// <summary>
        /// 取得當前環境 AppSettings
        /// </summary>
        /// <returns></returns>
        private static NameValueCollection GetConfigurationUsingAppSettings()
        {
            var configName = GetMachineAppSettings();
            var postSetting = ConfigurationManager.GetSection(configName) as NameValueCollection;
            return postSetting;
        }
        /// <summary>
        /// 取得目前程式運行設備AppSettings
        /// </summary>
        /// <returns></returns>
        private static string GetMachineAppSettings()
        {
            var value = GetEnvironmentVariable("Test_STAGING");
            var machineName = value == null ? string.Empty : value.Trim().ToLower();
            var DefaultmachineName = nameof(EndpointType.dev);
            var group = "/appSettings";

            string[] scopes = { nameof(EndpointType.dev), nameof(EndpointType.ta), nameof(EndpointType.qa), nameof(EndpointType.pr) };
            var scope = scopes.FirstOrDefault(x => x == value);
            machineName = string.IsNullOrWhiteSpace(scope) ? DefaultmachineName : scope;

            return machineName + group;
        }
        /// <summary>
        /// 取得環境變數
        /// </summary>
        /// <param name="name"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static string GetEnvironmentVariable(string name, EnvironmentVariableTarget target = default)
        {
            var value = default(string);

            for (EnvironmentVariableTarget t = target; t <= EnvironmentVariableTarget.Machine; t++)
            {
                if (!string.IsNullOrWhiteSpace(value = Environment.GetEnvironmentVariable(name, t)))
                {
                    break;
                }
            }

            return value;
        }
    }
    /// <summary>
    /// 終端類型
    /// </summary>
    public enum EndpointType
    {
        /// <summary>
        /// 本機
        /// </summary>
        [Display(Name = "本機", Description = "本機")]
        dev,
        /// <summary>
        /// 公司測試機
        ///</summary>
        [Display(Name = "公司測試機", Description = "公司測試機")]
        ta,
        /// <summary>
        /// 客戶測試機
        /// </summary>
        [Display(Name = "客戶測試機", Description = "客戶測試機")]
        qa,
        /// <summary>
        /// 客戶正式機
        /// </summary>
        [Display(Name = "客戶正式機", Description = "客戶正式機")]
        pr,

    }

3.在web.config 寫入sectionGroup 以及各環境appSettings參數

<!--sectionGroup-->
	<configSections>
		<sectionGroup name="dev">
			<section name="appSettings" type="System.Configuration.NameValueSectionHandler" />
		</sectionGroup>
		<sectionGroup name="ta">
			<section name="appSettings" type="System.Configuration.NameValueSectionHandler" />
		</sectionGroup>
		<sectionGroup name="qa">
			<section name="appSettings" type="System.Configuration.NameValueSectionHandler" />
		</sectionGroup>
		<sectionGroup name="pr">
			<section name="appSettings" type="System.Configuration.NameValueSectionHandler" />
		</sectionGroup>
	</configSections>

	<!--本機-->
	<dev>
		<appSettings>
			<add key="NowEnvironment" value="devTest" />
		</appSettings>
	</dev>
	<!--公司測試機-->
	<ta>
		<appSettings>
			<add key="NowEnvironment" value="taTest" />
		</appSettings>
	</ta>
	<!--客戶測試機-->
	<qa>
		<appSettings>
			<add key="NowEnvironment" value="qaTes" />
		</appSettings>
	</qa>
	<!--客戶正式機-->
	<pr>
		<appSettings>
			<add key="NowEnvironment" value="prTest" />
		</appSettings>
	</pr>

4.結果:結果取得本機所需「NowEnvironment」參數值

  public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var NowEnvironment = EndpointHelper.AppSettings["NowEnvironment"];
            return View();
        }    
    }





留言

這個網誌中的熱門文章

[Visual Studio]位於網際網路或是限制區域上 或是檔案上標有 web 字樣 所以無法處理該檔案。若希望處理這些檔案 請移除 web 字樣。

[IIS] IIS執行時,發生拒絕存取路徑 問題

[windows] xcopy 備份至 「網路磁碟機」