写入 .config 文件

Writing to .config files

我遇到的问题与这个问题有些相似:C#: Config file error

背景

我的情况是这样的:我正在使用 NLog 并且我已经设置了一个数据库目标。我的应用程序在第一个 运行 上显示了一个安装页面,我从中构建了一个用于其他目的的连接字符串,但也想将相同的连接字符串保存到 NLog.config 文件中。经过大量搜索后,似乎可以通过编程方式更改 NLog,但无论出于何种原因,都无法将更改保存回 .config 文件。因此,我的计划是简单地执行以下操作:

我尝试了什么

  1. 将 connectionString 属性改为简单的 connectionStringName。示例:connectionStringName="NLogConnection"

  2. <connectionStrings> 元素从我的 Web.config 移动到单独的文件:ConnectionStrings.config.

  3. 相应更新web.config:

<connectionStrings configSource="ConnectionStrings.config" />

  1. 编写代码如下:

string filePath = HostingEnvironment.MapPath(Path.Combine(httpRequest.ApplicationPath, "ConnectionStrings.config")); var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath }; var configFile = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); configFile.ConnectionStrings.ConnectionStrings["NLogConnection"].ConnectionString = connectionString; configFile.Save();

结果

看起来是个不错的计划。但是.. 上面的代码会抛出一个关于没有 <configuration> 标签的错误,如果我添加那个标签,网站会抛出一个关于标签存在的错误!这里没有胜利的局面......有没有人对如何解决这个问题有任何想法?理想情况下,如果有一种方法可以正确修改外部 .config 文件,而这些文件只是主 Web 配置的一部分,那就太好了。我可能不得不恢复到手动 reading/writing 原始 XML.. 但如果有 better/more 优雅的方式,我宁愿不要这样做。

解决方案

非常感谢@Julian;我现在有一个可行的解决方案。我在 Global.asax:

中添加了这个
private static void TryUpdateNLogConnectionString(string connectionString)
        {
            try
            {
                var target = LogManager.Configuration.FindTargetByName("database");

                DatabaseTarget databaseTarget = null;
                var wrapperTarget = target as WrapperTargetBase;

                // Unwrap the target if necessary.
                if (wrapperTarget == null)
                {
                    databaseTarget = target as DatabaseTarget;
                }
                else
                {
                    databaseTarget = wrapperTarget.WrappedTarget as DatabaseTarget;
                }

                databaseTarget.ConnectionString = connectionString;
            }
            catch { }
        }

您可以在 NLog 中以编程方式更改设置,但是您还不能将这些设置序列化到 XML。

你能做什么:

  1. 更改后将设置保存到<appSettings>
  2. 需要时阅读<appSettings>

例如

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
config.AppSettings.Settings["NlogConnectionString"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

在 NLog 中需要时编辑连接字符串:

DatabaseTarget databaseTarget = LogManager.Configuration.FindTargetByName(targetName) as DatabaseTarget;
databaseTarget.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["NlogConnectionString"];