2016-11-11 119 views
1

發展正如本文所述,當:https://azure.microsoft.com/en-us/blog/windows-azure-web-sites-how-application-strings-and-connection-strings-work/,Azure的Web應用程序/ Web站點/網上工作可以從環境變量,而不是他們的app.config配置設置(的appSettings,的connectionString)/ web.config中。配置Azure網站/工作應用程序設置本地

例如,如果存在名爲「APPSETTING_appSettingKey」環境變量,它將從app.config中/ web.config中覆蓋以下設置:

<appSettings> 
    <add key="appSettingKey" value="defaultValue" /> 
</appSettings> 

一旦應用程序部署在Azure中也能正常工作,但我想在本地測試時使用相同的方法。

我嘗試在本地命令行來模擬這種:

ConfigurationManager.AppSettings["appSettingKey"] 

當在Azure上運行,它讀出「overridedValue」爲:

> set APPSETTING_appSettingKey=overridedValue 
> MyWebJob.exe 

的Web作業使用訪問該設置預期的,但在本地它從app.config文件讀取值「defaultValue」。

我應該想到這個工作,或者這只是一個Azure的環境下實現的?

我能明顯創造超過ConfigurationManager中模仿這種抽象,但調用需要一個連接字符串而不是一個連接字符串代碼時,這是行不通的。另外,我想使用相同的方法,而不考慮環境來簡化設置的管理。

有3個原因,我需要這樣的:

1)我不喜歡部署到生產,它引用連接字符串等的研究與開發環境web.config文件的想法,是因爲有一個風險可能導致開發設置(在web.config中)用於生產(生產Web應用程序連接到開發數據庫等)的錯誤,例如,如果環境變量命名不正確(在web.config中重命名設置後但忘了在環境變量)

2)我想每個開發者都有自己的獨立雲資源建立開發環境將其重命名(存儲艾科不,數據庫...)。目前,每個人都必須手動編輯.config文件以引用正確的資源,並且在簽入或合併對這些文件的更改時要小心。

3)解決方案可以有需要複製相同的設置(主要的Web應用程序,網站工作,集成測試項目,...)多個項目。這導致了很多工作來確保更新的設置跨所有文件進行復制。如果有,沒有任何實際配置的環境無關的config文件

這將被簡化,每個開發人員會配置一組環境變量的一次,並且能夠使用他們的解決方案的所有部分。

+0

你可以試試'CloudConfigurationManager'? – Thomas

+0

在Azure網站/ Web作業下運行時,ConfigurationManager已經實現了類似於CloudConfigurationManager的行爲。我正在尋找的是一種在本地具有相同行爲的方式(如果存在,覆蓋環境變量的web.config設置)。我將編輯這個問題來解釋爲什麼我需要這個。 – ckarras

+0

@ckarras我認爲你遇到的一個問題是,當你定義一個本地使用的應用程序設置時,那麼該應用程序設置(這可能是一個祕密)被部署到Azure,正如你所說,你不'不想要。您可能會發現使用web.config轉換在部署之前從配置文件中刪除這些值會很有幫助。對於webjobs(或任何具有app.config的項目),您需要使用SlowCheetah nuget包https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms。 – Howiecamp

回答

-1

如果你想測試與將在Azure的門戶網站的AppSettings /連接字符串中使用的的應用價值。我會推薦使用HostingEnvironment.IsDevelopmentEnvironment。爲確保它能正常工作,請將<compilation debug="true" targetFramework="4.5.2" />更改爲<compilation debug="false" targetFramework="4.5.2" />。如果(HostingEnvironment.IsDevelopmentEnvironment == false)在Azure門戶中使用相同的值設置值。我有一個簡單的項目嘗試,希望它有助於:

 public ActionResult Index() 
     { 
      if (HostingEnvironment.IsDevelopmentEnvironment == true) 
      { 
       ViewBag.Message = "Is development."; 
      } 
      else 
      { 
       ViewBag.Message = "Azure environment."; 
      } 
      return View(); 

     } 

下面是結果:

enter image description here

+0

題外話,這根本不回答我的問題。無論IsDevelopmentEnvironment的值如何,我都會得到相同的行爲:app.config/web.config中指定的appSettings不會被APPSETTING_settingName環境變量中指定的值覆蓋。 – ckarras

2

是,環境變量的這一特殊轉變爲配置值是通過做組件,它特定於Azure WebApps,並且不會在本地運行。

通常情況下,人們對本地產生的行爲很滿意 - 本地通常是從配置設置讀取的,但在Azure中,您正在通過應用設置門戶網站刀片配置的安全設置進行讀取(因此, t在你的源代碼中)。如果你願意,你可以寫一個抽象概念,例如, WebJobs SDK實際上在內部執行此操作(代碼here)。

+0

我認爲OP的問題之一是,如果他定義了本地使用的應用程序設置,那麼應用程序設置(可能是個祕密)將部署到Azure。我認爲OP需要web.config轉換,或者更專門針對webjobs SlowCheetah nuget包https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms,它允許轉換非web.config文件。 – Howiecamp

相關問題