我有一些項目需要訪問設置,數據庫連接,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中。
當應用程序啓動時,app.config設置被讀入內存。您可以100%更改應用程序配置設置,無需重新編譯我已經完成了很多次。在IIS託管的應用程序中,應用程序池應該被自動回收,但響應可能會被緩存。爲了安全手動重啓應用程序池。 Windows服務和其他應用程序可能也需要重新啓動 –
@ ste-fu我已經回收了應用程序池,重新啓動了應用程序,甚至重新啓動了服務器。我有兩臺服務器 - 名稱完全相同。部署到我編譯的版本 - 工作正常。部署到其他 - 不從配置中選擇設置。 – SteveL
你正在編輯的.config文件的名稱是什麼?它是YourAppliacationName.exe.config *不是* app.config? – aquinas