写入.config文件

时间:2015-06-17 02:24:11

标签: asp.net-mvc web-config configuration-files nlog

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

背景

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

我做了什么

  1. 将connectionString属性更改为connectionStringName。示例: connectionStringName =“NLogConnection”

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

  3. 相应地更新web.config:

  4. <connectionStrings configSource="ConnectionStrings.config" />

    1. 编写代码如下:
    2. 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>标记的错误,如果我添加该标记,该网站会抛出关于标记存在的错误!这里没有胜利的情况......有没有人对如何解决这个问题有任何想法?理想情况下,如果有一种方法可以正确修改仅作为主Web配置的一部分的外部.config文件,那将是很好的。我可能不得不恢复手动读取/写入原始XML ..但我不想,如果有更好/更优雅的方式。

      非常感谢@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 { }
              }
      

1 个答案:

答案 0 :(得分:1)

您可以在NLog中以编程方式更改设置,但是您无法将这些设置序列化为XML。

你能做什么:

  1. 将设置保存到更改时的<appSettings>
  2. 在需要时阅读<appSettings>
  3. 例如

    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"];