2017-06-28 49 views
0

我有一些項目需要訪問設置,數據庫連接,Web API API,認證服務器URL等,這將取決於其部署。我可以在運行時從app.config中獲取設置,而不是在編譯時?

應用程序可以多次部署到不同的部門,每個部門都有不同的數據庫和Web服務器。

最初我使用appSettings並將它們作爲屬性公開。這似乎是通過IDE進行開發的工作(Visual Studio 2013)。

我按照建議here爲了得到正確的位置,它似乎工作。 所以最初我:

private static KeyValueConfigurationCollection GetAppSettings() 
    { 
     // The dllPath can't just use Assembly.GetExecutingAssembly().Location as ASP.NET doesn't copy the config to shadow copy path 
     var dllPath = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath; 
     var dllConfig = ConfigurationManager.OpenExeConfiguration(dllPath); 

     // Get the appSettings section 
     var appSettings = (AppSettingsSection)dllConfig.GetSection("appSettings"); 
     return appSettings.Settings; 
    } 

public string AknowledgeSTSOrigin 
     { 
      get 
      { 
       string setting; 
       if (_aknowledgeSTSOrigin != null) 
       { 
        setting = _aknowledgeSTSOrigin; 
       } 
       else 
       { 
        if (System.Diagnostics.Debugger.IsAttached) 
        { 
         setting = "https://localhost:44333"; 
        } 
        else 
        { 
         var settings = GetAppSettings(); 
         if (settings.Count > 0) 
         { 
          setting = settings["AknowledgeSTSOrigin"].Value; 
         } 
         else 
         { 
          setting = System.Configuration.ConfigurationManager.AppSettings["AknowledgeSTSOrigin"]; 
         } 
        } 
        _aknowledgeSTSOrigin =setting; 
       } 
       return setting; 
      } 
     } 

在某個時候停止工作 - 但不幸的是我已經當或爲什麼,因爲我在IDE中運行,所以它總是默認爲調試附加條件不知道。 現在的問題是,上述所有路線都從appSettings返回null。 在搜索問題時,我發現現在建議使用項目屬性。我這麼做了 - 在app.config中出現了一個新的ApplicationSettings部分,並找到了屬性。 所以上面得到了簡化爲:

setting = Properties.Settings.Default.AknowledgeSTSOrigin; 

這偉大的工作,我設置的值爲localhost,以測試在IDE中運行 - 都很好。我編譯併發布了應用程序,然後嘗試更改服務器上的app.config。它仍然不能在服務器上工作。但是,如果我在我的機器上更改了app.config以進行服務器設置,重新生成併發布它,它就會起作用。

因此,看起來這個方法在編譯時從app.config中獲取了屬性。

我想要做的是能夠在運行時從配置文件中獲取它們。因此,構建應用程序一次,多次部署,然後僅使用部署特定設置更新配置。

我試過使用谷歌搜索和檢查,但沒有發現任何有用的東西。

嘗試添加

Properties.Settings.Default.Reload(); 

this post,但不工作。

Target Framework = .Net 4.5及其一個類庫。錯誤消息顯示它仍然在編譯時從配置文件獲取值。 (錯誤消息不相關,就好像它有正確的路徑不會有錯誤)

EDIt: 現在變得更加困惑。發現以下post其中提到的默認值是要編譯的屬性,除非您將GenerateDefaultValueInCode設置爲false。我已經完成了這一步,現在我回到了同樣的結果,因爲它返回null爲屬性。由於某些原因,儘管將所有屬性的值設置爲false,但它們仍然可見,並且嵌入在dll中。

+0

當應用程序啓動時,app.config設置被讀入內存。您可以100%更改應用程序配置設置,無需重新編譯我已經完成了很多次。在IIS託管的應用程序中,應用程序池應該被自動回收,但響應可能會被緩存。爲了安全手動重啓應用程序池。 Windows服務和其他應用程序可能也需要重新啓動 –

+0

@ ste-fu我已經回收了應用程序池,重新啓動了應用程序,甚至重新啓動了服務器。我有兩臺服務器 - 名稱完全相同。部署到我編譯的版本 - 工作正常。部署到其他 - 不從配置中選擇設置。 – SteveL

+0

你正在編輯的.config文件的名稱是什麼?它是YourAppliacationName.exe.config *不是* app.config? – aquinas

回答

0

找到了! 問題發生在類庫中。 儘管我在類庫中創建了設置,並且設置被添加到了app.config中,但它實際上並不是在那裏檢索它們。相反,它是使用類庫的父級的web.config。 我把設置在web.config中,它似乎工作。

相關問題