文档章节

DotNet程序配置文件

彭泽0902
 彭泽0902
发布于 2016/11/24 18:47
字数 2202
阅读 5
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

   在实际的项目开发中,对于项目的相关信息的配置较多,在.NET项目中,我们较多的将程序的相关配置直接存储的.config文件中,例如web.config和app.config。

   .NET中配置文件分为两部分:配置的实际内容(位于appSetting节点);指定了节点的处理程序(位于configSections节点)。

   在.NET程序中,.config文件存储相关配置是以xml格式,如果我们需要对配置文件进行读取和写入,以及相关节点的删除,我们可以直接采用处理xml文件的方式进行操作。也可以采用.NET提供的类System.Configuration进行相关操作。

  在System.Configuration类型中,对外提供了几种方法调用,在这里介绍三种较为常用的:AppSettings,ConnectionStrings,GetSection。

  接下来看一下这些方法:

   1.AppSettings属性:

/// <summary>
    /// 获取当前应用程序默认配置的 <see cref="T:System.Configuration.AppSettingsSection"/> 数据。
    /// </summary>
    /// 
    /// <returns>
    /// 返回一个 <see cref="T:System.Collections.Specialized.NameValueCollection"/> 对象,该对象包含当前应用程序默认配置的 <see cref="T:System.Configuration.AppSettingsSection"/> 对象的内容。
    /// </returns>
    /// <exception cref="T:System.Configuration.ConfigurationErrorsException">未能使用应用程序设置数据检索 <see cref="T:System.Collections.Specialized.NameValueCollection"/> 对象。</exception>
    public static NameValueCollection AppSettings { get; }

   2.ConnectionStrings属性:

/// <summary>
    /// 获取当前应用程序默认配置的 <see cref="T:System.Configuration.ConnectionStringsSection"/> 数据。
    /// </summary>
    /// 
    /// <returns>
    /// 返回一个 <see cref="T:System.Configuration.ConnectionStringSettingsCollection"/> 对象,该对象包含当前应用程序默认配置的 <see cref="T:System.Configuration.ConnectionStringsSection"/> 对象的内容。
    /// </returns>
    /// <exception cref="T:System.Configuration.ConfigurationErrorsException">未能检索 <see cref="T:System.Configuration.ConnectionStringSettingsCollection"/> 对象。</exception>
    public static ConnectionStringSettingsCollection ConnectionStrings { get; }

   3.GetSection方法:

/// <summary>
    /// 检索当前应用程序默认配置的指定配置节。
    /// </summary>
    /// 
    /// <returns>
    /// 指定的 <see cref="T:System.Configuration.ConfigurationSection"/> 对象,或者,如果该节不存在,则为 null。
    /// </returns>
    /// <param name="sectionName">配置节的路径和名称。</param><exception cref="T:System.Configuration.ConfigurationErrorsException">未能加载配置文件。</exception>
    public static object GetSection(string sectionName);

以上对几种方法进行了说明,接下来我们具体看一下在项目中对配置文件的操作:

   1.获取配置值:

/// <summary>
        /// 获取配置值
        /// </summary>
        /// <param name="key">节点名称</param>
        /// <returns></returns>
        public static string GetAppSettingValue(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException(key);
            }
            return ConfigurationManager.AppSettings[key];
        }

   2.获取连接字符串:

/// <summary>
        /// 获取连接字符串
        /// </summary>
        /// <param name="name">连接字符串名称</param>
        /// <returns></returns>
        public static string GetConnectionString(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(name);
            }
            return ConfigurationManager.ConnectionStrings[name].ConnectionString;
        }

   3.获取节点的所有属性(处理单个节点):

/// <summary>
        /// 获取节点的所有属性(处理单个节点)
        /// </summary>
        /// <param name="name">节点名称</param>
        /// <returns>属性的Hashtable列表</returns>
        public static Hashtable GetNodeAttribute(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(name);
            }
            return (Hashtable)ConfigurationManager.GetSection(name);
        }

  以上的是三种获取配置文件的相关节点的操作,以下提供几种全局的写入和删除操作方法:

    4.设置配置值(存在则更新,不存在则新增):

/// <summary>
        /// 设置配置值(存在则更新,不存在则新增)
        /// </summary>
        /// <param name="key">节点名称</param>
        /// <param name="value">节点值</param>
        public static void SetAppSettingValue(string key, string value)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException(key);
            }
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentNullException(value);
            }
            try
            {
                var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                var setting = config.AppSettings.Settings[key];
                if (setting == null)
                {
                    config.AppSettings.Settings.Add(key, value);
                }
                else
                {
                    setting.Value = value;
                }

                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("appSettings");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

   5.删除配置值:

/// <summary>
        /// 删除配置值
        /// </summary>
        /// <param name="key">节点名称</param>
        public static void RemoveAppSetting(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException(key);
            }
            try
            {
                var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                config.AppSettings.Settings.Remove(key);
                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("appSettings");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

   6.设置连接字符串的值(存在则更新,不存在则新增):

/// <summary>
        /// 设置连接字符串的值(存在则更新,不存在则新增)
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="connstr">连接字符串</param>
        /// <param name="provider">程序名称属性</param>
        public static void SetConnectionString(string name, string connstr, string provider)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(name);
            }
            if (string.IsNullOrEmpty(connstr))
            {
                throw new ArgumentNullException(connstr);
            }
            if (string.IsNullOrEmpty(provider))
            {
                throw new ArgumentNullException(provider);
            }
            try
            {
                var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                var connStrSettings = config.ConnectionStrings.ConnectionStrings[name];
                if (connStrSettings != null)
                {
                    connStrSettings.ConnectionString = connstr;
                    connStrSettings.ProviderName = provider;
                }
                else
                {
                    connStrSettings = new ConnectionStringSettings(name, connstr, provider);
                    config.ConnectionStrings.ConnectionStrings.Add(connStrSettings);
                }

                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("connectionStrings");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

   7.删除连接字符串配置项:

/// <summary>
        /// 删除连接字符串配置项
        /// </summary>
        /// <param name="name">字符串名称</param>
        public static void RemoveConnectionString(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(name);
            }
            try
            {
                var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                config.ConnectionStrings.ConnectionStrings.Remove(name);
                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("connectionStrings");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

   以上的几种新增和删除操作中,如果测试过就会发现本地的.config文件中没有对应的新增节点,以及需要删除的文件节点也没有删除掉。这个原因主要是”在新增appSettings节点时,不会写入App.config或web.config中,因为AppSetting这样的节点属于内置节点,会存储在Machine.config文件中。.NET内置的处理程序定义于machine.config中,提供全局服务,无须进行任何额外工作就可以直接使用。“

  如果需要对项目中的配置文件进行新增和删除操作,现在提供一种方法,采用对xml文件的操作方式:

     8.更新或新增[appSettings]节点的子节点值,存在则更新子节点Value,不存在则新增子节点,返回成功与否布尔值:

/// <summary>
        /// 更新或新增[appSettings]节点的子节点值,存在则更新子节点Value,不存在则新增子节点,返回成功与否布尔值
        /// </summary>
        /// <param name="filename">配置文件的路径</param>
        /// <param name="key">子节点Key值</param>
        /// <param name="value">子节点value值</param>
        /// <returns>返回成功与否布尔值</returns>
        public static bool UpdateOrCreateAppSetting(string filename, string key, string value)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException(filename);
            }
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException(key);
            }
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentNullException(value);
            }
            var doc = new XmlDocument();
            //加载配置文件
            doc.Load(filename);
            //得到[appSettings]节点
            var node = doc.SelectSingleNode("//appSettings");
            try
            {
                //得到[appSettings]节点中关于Key的子节点
                if (node != null)
                {
                    var element = (XmlElement)node.SelectSingleNode("//add[@key='" + key + "']");
                    if (element != null)
                    {
                        //存在则更新子节点Value
                        element.SetAttribute("value", value);
                    }
                    else
                    {
                        //不存在则新增子节点
                        var subElement = doc.CreateElement("add");
                        subElement.SetAttribute("key", key);
                        subElement.SetAttribute("value", value);
                        node.AppendChild(subElement);
                    }
                }
                //保存至配置文件(方式一)
                using (var xmlwriter = new XmlTextWriter(filename, null))
                {
                    xmlwriter.Formatting = Formatting.Indented;
                    doc.WriteTo(xmlwriter);
                    xmlwriter.Flush();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return true;
        }

   9.更新或新增[connectionStrings]节点的子节点值,存在则更新子节点,不存在则新增子节点,返回成功与否布尔值:

/// <summary>
        /// 更新或新增[connectionStrings]节点的子节点值,存在则更新子节点,不存在则新增子节点,返回成功与否布尔值
        /// </summary>
        /// <param name="filename">配置文件路径</param>
        /// <param name="name">子节点name值</param>
        /// <param name="connectionString">子节点connectionString值</param>
        /// <param name="providerName">子节点providerName值</param>
        /// <returns>返回成功与否布尔值</returns>
        public static bool UpdateOrCreateConnectionString(string filename, string name, string connectionString, string providerName)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException(filename);
            }
            if (string.IsNullOrEmpty(connectionString))
            {
                throw new ArgumentNullException(connectionString);
            }
            if (string.IsNullOrEmpty(providerName))
            {
                throw new ArgumentNullException(providerName);
            }
            var doc = new XmlDocument();
            //加载配置文件
            doc.Load(filename);
            //得到[connectionStrings]节点
            var node = doc.SelectSingleNode("//connectionStrings");
            try
            {
                //得到[connectionStrings]节点中关于Name的子节点
                if (node != null)
                {
                    XmlElement element = (XmlElement)node.SelectSingleNode("//add[@name='" + name + "']");
                    if (element != null)
                    {
                        //存在则更新子节点
                        element.SetAttribute("connectionString", connectionString);
                        element.SetAttribute("providerName", providerName);
                    }
                    else
                    {
                        //不存在则新增子节点
                        var subElement = doc.CreateElement("add");
                        subElement.SetAttribute("name", name);
                        subElement.SetAttribute("connectionString", connectionString);
                        subElement.SetAttribute("providerName", providerName);
                        node.AppendChild(subElement);
                    }
                }
                //保存至配置文件(方式二)
                doc.Save(filename);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return true;
        }

   10.删除[appSettings]节点中包含Key值的子节点,返回成功与否布尔值:

/// <summary>
        /// 删除[appSettings]节点中包含Key值的子节点,返回成功与否布尔值
        /// </summary>
        /// <param name="filename">配置文件路径</param>
        /// <param name="key">要删除的子节点Key值</param>
        /// <returns>返回成功与否布尔值</returns>
        public static bool DeleteByKey(string filename, string key)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException(filename);
            }
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException(key);
            }
            var doc = new XmlDocument();
            //加载配置文件
            doc.Load(filename);
            //得到[appSettings]节点
            var node = doc.SelectSingleNode("//appSettings");
            //得到[appSettings]节点中关于Key的子节点
            if (node != null)
            {
                var element = (XmlElement)node.SelectSingleNode("//add[@key='" + key + "']");
                if (element != null)
                {
                    //存在则删除子节点
                    if (element.ParentNode != null) element.ParentNode.RemoveChild(element);
                }
            }
            try
            {
                //保存至配置文件(方式一)
                using (var xmlwriter = new XmlTextWriter(filename, null))
                {
                    xmlwriter.Formatting = Formatting.Indented;
                    doc.WriteTo(xmlwriter);
                    xmlwriter.Flush();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return true;
        }

   11.删除[connectionStrings]节点中包含name值的子节点,返回成功与否布尔值:

/// <summary>
        /// 删除[connectionStrings]节点中包含name值的子节点,返回成功与否布尔值
        /// </summary>
        /// <param name="filename">配置文件路径</param>
        /// <param name="name">要删除的子节点name值</param>
        /// <returns>返回成功与否布尔值</returns>
        public static bool DeleteByName(string filename, string name)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException(filename);
            }
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(name);
            }
            var doc = new XmlDocument();
            //加载配置文件
            doc.Load(filename);
            //得到[connectionStrings]节点
            var node = doc.SelectSingleNode("//connectionStrings");
            //得到[connectionStrings]节点中关于Name的子节点
            if (node != null)
            {
                var element = (XmlElement)node.SelectSingleNode("//add[@name='" + name + "']");
                if (element != null)
                {
                    //存在则删除子节点
                    node.RemoveChild(element);
                }
            }
            try
            {
                //保存至配置文件(方式二)
                doc.Save(filename);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return true;
        }

   以上对System.Configuration类的几种常用方法做了简单说明,也提供了几种较为常用的操作方法,希望对在项目中需要使用到配置文件的开发人员有用。

© 著作权归作者所有

彭泽0902
粉丝 0
博文 44
码字总数 57771
作品 0
武汉
高级程序员
私信 提问
加载中

评论(0)

ubuntu上部署windows开发的dotnet core程序

目标:完成windows上开发的dotnet core程序部署至linux服务器上(Ubuntu 14.04) windows上开发dotnet core很简单,安装好VS2017,建立相关类型的项目进行开发即可。 Linux服务器中需要做以下...

osc_gaqp1a2z
2018/10/13
6
0
【Core】.NET Core 部署在Linux

一、安装.NET Core SDK 在CentOS上 1.右键打开命令行 2.为了安装.NET,需要注册微软签名密钥和添加微软相关的支持。这个操作每台机器只能做一次。 Add the dotnet product feed(其实就是向微...

osc_vxlxmpgv
2018/08/14
1
0
centos 7 安装 netcoresdk 和Nginx 并发布netcore

微软官网的yum安装: 打开linux终端程序 netcore sdk 地址https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current 选择Linux发行版本 在安装.NET之前,您需要注册M...

osc_cnpchqmq
2019/07/31
2
0
centos7.x docker 跑vs2017发布的asp.net core2.x项目

因为vs2017在windows下配docker支持,要开启docker for windows版本的服务,挺重的,资源消耗颇大,而且最坑爹的是发布并不支持直接发成docker包,还是要你自己去用dockerfile来建立镜像,我...

osc_28q3csny
2018/08/25
1
0
NET Core dotnet 命令大全

NET Core dotnet 命令大全 最新dotnet 命令实战 http://www.cnblogs.com/linezero/p/dotnetcli.html dotnet 命令大全,让你理解dotnet 命令。 本文将以一个实例串起 dotnet 所有命令,让你玩...

osc_77ruf91k
2018/03/08
6
0

没有更多内容

加载失败,请刷新页面

加载更多

db2数据库操作记录

要使用命令行添加实例: 输入命令:db2icrt instance_name。 在 AIX® 服务器上创建实例时,必须提供受防护的用户标识,例如: DB2DIR/instance/db2icrt -u db2fenc1 db2inst1 修改实例用户...

飞雪无痕
11分钟前
19
0
干货:使用Kafka connect 同步数据至Elasticsearch

接着上篇安装完postgresql connect,我们再安装es connect就容易多了; 安装es connector plugins 因为docker 安装的connect容器里没有es的connect plugins,所以我们去 confluent官网下载(...

为何不可1995
12分钟前
19
0
程序员应具备的PS基本技能(一):PS2017基本框架使用

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
14分钟前
22
0
机器学习之Numpy-第1章ndarray多维数组对象

Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。它是所有高级工具的构建基础,Pandas就是构建在Numpy之上。 Numpy最重要的一个特点就是N维数组对象(ndarray),其是一个快...

惊天动地的胖子
15分钟前
7
0
Oracle中分析函数和集合运算的详解

一.分析函数 RANK 相同的值排名相同,排名跳跃 DENSE_RANK 相同的值排名相同,排名连续 ROW_NUMBER 返回连续的排名,无论值是否相等 下图为三种排名方式的举例 --以下三个分析函数可以用于排...

煌sir
15分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部