我有许多需要访问设置,数据库连接,web api url,身份验证服务器URL等的项目,这些项目将根据其部署进行更改。
应用程序可以多次部署到不同的部门,每个部门都有不同的数据库和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获取属性。
我想要做的是能够在运行时从配置文件中获取它们。因此,构建应用程序一次,多次部署,然后只使用部署特定设置更新配置。
我已经尝试使用谷歌搜索并检查SO,但没有找到任何有用的东西。
尝试添加
Properties.Settings.Default.Reload();
根据this post但不起作用。
目标框架= .Net 4.5及其类库。错误消息显示它仍然在编译时从配置文件获取值。 (错误信息不相关,好像它有正确的路径不会出错)
编辑: 现在变得更加困惑。找到以下post,其中提到默认值是要编译的属性,除非您将GenerateDefaultValueInCode设置为false。我已经完成了这个,现在我回到了与为属性返回null的结果相同的结果。出于某种原因,尽管将所有属性的值设置为false,但它们仍然可以嵌入到dll中。
答案 0 :(得分:0)