zoukankan      html  css  js  c++  java
  • 通过程序修改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文件的操作方法总结

  • 相关阅读:
    分布式-信息方式-ActiveMQ的Destination高级特性3
    分布式-信息方式-ActiveMQ的Destination高级特性2
    分布式-信息方式-ActiveMQ的Destination高级特性1
    分布式-信息方式-ActiveMQ的集群
    分布式-信息方式-ActiveMQ的动态网络链接
    分布式-信息方式-ActiveMQ静态网络连接的容错
    分布式-信息方式-ActiveMQ静态网络连接信息回流功能
    分布式-信息方式-ActiveMQ静态网络连接多线程的consumer(消费者)访问集群
    java-day12
    java-day11
  • 原文地址:https://www.cnblogs.com/zmxmiss/p/1790642.html
Copyright © 2011-2022 走看看