写入 .config 文件
Writing to .config files
我遇到的问题与这个问题有些相似:C#: Config file error
背景
我的情况是这样的:我正在使用 NLog 并且我已经设置了一个数据库目标。我的应用程序在第一个 运行 上显示了一个安装页面,我从中构建了一个用于其他目的的连接字符串,但也想将相同的连接字符串保存到 NLog.config 文件中。经过大量搜索后,似乎可以通过编程方式更改 NLog,但无论出于何种原因,都无法将更改保存回 .config 文件。因此,我的计划是简单地执行以下操作:
我尝试了什么
将 connectionString 属性改为简单的 connectionStringName。示例:connectionStringName="NLogConnection"
将 <connectionStrings>
元素从我的 Web.config 移动到单独的文件:ConnectionStrings.config.
相应更新web.config:
<connectionStrings configSource="ConnectionStrings.config" />
- 编写代码如下:
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。
你能做什么:
- 更改后将设置保存到
<appSettings>
- 需要时阅读
<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"];
我遇到的问题与这个问题有些相似:C#: Config file error
背景
我的情况是这样的:我正在使用 NLog 并且我已经设置了一个数据库目标。我的应用程序在第一个 运行 上显示了一个安装页面,我从中构建了一个用于其他目的的连接字符串,但也想将相同的连接字符串保存到 NLog.config 文件中。经过大量搜索后,似乎可以通过编程方式更改 NLog,但无论出于何种原因,都无法将更改保存回 .config 文件。因此,我的计划是简单地执行以下操作:
我尝试了什么
将 connectionString 属性改为简单的 connectionStringName。示例:connectionStringName="NLogConnection"
将
<connectionStrings>
元素从我的 Web.config 移动到单独的文件:ConnectionStrings.config.相应更新web.config:
<connectionStrings configSource="ConnectionStrings.config" />
- 编写代码如下:
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。
你能做什么:
- 更改后将设置保存到
<appSettings>
- 需要时阅读
<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"];