我可以在运行时从app.config获取设置而不是在编译时获取设置吗?

时间:2017-06-28 13:26:46

标签: c# .net app-config

我有许多需要访问设置,数据库连接,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中。

1 个答案:

答案 0 :(得分:0)

发现它! 问题发生在类库中。 虽然我在类库中创建了设置,并且设置已添加到app.config中,但它实际上并不是在那里检索它们。相反,它是使用类库的父级的web.config。 我把设置放在web.config中,它似乎工作。

相关问题