`

asp.net 2.0 读写配置文件

    博客分类:
  • .NET
阅读更多

  下面我给出一个简单的例子说明如何使用WebConfigurationManager操作配置文件:


        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        //获取appSettings节点
        AppSettingsSection appSection = (AppSettingsSection)config.GetSection("appSettings");
        //在appSettings节点中添加元素
        appSection.Settings.Add("addkey1", "key1's value");
        appSection.Settings.Add("addkey2", "key2's value");
        config.Save();

  运行代码之后可以看见配置文件中的改变:


  <add key="addkey2" value="key2's value" />
</appSettings>

  修改和删除节点或属性也非常方便:


        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        //获取appSettings节点
        AppSettingsSection appSection = (AppSettingsSection)config.GetSection("appSettings");
        //删除appSettings节点中的元素
        appSection.Settings.Remove("addkey1");
        //修改appSettings节点中的元素
        appSection.Settings["addkey2"].Value = "Modify key2's value";
        config.Save();

  配置文件:


 </appSettings>


在ASP.NET2.0里不但进一步扩展了配置文件web.config,更为重要的是系统提供了一组API函数,让我们可以以编程的方式从配置文件里提取信息
    首先,先看看如果从web.config里提取appSettings里的配置值,示例代码如下:
 <appSettings>
       <add key="pagetitle" value="http://blog.netbei.com/Job Site Starter Kit (Ver.1.0)"></add>
        <add key="sitelogo" value="logo.gif"></add>
        <add key="advertiseemail" value="sales@somesite.com"></add>
     </appSettings>
利用ASP.NET2.0提供的一组API函数,您可以很容易的获取AppSettingsSection里所有的Keys/value组对,如下:
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
AppSettingsSection appSettings = (AppSettingsSection) config.GetSection("appSettings");
string[] appKeys = appSettings.Settings.AllKeys;
for (int i = 0; i < appSettings.Settings.Count; i++)
{
//这里只进行简单的输出
Response.Write(appSettings.Settings[appKeys[i]].Value);
Response.Write("<BR>");
}

上面代码只是进行简单的输出所有Key的value值,然而,你可能想获取的仅仅是某一个key的值,这也非常简单,如下:
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings")
 string pateTitle= appSettings.Settings["pagetitle"].Value; //获取key为patetitle的value值
string siteLogo= appSettings.Settings["siteLogo"].Value; //获取key为sitelogo的value值

对于数据库连接字符串,在ASP.NET2.0里提供了专门的配置节如下:
<connectionStrings>
    <add name="connectionstring" 
connectionString="Data Source=SQLEXPRESS;AttachDbFilename=JsskDb.mdf; … .."/>
<add name="MyProviderConnectionString" 
connectionString="Data Source=SQLEXPRESS;Integrated Security=True;  … …"/>
</connectionStrings>

这样我们很容易获取数据库连接字符串如下:
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
 ConnectionStringsSection conSection = (ConnectionStringsSection)config.GetSection("connectionstring ");

ConnectionStringSettingsCollection conCollection = conSection.ConnectionStrings;
foreach (ConnectionStringSettings conSetting in conCollection)
{

Response.Write(conSetting.ConnectionString);

Response.Write("<BR>");

}

另外,利用API函数,你同时还可以在代码里更改web.config数据库连接的配置的值,如下
Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConnectionStringsSection conSection= (ConnectionStringsSection)config.GetSection("connectionStrings");
conSection.ConnectionStrings["SQLConnectionString"].ConnectionString = 
"Data Source=SQLEXPRESS;Integrated Security=True;  … …";
config.Save();

这里最有意思的可能就是类的转换,在<appSettings ></appSettings>里,使用的是AppSettingsSection类,在<connectionStrings></ connectionStrings>里使用的的是ConnectionStringsSection类,事实上,ASP.NET2.0提供的一组函数都是“配置节名+Section”的形式提供的类。

   在ASP.NET官方网站曾经对此专门介绍,可以找不到该文件了。

在ASP.NET2.0里提供了两种方式对数据库连接字符串加密,一种是使用asp_regii命令,一种是通过代码,下面显示的是通过代码方式对数据库连接字符串加密,代码如下:

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection configSection = config.GetSection("connectionStrings");
if (configSection.SectionInformation.IsProtected)

{//如果已经加密,就不用再加密了

configSection.SectionInformation.UnprotectSection();
config.Save();
}
else
{
configSection.SectionInformation.ProtectSection ("DataProtectionConfigurationProvider");

config.Save();

}

这样,你检查该文件的配置可能如下:

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">

<EncryptedData>

<CipherData>

<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAVClqG40BZkCjK40

adynN8gQAAAACAAAAAAADZgAAqAAAABAAAABIhtOW …PE

</CipherData>

</EncryptedData>

</connectionStrings> 

ASP.NET2.0里的配置接口API
ASP.NET2.0里的配置API接口函数允许我们读/写配置文件----包括对web.configmachine.config的读写。您可以读写您自己应用程序里的配置文件,也可以读写同一机器上其它应用程序的配置文件,您甚至可以读写不同服务器上的应用程序配置文件。本文我们将以ASP.NET开发人员的角度看一下ASP.NET2.0的新亮点,这其中包括如何加密和解密配置文件。
 
AppSettings Connection 字符串
 ASP.NET开发中,两个常规任务是从配置文件里读取应用程序的设置和数据库链接字符串。在ASP.NET2.0中,这些设置分别驻留在<appSettings><connectionStrings>配置节。一个web.config示例看起来应该类似如下:
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 <appSettings>
    <add key="message" value="Hello World!" />
 </appSettings>
 
 <connectionStrings>
    <add name="AdventureWorks" connectionString="..."/>
    <add name="pubs" connectionString="..."/>
 </connectionStrings>   
 
    <system.web>
      <compilation debug="true" />
      <authentication mode="Windows"/>
      <identity impersonate="true"/>
 </system.web>
</configuration>
 
ASP.NET提供的API接口函数是以WebConfigurationManager类开始的,该类在System.Web.Configuration命名空间。WebConfigurationManager包含了静态方法以获取应用程序的设置和数据库连接字符串。例如为了读取上面示例中appSetting“message”信息,我们可以使用类似如下的代码:
string message;
message = WebConfigurationManager.AppSettings["message"];
同样,如果我们想获取第二个数据库连接字符串--连接名为pubs的--我们可以使用如下的代码
string connectionString =
    WebConfigurationManager.ConnectionStrings["pubs"].ConnectionString;
 
通过使用GetSection静态方法,使得读取配置文件里的任何设置变的简单。GetSection采用XPath表达式来响应你想读取的节,你可以使用强类型转换将对对象的引用转换为对内置节的引用。例如使用AuthorizationSection 类来操作对<authorization>节的配置,使用PageSection类来操作对<pages>的操作。
 
如果我们想更改web.config里对<identity>节模拟的设置,我们可以使用如下代码
protected void readImpersonationButton_Click(object sender, EventArgs e)
 
{
    // note: currently broken in BETA2, works in post BETA2 builds.
   // in BETA2 GetSection returns a wrapper
    // that will not cast to IdentitySection
    IdentitySection section;
    section = WebConfigurationManager.GetSection("system.web/identity")
                    as IdentitySection;
 
     if (section != null)
    {
        WriteMessage("Impersonate = " + section.Impersonate);
    }
}
 
 
private void WriteMessage(string message)
{   
// this method assumes a PlaceHolder control
    // on the web form with the ID of messagePlaceHolder
    HtmlGenericControl generic = new HtmlGenericControl();
    generic.InnerHtml = message;
    messagePlaceHolder.Controls.Add(generic);
}
 

 又如<pages>节的设置:

修改配置文件
protected void readImpersonationButton_Click(object sender, EventArgs e)
 
{
    System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration(path);
        PagesSection pages = (PagesSection)config.GetSection("system.web/pages");
        this.lblSession.Text = pages.EnableSessionState.ToString();
        this.lblViewState.Text = pages.EnableViewState.ToString();
        this.lblMaxPage.Text = pages.MaxPageStateFieldLength.ToString();
        this.lblAutoEvent.Text = pages.AutoEventWireup.ToString();

//获取整节appSettings相关的XML格式代码
ConfigurationSection appSettings = config.GetSection("appSettings");
        this.Label1.Text=Server.HtmlEncode(appSettings.SectionInformation.GetRawXml());
}
 
 
WebConfigurationManager 类提供静态方法OpenWebConfiguration同样允许我们打开web的配置文件并进行更新。我们可以通过根据传递应用程序的相对路径来指明需要打开哪个应用程序的配置文件。我们还可以通过传递IIS 站点名称和虚拟路径的名称来读取其它应用程序的配置问题。使用后面这种方式,就可以读取其它应用程序的配置文件。
如果我们想获取当前应用程序web.config<compliation>配置节的debug属性,更改debugtrue或者为false,我们可以使用在button的事件里使用如下代码
protected void toggleDebugButton_Click(object sender, EventArgs e)
{

     string path = Request.CurrentExecutionFilePath;
     path=path.Substring(0,path.LastIndexOf("/"));
    
    Configuration config;
    config = WebConfigurationManager.OpenWebConfiguration(path);
    CompilationSection compilation;
    compilation = config.GetSection("system.web/compilation")
                      as CompilationSection;
 
 
   if (compilation != null)
    {
        compilation.Debug = !compilation.Debug;
        config.Save();
        WriteMessage(
                "Debug setting is now: " + compilation.Debug
            );
    }
}
 
使用强类型的CompilationSection对象允许我们读写<compliation>节里的属性。我们可以改变节的配置并使用 System.Configuration.Configuration 里的Save保存所有的修改。
在更改配置文件时,还有一个小的细节,首先,你应该具有修改配置文件的权限,典型的启动.NET runtime运行时的NETWORD SERVICEASPNET帐户并没有修改应用程序里配置文件的权限。
一个安全的解决方法是使用基于windows的身份验证并启用模拟技术。这些设置允许客户端执行请求的任务。如果客户端具有修改配置文件的权限,上面的操作才能够成功。
另外一个注意事项是ASP.NET runtime将随时监视web.config,一旦web.config有了改动,ASP.NET将重新启动应用程序。具体的说 ASP.NET运行时将根据你更改web.config所在的应用程序域,重新建立应用程序对象实例。重建实例对性能有显著影响,所以不应该经常修改web.config
如果你想要在修改web.config时,既能够获取更多的控制权限同时又不使应用程序重新启动,你可以使用外部配置文件,下一节将介绍这个问题。
 
 
使用外部配置文件
 你可以将配置文件里的任意配置节取出并单独存放,例如我们看一下新的配置web.config文件
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 <appSettings configSource="appSettings.config"/>
 <connectionStrings configSource="connections.config"/>   
 <system.web>
    <compilation debug="true" />
    <authentication mode="Windows"/>
    <identity impersonate="true"/>
 </system.web>
</configuration>
 
在这个例子中,我们将<appSettings> <connectionStrings>的配置移动到了web.config的外部,这些外部文件同样是基于XML格式的配置节片段,例如appSettings.config的文件看起来类似如下:
<appSettings>
 <add key="message" value="Hello World!"/>
</appSettings>
 
使用外部配置文件在某些情况下较为有用,例如在开发,或者在测试甚至在成品软件开发中,由于阶段的不同我们需要一种简易的方式切换设置,此时就可以使用外部配置文件。
如果你需要更多的控制权限也可以使用外部配置,例如你对你的web.config进行了锁定,只有Administrators用户可以更改该配置问题,但是你可以让<appSettings>节使用外部配置文件并允许其它角色的用户修改其内容。
使用外部文件还有其它的优越性--它可以控制我们的应用程序是否重新启动。如果在web.config里进行了改动。ASP.NET应用程序总会重新启动--不存在选择的余地,但是使用外部文件,你可以告诉runtime运行时,是否在外部文件改动时重启应用程序。
 
如果你查看machine.config里的配置,在<configSections>节,你可以看到每一个节定义的处理句柄(Handler)。每一个节包含一个属性:restartOnExternalChanges
请注意对appSettings的配置,其restartOnExternalChanges设置为"false",这意味这如果使用外部文件存放设置信息,当外部文件改变时,应用程序并不重新启动,但是你使用WebConfigurationManager.AppSettings读取的将是新值。
在使用restartOnExternalChanges 请注意,有些外部文件改变时,必须重启应用程序才能够生效。在这种情况下,虽然你可以设置restartOnExternalChanges false,但是请确保不要在应用程序里缓存节的参数,并重新使用WebConfigurationManager读取配置值。
 
使用加密
 ASP.NET2.0里提供了对配置节直接加密的功能。在配置文件里有几处配置可能包含敏感信息,例如<connectionStrings> 节,它可能包含连接数据库的用户名和密码。<identity>节可能包含runtime使用模拟帐户的用户和密码。你甚至可能在配置文件的appSettings里或者在自定义节里包含共享web service使用的密码。不管哪种情况,您都不希望密码以明文的方式存放在配置文件里。
注意:在配置文件里也包含你无法加密的节,主要是<precessModul>节。此时你可以需要利用ASPNET_SETREG.EXE工具单独设置该节密码。
 
下面的代码演示了加密和解密节是多么的简单,注意:在从节里读取配置信息时,你不需要解密。ASP.NET运行时会自动读取加密的文本,并在应用程序需要的地方自动解密加密的信息。在这里调用Unprotect方法主要是演示如何返回未加密的节
 
protected void toggleEncryptionButton_Click(object sender, EventArgs e)
{
    Configuration config;
   config = WebConfigurationManager.OpenWebConfiguration("~");
    ConnectionStringsSection section;
    section = config.GetSection("connectionStrings")
                    as ConnectionStringsSection;
    if (section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
    }
 
   else
    {
        section.SectionInformation.ProtectSection(
                "DataProtectionConfigurationProvider"
            );
    }
    config.Save();
    WriteMessage("connections protected = " +
                    section.SectionInformation.IsProtected);
}
 
在执行上述代码后,如果我们检测web.config,我们将看到其配置如下:
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 <protectedData>
    <protectedDataSections>
      <add name="connectionStrings"
           provider="DataProtectionConfigurationProvider"
           inheritedByChildren="false" />
    </protectedDataSections>
 </protectedData>
 <appSettings configSource="appSettings.config"/>
 <connectionStrings configSource="connections.config"/>   
 
 <system.web>
    <compilation debug="true" />
    <authentication mode="Windows"/>
    <identity impersonate="true"/>
 </system.web>
</configuration>
 
这里我们使用的是外部配置文件,打开外部配置文件可以看到内容类似如下:
 
<connectionStrings>
<EncryptedData>
 <CipherData>
   <CipherValue>AQAAANCMnd8BF....</CipherValue>
 </CipherData>
</EncryptedData>
</connectionStrings>
 
运行时,ASP.NET解密区域信息,我们可以仍然使用WebConfigurationManager.ConnectionStrings 返回应用程序可以直接使用的数据库连接字符串。
 
为了理解配置文件,我们首先需要明白名运行时是怎么处理加密和解密工作的。解密和解密分别使用了Provider模型,ASP.NET2.0使用这两个Provider模型分别是:DataProtectionConfigurationProvider RSAProtectedConfigurationProvider (如果需要,你也可以自定义自己的加密/解密Provider
我们可以通过传递给ProtectSetion的参数来指示使用Provider的具体模型。在前面代码片段中,我们使用的是DataProtectionConfigurationProvider
 
DataProtectionConfigurationProvider 使用Windows Data Protection API (DPAPI)接口,这提供了加密和解密的工作,因为Windows Data Protection API (DPAPI)依赖于具体的机器密钥。只有在同一机器上,针对加密的解密才有效。
 
如果你需要将配置从一台机器转移到另外一台机器,你需要使用RSAProtectedConfigurationProvider模型。RSAProtectedConfigurationProvider,正如其名称所示意,使用RSA作为加密密钥。你可以使用具有RSAProtectedConfigurationProvider功能的aspnet_regiis.exe命令进行操作。aspnet_regiis.exe包含一些列参数包括建立密钥对(-pc),导出密码(-pc)等
 
总结
 本文介绍了如何使用API配置函数读写配置文件。在配置文件修改时,讨论了应用程序的重启问题。
分享到:
评论

相关推荐

    ASP.NET 2.0 读取配置文件

    在描述中提到的"ASP.NET 2.0 读取配置文件[INI]",虽然通常ASP.NET使用XML格式的Web.config文件,但这里指的是读取传统的INI文件,这是一种简单文本格式的配置文件,广泛应用于早期的Windows系统和某些跨平台的应用...

    《ASP.NET 2.0 XML 高级编程(第3版)》

    XML在配置文件中也扮演着重要角色,ASP.NET 2.0的Web.config文件就是一个典型的例子。通过配置文件,开发者可以方便地管理应用的设置,如连接字符串、安全性选项等。书中会讲解如何解析和修改这些配置文件,以适应...

    Asp.Net2.0读取-修改-新增(配置文件web.config)

    在Asp.Net 2.0框架中,配置文件`web.config`扮演着至关重要的角色,它存储了应用程序的配置信息,如数据库连接字符串、身份验证模式、授权规则等。了解如何读取、修改和新增`web.config`中的设置是开发过程中必备的...

    asp.net2.0数据库入门经典DOC格式

    ### ASP.NET 2.0与ADO.NET:数据库入门经典知识点详解 #### 一、ASP.NET 2.0 技术概述 **1.1 ASP.NET 2.0 的诞生背景及意义** - **诞生背景**: 在.NET Framework 1.x版本的基础上,微软于2003年推出了.NET ...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    ASP.NET 2.0+SQL Server 2005全程指南 目录 基础篇 第1章 ASP.NET概述及环境配置 1.1 认识ASRNET 1.1.1 .NET Framework框架 1.1.2 ASP.NET功能与特性 1.1.3 ASP.NET与ASP的区别 1.2 搭建ASP.NET开发环境 1.2.1...

    超酷的Asp.net2.0留言板

    在这个“超酷的Asp.net2.0留言板”项目中,我们可以看到一个实现基本留言功能的应用,包括用户留言、管理员管理和页面设计等关键元素。 1. **基础架构** - **Default.aspx**:这是默认的首页,通常会展示留言板的...

    Asp.net2.0 电子商务网源码开源

    【Asp.net2.0 电子商务网源码开源】是一个基于.NET Framework 2.0版本的Web应用程序,专为构建电子商务网站设计。这个开源项目提供了一整套的网上商城功能,包括商品展示、购物车、订单处理、用户管理等多个模块,...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    AdFile.xml AdRotator配置文件。 7-08.aspx 使用Calendar控件创建日历。 第8章(\Chapter 08) 示例描述:本章学习用户控件和自定义控件。 uc1.ascx 用户控件实现搜索框。 8-01.aspx 用户控件的调用。 uc2...

    ASP.NET2.0动态网站开发案例

    在这个"ASP.NET2.0动态网站开发案例"中,我们深入探讨了一系列关键概念和技术,包括网页制作的基础知识、开发环境的设置、各种控件的使用以及数据库的访问。 1. **网页制作基础知识**:这涵盖了HTML、CSS和...

    ASP.NET2.0

    在ASP.NET中,XML可以用于配置文件,如Web.config,存储应用程序的设置。XDocument和XPathDocument等类库允许程序动态地读写XML文档,而LINQ to XML则提供了一种更直观的方式来查询和操作XML数据。此外,ASP.NET 2.0...

    ASP.NET 2.0.XML.高级编程(第3版)

    《ASP.NET 2.0.XML.高级编程(第3版)》是一本深入探讨ASP.NET与XML技术结合使用的专业书籍,旨在为中高级编程人员提供全面的指导。这本书结合了微软的ASP.NET 2.0框架和XML的核心概念,帮助读者理解和掌握这两种技术...

    ADO.NET2.0技术内幕

    6. **XML支持**:ADO.NET 2.0增强了对XML的支持,可以直接读写XML文件,或者将XML数据转换为DataSet。DataSet可以看作是XML数据的内存表示,方便进行数据交换。 7. **事务处理**:Transaction对象提供了事务管理...

    深入挖掘ASP.NET 2.0系列课程(10):ASP.NET中的XML数据源操作

    此外,ASP.NET 2.0还引入了对LINQ to XML的支持,这是一种强大的编程API,简化了XML的读写操作。通过LINQ to XML,开发人员可以使用C#或VB.NET的查询表达式语法来操作XML文档,大大提高了开发效率和代码可读性。 在...

    asp.net 2.0里也可以用JSON的使用方法

    - **配置文件**:存储和读取配置信息时,使用 JSON 格式可以使数据更易读写。 - **跨语言通信**:JSON 是一种通用的数据交换格式,可以方便地在不同语言之间传递数据,例如 ASP.NET 和 JavaScript。 总之,在 ASP...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    2.ASP.NET.2.0.高级编程(第4版) [1/7] 原书名: Professional ASP.NET 2.0 原出版社: Wrox 作者:(美)Bill Evjen, Scott Hanselman, Farhan Muhammad [同作者作品] [作译者介绍] 译者: 李敏波[同译者作品] ...

    ASP.NET-[论坛社区]Discuz!NTv2.5AccessFor.Net2.0beta.zip

    NT v2.5 Access For .Net2.0 beta_dnt_n2_acc.rar"很可能是安装或部署所需的资源,包括论坛的源代码、数据库脚本以及必要的配置文件等。开发者或管理员可以利用这些文件搭建一个基于ASP.NET的论坛社区,同时利用...

    1.ASP.NET.2.0.XML.高级编程(第3版) [1/3]

    原书名: ASP.NET2.0XML高级编程(第3版) 原出版社: 作者: (美)然哥诺辛尔蒙 著,肖奕,曹俊 译 出版社: 清华大学出版社 书号: 7302132141 出版日期:2006-9-1 开本: 页码: 519 所属类别: 程序设计→...

    零基础学ASP.NET 2.0&源代码绝对完整版1

    AdFile.xml AdRotator配置文件。 7-08.aspx 使用Calendar控件创建日历。 第8章(\Chapter 08) 示例描述:本章学习用户控件和自定义控件。 uc1.ascx 用户控件实现搜索框。 8-01.aspx 用户控件的调用。 uc2....

    ASP.NET2.0高级编程(第4版)1/6

    本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP...

Global site tag (gtag.js) - Google Analytics