通过程序修改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文件的操作方法总结