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

原文地址:https://www.cnblogs.com/zmxmiss/p/1790642.html