通过程序修改web.config/app.config文件中的节点(appSettings,connectionStrings,system.web/caching/outputCacheSettings)
今天被告知要做一个修改web.config的一个节点(修改system.web/caching/outputCacheSettings内的一个节点的值)
本想使用xml文件序列化的,但是感觉要重写所有的代码,麻烦!直接google之,最后只找到一个修改appSettings,connectionStrings两个节点的方法),嗯,要求差不多,只是所处的节点不同,深度不同,改改还是能用的.
原方法的中appSettings,connectionStrings两个节点处于web.config的configuration下层次比较简单, 直接使用
using System.Web.Configuration;
using System.Configuration;
Configuration config=config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
但是system.web/caching/outputCacheSettings/outputCacheProfiles可找不到类似System.ConfigurationAppSettingsSection这样的对象供你操作outputCacheProfiles,祭出F1的MSDN大神
终于找到对应的方法:不能直接找到outputCacheProfiles,但可以通过找到outputCacheSettings对象(outputCacheProfiles的父节点对应的对象)来操作outputCacheProfiles
操作system.web/caching/outputCacheSettings/outputCacheProfiles的核心代码:
/// <summary>
/// 添加数据库连接字符串节点,如果已经存在此节点,则会修改该节点的值
/// </summary>
/// <param name="name"></param>
/// <param name="duration"></param>
public void AddoutputCacheProfiles(string name, int duration)
{
///此处可发散为:修改web.config其余的节点也是类似于此处的操作
OutputCacheSettingsSection OutputCacheSettings = (OutputCacheSettingsSection)config.GetSection("system.web/caching/outputCacheSettings");
//此处是outputCacheSettings在web.config下的层次结构,根目录为configuration
if (OutputCacheSettings.OutputCacheProfiles[name] == null)//如果不存在此节点,则添加 { OutputCacheProfile OutputCacheProfiles = new OutputCacheProfile(name); OutputCacheProfiles.Duration = duration; OutputCacheProfiles.Location = System.Web.UI.OutputCacheLocation.Any; OutputCacheProfiles.VaryByParam = "*"; //此处暂时只是修改了duration一个参数,故方法仅一个参数,如果要修改所有的参数,请自行扩充 OutputCacheSettings.OutputCacheProfiles.Add(OutputCacheProfiles); } else//如果存在此节点,则修改 { ModifyoutputCacheProfiles(name, duration); } } /// <summary> /// 修改应用程序配置节点,如果不存在此节点,则会添加此节点及对应的值 /// </summary> /// <param name="name"></param> /// <param name="newduration"></param> public void ModifyoutputCacheProfiles(string name, int newduration) { OutputCacheSettingsSection OutputCacheSettings = (OutputCacheSettingsSection)config.GetSection("system.web/caching/outputCacheSettings"); if (OutputCacheSettings.OutputCacheProfiles[name] != null)//如果不存在此节点,则添加 { OutputCacheSettings.OutputCacheProfiles[name].Duration = newduration; } else//如果不存在此节点,则添加 { AddoutputCacheProfiles(name, newduration); } }
web.config的结构
<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="WebCache" duration="600" location="Any" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<compilation debug="true">
<assemblies>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies></compilation>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
详细代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Windows.Forms;
using System.Web.Configuration;
/// <summary>
/// Summary description for ConfigurationOperator
/// </summary>
public class ConfigurationOperator
{
public enum ConfigType
{
/// <summary>
/// asp.net网站的config文件
/// </summary>
WebConfig = 1,
/// <summary>
/// Windows应用程序的config文件
/// </summary>
ExeConfig = 2
}
private Configuration config;
private string configPath;
private ConfigType configType;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="configType"></param>
public ConfigurationOperator(ConfigType configType)
{
this.configType = configType;
if (configType == ConfigType.ExeConfig)
{
configPath = Application.ExecutablePath;
}
else
{
configPath = HttpContext.Current.Request.ApplicationPath;
}
Initialize();
}
public Configuration Configuration
{
get { return config; }
set { config = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="path">.config文件的位置</param>
/// <param name="type">.config文件的类型,只能是网站配置文件或者应用程序配置文件</param>
public ConfigurationOperator(string configPath, ConfigType configType)
{
this.configPath = configPath;
this.configType = configType;
Initialize();
}
/// <summary>
/// 实例化configuration,根据配置文件类型的不同,分别采取了不同的实例化方法
/// </summary>
private void Initialize()
{
//如果是WinForm应用程序的配置文件
if (configType == ConfigType.ExeConfig)
{
config = System.Configuration.ConfigurationManager.OpenExeConfiguration(configPath);
}
else//WebForm的配置文件
{
config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(configPath);
}
}
/// <summary>
/// 添加应用程序配置节点,如果已经存在此节点,则会修改该节点的值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AddAppSetting(string key, string value)
{
AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
if (appSetting.Settings[key] == null)//如果不存在此节点,则添加
{
appSetting.Settings.Add(key, value);
}
else//如果存在此节点,则修改
{
ModifyAppSetting(key, value);
}
}
/// <summary>
/// 添加数据库连接字符串节点,如果已经存在此节点,则会修改该节点的值
/// </summary>
/// <param name="key"></param>
/// <param name="connectionString"></param>
public void AddConnectionString(string key, string connectionString)
{
ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此节点,则添加
{
ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString);
connectionSetting.ConnectionStrings.Add(connectionStringSettings);
}
else//如果存在此节点,则修改
{
ModifyConnectionString(key, connectionString);
}
}
/// <summary>
/// 添加数据库连接字符串节点,如果已经存在此节点,则会修改该节点的值
/// </summary>
/// <param name="name"></param>
/// <param name="duration"></param>
public void AddoutputCacheProfiles(string name, int duration)
{
///此处可发散为:修改其余的节点也是类似于此处的操作
OutputCacheSettingsSection OutputCacheSettings = (OutputCacheSettingsSection)config.GetSection("system.web/caching/outputCacheSettings");
if (OutputCacheSettings.OutputCacheProfiles[name] == null)//如果不存在此节点,则添加
{
OutputCacheProfile OutputCacheProfiles = new OutputCacheProfile(name);
OutputCacheProfiles.Duration = duration;
OutputCacheProfiles.Location = System.Web.UI.OutputCacheLocation.Any;
OutputCacheProfiles.VaryByParam = "*";
//此处暂时只是修改了duration一个参数,故方法仅一个参数,如果要修改所有的参数,请自行扩充
OutputCacheSettings.OutputCacheProfiles.Add(OutputCacheProfiles);
}
else//如果存在此节点,则修改
{
ModifyoutputCacheProfiles(name, duration);
}
}
/// <summary>
/// 修改应用程序配置节点,如果不存在此节点,则会添加此节点及对应的值
/// </summary>
/// <param name="name"></param>
/// <param name="newduration"></param>
public void ModifyoutputCacheProfiles(string name, int newduration)
{
OutputCacheSettingsSection OutputCacheSettings = (OutputCacheSettingsSection)config.GetSection("system.web/caching/outputCacheSettings");
if (OutputCacheSettings.OutputCacheProfiles[name] != null)//如果不存在此节点,则添加
{
OutputCacheSettings.OutputCacheProfiles[name].Duration = newduration;
}
else//如果不存在此节点,则添加
{
AddoutputCacheProfiles(name, newduration);
}
}
/// <summary>
/// 修改应用程序配置节点,如果不存在此节点,则会添加此节点及对应的值
/// </summary>
/// <param name="key">节点名称</param>
/// <param name="value">节点值</param>
public void ModifyAppSetting(string key, string newValue)
{
AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
if (appSetting.Settings[key] != null)//如果存在此节点,则修改
{
appSetting.Settings[key].Value = newValue;
}
else//如果不存在此节点,则添加
{
AddAppSetting(key, newValue);
}
}
/// <summary>
/// 修改数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值
/// </summary>
/// <param name="key">节点名称</param>
/// <param name="value">节点值</param>
public void ModifyConnectionString(string key, string connectionString)
{
ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
if (connectionSetting.ConnectionStrings[key] != null)//如果存在此节点,则修改
{
connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;
}
else//如果不存在此节点,则添加
{
AddConnectionString(key, connectionString);
}
}
/// <summary>
/// 保存所作的修改
/// </summary>
public void Save()
{
config.Save();
}
}
调用方式:
ConfigurationOperator cop = new ConfigurationOperator(ConfigurationOperator.ConfigType.WebConfig);
//ConfigurationOperator.ConfigType 为一个枚举,用于规范修改的config文件的类型,定义可详见ConfigurationOperator中的定义
cop.AddoutputCacheProfiles("WebCache", 600);
cop.Save();
注意:web.config文件的权限,否则会提示权限不足.
此文中原来修改appSettings,connectionStrings的代码来自.net2.0中对config文件的操作方法总结

浙公网安备 33010602011771号