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

你可能感兴趣的:(Connection)