我遇到的问题与此问题有些相似: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>
标记的错误,如果我添加该标记,该网站会抛出关于标记存在的错误!这里没有胜利的情况......有没有人对如何解决这个问题有任何想法?理想情况下,如果有一种方法可以正确修改仅作为主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 { }
}
答案 0 :(得分:1)
您可以在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"];