配置文件

 

 

一.基础 >>>


1.配置文件概述: 

  应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。

  常见配置文件模式:

 

 

<configuration>

 

 

        <configSections> //配置节声明区域,包含配置节和命名空间声明

 

 

<section> //配置节声明

 

 

<sectionGroup> //定义配置节组

 

 

   <section> //配置节组中的配置节声明

 

 

<appSettings> //预定义配置节,针对整个程序的配置

 

 

<Custom element for configuration section> //配置节设置区域

<userSetting> //针对当前用户的配置

 

 


2.只有appSettings节的配置文件及访问方法


  下面是一个最常见的应用程序配置文件的例子,只有appSettings节。

<?xml version="1.0" encoding="utf-8"?>

<configuration>

     <appSettings>

<add key="connectionstring" value="User ID=sa;Data Source=.;Password=;

Initial Catalog=test;Provider=SQLOLEDB.1;" />

<add key="TemplatePATH" value="Template" />

</appSettings>

</configuration>


  下面来看看这样的配置文件如何读取。

string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];

  使用ConfigurationSettings类的静态属性AppSettings就可以直接读取配置文件中的配置信息。这个属性的类型是NameValueCollection。


3.自定义配置文件 


3.1 自定义配置节

  一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。

  声明一个配置文件的语句为:<section name=" " type=" "/> 

  <section>:声明新配置节,即可创建新配置节。

  name:自定义配置节的名称。

  type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

  不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。

 

 

<?xml version="1.0" encoding="utf-8" ?>

 

 

<configuration>

 

 

<configSections>

 

 

<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>

 

 

<section name="Test2" type="System.Configuration.DictionarySectionHandler"/>

 

 

<section name="Test3" type="System.Configuration.NameValueSectionHandler" />

 

 

</configSections>

 

 

    

 

 

<Test1 setting1="Hello" setting2="World"/>

 

 

<Test2>

 

 

<add key="Hello" value="World" />

 

 

</Test2>

 

 

<Test3>

 

 

<add key="Hello" value="World" />

 

 

</Test3>    

 

 

</configuration>


 

 

  对上面的自定义配置节进行说明。

  在声明部分使用<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>,声明了一个配置节,它的名字叫Test1,类型为SingleTagSectionHandler;在设置配置节部分使用<Test1 setting1="Hello" setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。 

  下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。

public static object GetConfig(string sectionName);

  下面是访问这三个配置节的代码:

            //访问配置节Test1

            IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1");

            string str = (string)IDTest1["setting1"] +" "+(string)IDTest1["setting2"];

            MessageBox.Show(str);        //输出Hello World


            //访问配置节Test1的方法2

            string[] values1=new string[IDTest1.Count];

            IDTest1.Values.CopyTo(values1,0);

            MessageBox.Show(values1[0]+" "+values1[1]);    //输出Hello World

            

            //访问配置节Test2

            IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2");

            string[] keys=new string[IDTest2.Keys.Count];

            string[] values=new string[IDTest2.Keys.Count];

            IDTest2.Keys.CopyTo(keys,0);

            IDTest2.Values.CopyTo(values,0);

            MessageBox.Show(keys[0]+" "+values[0]);

            

            //访问配置节Test3

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World


  通过上面的代码可以看出,不同的type通过GetConfig返回类型不同,具体获得配置内容方式也不一样。 配置节处理程序返回类型分别为: 

SingleTagSectionHandler   Systems.Collections.IDictionary

  DictionarySectionHandler   Systems.Collections.IDictionary

NameValueSectionHandler   Systems.Collections.Specialized.NameValueCollection

 

3.2 自定义配置节组 

  配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子:

 

 

<?xml version="1.0" encoding="utf-8" ?>

 

 

<configuration>

 

 

<configSections>

 

 

<sectionGroup name="TestGroup">

 

 

<section name="Test" type="System.Configuration.NameValueSectionHandler"/>

 

 

</sectionGroup>

 

 

</configSections>

 

 

    

 

 

<TestGroup>

 

 

<Test>

 

 

<add key="Hello" value="World"/>

 

 

</Test>

 

 

</TestGroup>

 

 

</configuration>


 

 

   下面是访问这个配置节组的代码:

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World


二.app.config/web.config的增、删、改操作 >>>


  配置文件,对于程序本身来说,就是基础和依据,其本质是一个xml文件,对于配置文件的操作,从.NET 2.0 开始,就非常方便了,提供了 System [.Web] .Configuration 这个管理功能的NameSpace,要使用它,需要添加对 System.configuration.dll的引用。 

 

  对于WINFORM程序,使用 System.Configuration.ConfigurationManager; 

  对于ASP.NET 程序, 使用 System.Web.Configuration.WebConfigurationManager; 

  对于配置文件内容的读取,真是太普遍不过了,我们以最常见的 AppSettings 小节来作为例子。假设有如下的配置文件: 

<?xml version="1.0" encoding="utf-8" ?> 

<configuration> 

<appSettings> 

<add key="y" value="this is Y"/> 

</appSettings> 

</configuration> 

(注意:app.config结构与上面的结构不同,读取方法也不一样)

1. 读取值

Asp.Net:System.Web.Configuration.WebConfigurationManager.AppSettings[“y”]; 

* WinForm:System.Configuration.ConfigurationManager.AppSettings[“y”]; 

2. 添加一项 

ASP.NET(需要有写权限):

Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

AppSettingsSection app = config.AppSettings; 

app.Settings.Add("x", "this is X"); 

config.Save(ConfigurationSaveMode.Modified); 

WinForm:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

AppSettingsSection app = config.AppSettings; 

app.Settings.Add("x", "this is X"); 

config.Save(ConfigurationSaveMode.Modified); 

3. 修改一项 

* Asp.Net:

Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

AppSettingsSection app = config.AppSettings; 

//app.Settings.Add("x", "this is X"); 

app.Settings["x"].Value = "this is not Y"; 

config.Save(ConfigurationSaveMode.Modified); 

* WinForm:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

AppSettingsSection app = config.AppSettings; 

//app.Settings.Add("x", "this is X"); 

app.Settings["x"].Value = "this is not Y"; 

config.Save(ConfigurationSaveMode.Modified); 

4. 删除一项 

* Asp.Net:

Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

AppSettingsSection app = config.AppSettings; 

app.Settings.Remove("x"); 

config.Save(ConfigurationSaveMode.Modified); 

* WinForm:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

AppSettingsSection app = config.AppSettings; 

app.Settings.Remove("x"); 

config.Save(ConfigurationSaveMode.Modified);


三.上机操作[vs2005] >>>


1.向项目添加app.config文件: 

  右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”,单击“确定”。出现在设计器视图中的app.config文件为: 

  <?xmlversion="1.0"encoding="utf-8" ?> 

 

  <configuration> 

  </configuration> 

  在项目进行编译后,在bin/Debuge文件下,将出现两个配置文件(以本项目为例),一个名为“XXX.EXE.config”,另一个名为“XXX.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“app.config”的同步文件,在程序运行中不会发生更改。 


2.connectionStrings配置节: 

  请注意:如果您的SQL版本为2005 Express版,则默认安装时SQL服务器实例名为localhost/SQLExpress,须更改以下实例中“Data Source=localhost;”一句为“Data Source=localhost/SQLExpress;”,在等于号的两边不要加上空格。 

  <!--数据库连接串--> 

  <connectionStrings> 

   <clear /> 

   <add 

 

 

 

User ID=sa;password=********" 

provider /> 

 

  </connectionStrings> 


3.appSettings配置节: 

  appSettings配置节为整个程序的配置,如果是对当前用户的配置,请使用userSettings配置节,其格式与以下配置书写要求一样。 

 

  <!--进销存管理系统初始化需要的参数--> 

 

  <appSettings> 

 

connectionString="Data Source=localhost;Initial Catalog=jxcbook;

 

  <clear /> 

 

 

  <add key="userName" value="" /> 

 

 

  <add key="password" value="" /> 

 

 

  <add key="Department" value="" /> 

 

 

  <add key="returnValue" value="" /> 

 

 

  <add key="pwdPattern" value="" /> 

 

 

  <add key="userPattern" value="" /> 

 

 

  </appSettings> 

 


 

4.读取与更新app.config 

 

  对于app.config文件的读写,参照“Read/Write App.Config File with .NET 2.0”一文

【点我进入

。 

 

 

  请注意:要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用。 


4.1 读取connectionStrings配置节 

 

  ///<summary> 

 

  ///依据连接串名字connectionName返回数据连接字符串 

 

  ///</summary> 

 

  private static string GetConnectionStringsConfig(string connectionName) 

 

  { 

 

string connectionString = 

 

   ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString(); 

Console.WriteLine(connectionString); 

 

return connectionString; 

 

 

4.2 更新connectionStrings配置节 

 

  ///<summary> 

 

  ///更新连接字符串 

 

  ///</summary> 

 

  ///<param >连接字符串名称</param> 

 

  ///<param >连接字符串内容</param> 

 

  ///<param >数据提供程序名称</param> 

 

  private static void UpdateConnectionStringsConfig
(string newName, string newConString, string newProviderName) 

 

  { 

 

  bool isModified = false; //记录该连接串是否已经存在 

 

  //如果要更改的连接串已经存在 

 

  if (ConfigurationManager.ConnectionStrings[newName] != null) 

 

  { 

 

  isModified = true; 

 

 

 

   //新建一个连接字符串实例 

 

   ConnectionStringSettings mySettings = 

 

   new ConnectionStringSettings(newName, newConString, newProviderName); 

 

   // 打开可执行的配置文件*.exe.config 

 

   Configuration config = 

 

   ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

 

   // 如果连接串已存在,首先删除它 

 

   if (isModified) 

 

  

 

   config.ConnectionStrings.ConnectionStrings.Remove( newName)

  

 

   // 将新的连接串添加到配置文件中. 

 

   config.ConnectionStrings.ConnectionStrings.Add(mySettings); 

 

   // 保存对配置文件所作的更改 

 

   config.Save(ConfigurationSaveMode.Modified); 

 

   // 强制重新载入配置文件的ConnectionStrings配置节 

 

   ConfigurationManager.RefreshSection("connectionStrings"); 

 

  } 

 


4.3 读取appStrings配置节 

  ///<summary> 

 

  ///返回*.exe.config文件中appSettings配置节的value项 

 

  ///</summary> 

 

  private static string GetAppConfig(string strKey) 

 

  { 

 

   foreach (string key in ConfigurationManager.AppSettings) 

 

  

 

   if (key == strKey) 

 

  

 

   return ConfigurationManager.AppSettings[strKey]

 

  

 

  

 

   return null; 

 

  } 

 


4.4 更新connectionStrings配置节 

  ///<summary> 

 

  ///在*.exe.config文件中appSettings配置节增加一对键、值对 

 

  ///</summary> 

 

  private static void UpdateAppConfig(string newKey, string newValue) 

 

  { 

 

   bool isModified = false; 

 

   foreach (string key in ConfigurationManager.AppSettings) 

 

  

 

   if(key==newKey) 

 

  

 

   isModified = true; 

 

  

 

  

 

   // Open App.Config of executable 

 

   Configuration config = 

 

   ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

 

   // You need to remove the old settings object before you can replace it 

 

   if (isModified) 

 

  

 

   config.AppSettings.Settings.Remove(newKey)

 

  

 

   // Add an Application Setting. 

 

   config.AppSettings.Settings.Add(newKey,newValue)

 

   // Save the changes in App.config file. 

 

   config.Save(ConfigurationSaveMode.Modified); 

 

   // Force a reload of a changed section. 

 

   ConfigurationManager.RefreshSection("appSettings") ; 

 

  } 

 


5.加密配置文件 

  此节代码参照Dariush Tasdighi所著文章《Encrypt and Decrypt of ConnectionString in app.config and/or web.config!》【点我进入】。 

 

  请注意:(1)要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用; (2)以下示例代码中的DPAPI提供程序为“DataProtectionConfigurationProvider”,这是一种基于机器名和当前用户密码的加密方式。如果计划在多台服务器(Web 场合)上使用相同的加密配置文件,则只有通过 RSAProtectedConfigurationProvider 才能导出加密密钥,并将其导入其他服务器。(3)加密后的配置文件不需要解密即可用上述方法直接读取。 

 


 

5.1 加密connectionStrings配置节 

 

  ///<summary> 

 

  ///加密配置文件中的ConnectionString节 

 

  ///</summary> 

 

  ///<param >true为加密,false为解密</param> 

 

  public static void ConnectionStringProtection( bool protect) 

 

  { 

 

   //取得当前程序的执行路径 

 

   string pathName = Application.ExecutablePath; 

 

   // 定义Dpapi提供程序的名称. 

 

   string strProvider = "DataProtectionConfigurationProvider"; 

 

   System.Configuration.Configuration oConfiguration = null; 

 

   System.Configuration.ConnectionStringsSection oSection = null; 

 

   try 

 

  

 

   // 打开配置文件,并取得connectionStrings配置节. 

 

   oConfiguration = 

 

   System.Configuration.ConfigurationManager.OpenExeConfiguration(

<param>

 

 

 

 

true为加密,false为解密</param> );

 

 

   public static void AppSettingProtection(bool protect) 

 

  

 

   //取得当前程序的执行路径 

 

   string pathName = Application.ExecutablePath; 

 

   // Define the Dpapi provider name. 

 

   string strProvider = "DataProtectionConfigurationProvider"; 

 

   System.Configuration.Configuration oConfiguration = null; 

 

   System.Configuration.AppSettingsSection oSection = null; 

 

   try 

 

  

 

   // Open the configuration file and retrieve the connectionStrings section. 

 

   oConfiguration = 

 

   System.Configuration.ConfigurationManager.OpenExeConfiguration(pathName); 

 

   if (oConfiguration != null) 

 

  

 

   bool blnChanged = false; 

 

   oSection = oConfiguration.GetSection("appSettings") as 

 

   System.Configuration.AppSettingsSection; 

 

   if (oSection != null) 

 

  

 

   if ((!(oSection.ElementInformation.IsLocked)) 

 

   &&(!(oSection.SectionInformation.IsLocked))) 

 

  

 

   if (protect) 

  

 

   if (!(oSection.SectionInformation.IsProtected)) 

 

  

 

   blnChanged = true; 

 

   // Encrypt the section. 

 

   oSection.SectionInformation.ProtectSection(strProv ider); 

 

  

 

  

   else 

 

  

 

   if (oSection.SectionInformation.IsProtected) 

 

  

 

   blnChanged = true; 

 

   // Remove encryption. 

 

   oSection.SectionInformation.UnprotectSection(); 

 

  

 

  

 

  

 

   if (blnChanged) 

 

  

 

   // Indicates whether the associated configuration section will be saved even 

 

   // if it has not been modified. 

 

   oSection.SectionInformation.ForceSave = true; 

 

   // Save the current configuration. 

 

   oConfiguration.Save(); 

 

 

 

  

 

  

 

  

   catch (System.Exception ex) 

 

  

 

   throw (ex); 

  

 

}

 

   finally 

 

  

 

  

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值