.NET框架中的配置文件架构之概念篇

.NET框架中的配置文件架构之概念篇

jupiter@yeah.net 2008.7.4

1 配置文件的定义

.NET框架中,配置文件是可以根据需要更改的 XML 文件。开发人员可以使用配置文件来更改设置,而不必重编译应用程序。管理员可以使用配置文件来设置策略,以影响应用程序在计算机上运行的方式。 注意: 托管代码可以使用 System.Configuration 命名空间中的类从配置文件中读取设置,但不向这些文件写入设置。 .NET中,配置文件是标准的 XML 文件。.NET Framework 定义了一组实现配置设置的元素。计算机配置文件、应用程序配置文件和安全配置文件是常见的三种配置文件。

1.1 计算机配置文件

计算机配置文件 Machine.config 包含应用于整个计算机的设置。该文件位于 %运行库安装路径%/Config 目录中(例如,C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727。注意,不是.NET框架所有版本都具有自己的Machine.config文件,例如V3.0V3.5就没有,这是因为这两个版本基本上只是在V2.0的基础上增加了一些类库。不像V2.0是对V1.1的一次重大升级)。Machine.config 包含整个计算机范围内的程序集绑定、内置远程处理信道和 ASP.NET 的配置设置。

配置系统首先查看计算机配置文件(即Machine.config文件)中的 元素和开发人员可能定义的其他配置节。然后查看应用程序配置文件。为使计算机配置文件可管理,最好将这些设置放在应用程序配置文件中。但是,将这些设置放在计算机配置文件中可以使系统更易维护。例如,如果有第三方组件,且客户端和服务器应用程序同时使用该组件,那么将该组件的设置放在一个位置更方便。在这种情况下,计算机配置文件是存放设置的合适位置,这样就不会将相同的设置放在两个不同的文件中。

1.2 应用程序配置文件

应用程序配置文件包含特定于单个应用程序的设置。该文件包含公共语言运行库可以读取的配置设置(如程序集绑定策略、远程处理对象等),以及应用程序可以读取的设置。根据应用程序宿主的不同,应用程序文件可以分为下面三种类型:

  1. 可执行文件承载的应用程序。由可执行文件宿主承载的应用程序的配置文件与该应用程序位于同一目录。配置文件的名称是带有 .config 扩展名的该应用程序的名称。例如,名为 myApp.exe 的应用程序可以与名为 myApp.exe.config 的配置文件关联
  2. ASP.NET 承载的应用程序。有关 ASP.NET 配置文件的更多信息,请参见 ASP.NET 配置
  3. Internet Explorer 承载的应用程序。如果 Internet Explorer 承载的应用程序有配置文件,那么该文件的位置在 />标记中指定,其语法如下: <link rel=" ConfigurationFileName " href=" location "> 在该标记中,location 是指向该配置文件的 URL。它设置了应用程序基。配置文件必须位于与应用程序所在的同一网站中。
1.3 安全配置文件

安全配置文件包含有关与策略级别关联的代码组层次结构和权限集的信息。郑重建议使用 .NET Framework 配置工具 (Mscorcfg.msc) 或代码访问安全策略工具 (Caspol.exe) 来修改安全策略,以确保策略更改不会破坏安全配置文件。

我们经常使用的应用程序有桌面应用程序,例如Word,和Web应用程序,即近些年迅猛发展的网站。它们的配置方法基本相同,下面以Web应用程序的配置为例进行说明。

2 ASP.NET配置文件架构

ASP.NET 配置文件为 XML 文件。.NET Framework 定义了一组实现配置设置的元素,并且 ASP.NET 配置架构包含控制 ASP.NET Web 应用程序的行为的元素。

默认配置设置在位于 %SystemRoot%/Microsoft.NET/Framework/versionNumber/CONFIG/ 目录中的 Machine.config file 文件中指定。值由子站点和应用程序继承。如果子站点或应用程序中有配置文件,则继承的值不会出现,但可以被重写并可用于该配置 API

注意:每个配置文件必须恰好包含一个 元素。

system.web元素指定ASP.NET配置节的根元素,并包含用于配置ASP.NET Web应用程序和控制应用程序行为的配置元素。位于system.web中的各个元素都是微软定义的,其中包含经常使用的authenticationauthorizationcachingcustomErrorshttpCookieshttpHandlershttpModulesmembership等。我们可以通过设置它们的值来改变ASP.NET应用程序的行为。图1展示了我们马上可以使用的配置元素。

1 system.web元素结构

除了system.web元素,还有一些常规配置元素,如图2所示,与system.web不同,这些元素也适用于.NET框架应用程序,例如在智能客户端应用程序中也可以使用。注意,配置元素形成一个树状结构,随着元素位置的不同,它可以具有父元素或子元素,例如appSetting元素的父元素为configuration元素,子元素有add, clear, remove

2 configuration元素结构

另外每个元素又拥有数量不同的特性(特性和属性是两个很容易混淆的术语,它们分别对应于英文中的attributepropertyC#一般用属性封装字段,而一般使用特性来定义那些需要写入元数据的信息或者用在XML中。我一直有一个想法,那就是希望我们国家能成立一个标准委员会,负责将英文技术术语翻译成中文并强制执行。这是因为我见过太多的译著,先不说译者的翻译水平怎么样,单说术语的翻译,那叫一个混乱,你翻译成一,我翻译成二,弄得读者不知所措。也正是因为这个原因,建议大家尽量阅读英文原版资料。当然现在的很多译者都是微软MVP,他们的翻译水平还是可以接收的),例如appSettings元素具有特性file(它没有在图2中列出)。 <appSettings    file="relative file name" > </appSettings> 指定包含自定义应用程序配置设置的外部文件的相对路径。指定的文件包含的设置类型与在 appSettingsaddclear remove 属性中指定的设置类型相同,并且使用的键/值对格式也与这些元素相同。(下面两段和备注可以略过,在需要的时候再看不迟) 指定的路径是本地配置文件的相对路径。如果找不到指定的文件,运行库会忽略该属性。由于 Web.config 文件的任何更改都会导致应用程序重新启动,因此,使用一个单独的文件则既可以让用户修改 appSettings 节中的值,又不会导致应用程序重新启动。该单独文件的内容将与 Web.config 文件中的 appSettings 节合并。此功能限于 appSettings 属性。

注意 .NET Framework 2.0 版中,现在可以在一个单独文件包括所有支持 configSource 属性的配置元素的配置设置。但是,当使用 configSource 属性时,由于没有元素设置的合并,因此您必须将整个节移动到单独文件。使用 configSource 属性时,对 Web.config 文件有一次写入操作。这会导致应用程序重新启动,但是随后对该节的更新会直接写入单独文件,而不会导致后面的应用程序重新启动。有关更多信息,请参见 ConfigSource

备注:您可以使用 file 特性指定一个配置文件,该配置文件提供其它设置或重写 appSettings 元素中指定的设置。您可以将 file 属性用于源代码管理组开发方案,例如,当用户需要重写在应用程序配置文件中指定的项目设置时。在 file 属性中指定的配置文件必须将 appSettings 元素(而不是 configuration 元素)作为根节点。

appSettings 元素存储自定义应用程序配置信息,如文件路径、XML Web services URL 或存储在应用程序的 .ini 文件中的任何信息。可以在代码中使用 ConfigurationSettings 类访问 appSettings 元素中指定的键/值对。

下面的代码示例演示如何在配置文件中定义自定义应用程序设置。 <configuration>     <appSettings>         <add key="Application Name" value="MyApplication" />     </appSettings> </configuration>

configSections

section

定义配置节处理程序与配置元素之间的关联。

sectionGroup

定义配置节处理程序与配置节之间的关联。

configSections 元素指定了配置节和处理程序声明。由于 ASP.NET 不对如何处理配置文件内的设置作任何假设,因此这非常必要。但 ASP.NET 会将配置数据的处理委托给配置节处理程序。

每个 section 元素标识一个配置节或元素以及对该配置节或元素进行处理的关联 ConfigurationSection 派生类。可以在 sectionGroup 元素中对 section 元素进行逻辑分组,以对 section 元素进行组织并避免命名冲突。section sectionGroup 元素包含在 configSections 元素中。

注意:如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素。

3 理解配置文件

如果只是阅读这些枯燥的文档,很快就会迷失方向,因为包含了太多的术语,为了加深理解让我们浏览一下Machine.config文件,从中或许能够有助于我们的理解。完整的machine.config文件可以在目录 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG下找到,每个版本的.NET框架都会自带一个machine.config文件,v2.0.50727为版本号。下面的内容摘自 Machine.config 文件,用于定义 system.web 节中 authentication 元素的配置节处理程序。然后,定义 authentication 元素的配置设置。

<configuration>

<configSections>

	   <section name="system.data" type="System.Data.Common.DbProviderFactoriesConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

    <!-- Other configuration sections -->

        <sectionGroup name="system.web" type="System.Web.Configuration.SystemWebSectionGroup, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%">

            <section name="authentication" type="System.Web.Configuration.AuthenticationSection, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" />

            <!-- Other system.web sections -->

	   	   <sectionGroup name="caching" type="System.Web.Configuration.SystemWebCachingSectionGroup, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

				<section name="cache" …/>

				<section name="outputCache" …/>

				<section name="outputCacheSettings" …"/>

				<section name="sqlCacheDependency" …/>

		   </sectionGroup>

        </sectionGroup>

        <!-- Other configuration sections -->

    </configSections>



    <system.web>

        <authentication mode="Windows">

            <forms name=".ASPXAUTH" 

                   loginUrl="login.aspx" defaultUrl="default.aspx" 

                   protection="All" 

                   timeout="30" 

                   path="/" 

                   requireSSL="False" 

                   slidingExpiration="True" 

                   cookieless="UseCookies" 

                   domain="" 

                   enableCrossAppRedirects="False">

                <credentials passwordFormat="SHA1" />

            </forms>

            <passport redirectUrl="internal" />

        </authentication>

        <!-- Other system.web elements -->

    </system.web>

    <!-- Other configuration settings -->

</configuration>

List-1 machine.config

下面我们去掉各个元素的特性定义,这样可以更加清晰的了解它的总体架构。

<configuration>

<configSections>

  <section />

  <!--other sections />

<sectionGroup>

         <sectionGroup />

         <!--Other sectionGroup -->

<section />

<!--Other sections -->

<sectionGroup>

<!-- Other groups -->

<configSections>

<system.web />

<!-- Other configuration settings -->

</configuration>

总体上看,一个配置文件分为红色和蓝色两个部分,红色部分为元素设置区域,蓝色部分为设置区域。一般来说,我们只需要了解节设置区域即可,我们在这里对应用程序的各个方面,例如httpHandlersmembership等,进行配置。当我们使用ASP.NET Web模板创建一个ASP.NET应用程序时,自动生成的Web.config文件中就只包含节设置区域。我们一般不需要关心元素设置区域,它包含了处理用户配置的类的信息。一般只有当使用了自定义节时我们才会关心元素设置区域。

配置文件的有且只有一个 根元素, 元素也是如此。 元素包含

两类元素,而 元素比较特殊,它还可以包含 元素,例如 system.websystem.net。从 sectionGroup的字面意思不难理解,它的作用为分组,即把一组功能类似的节归类。

回想一下,我们在ASP.NET应用程序的web.config配置文件中可以对应用程序的各个方面进行配置,不知道朋友们有没有想过.NET框架是如何解析配置参数的?其实很简单,看看machine.config文件第52<sectionGroup name="system.web" type="System.Web.Configuration.SystemWebSectionGroup, System.Web, Version= .0, Culture=neutral, PublicKeyToken=b 03f 5f 7f 11d 50a 3a ">一切就很简单了。是的,在System.Web.Configuration.SystemWebSectionGroup类中!看看msdn对它的解释吧?"SystemWebSectionGroup 类允许用户以编程方式访问配置文件的 system.web 组。无法继承此类。SystemWebSectionGroup 类引用配置文件内的 system.web 组。可以使用此类型来访问此组中包含的任意节"。看到这里是不是明白了许多,此时你肯定也明白了

元素属性的含义。

<section name="compilation" type="System.Web.Configuration.CompilationSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b 03f 5f 7f 11d 50a 3a "/>为例,它的意思是:使用System.Web.Configuration.CompilationSection 类作为compilation配置节处理程序,其中System.Web.Configuration.CompilationSection为全限定类名,此类位于System.Web程序集中,版本号为 .0Culture为中性,PublicKeyTokenb 03f 5f 7f 11d 50a 3a 。注意:程序集文件必须与定义它的 Web.config 文件位于同一个应用程序目录中。对于根 Web.config 文件或 Machine.config 文件,程序集文件必须在 %SystemRoot%/Microsoft.NET/Framework/version 中。如果配置节处理程序不与某个配置元素关联,ASP.NET 将发出服务器错误"无法识别的配置节 element_name"。

理解了.NET配置文件背后的工作原理之后,还存在一个问题,那就是如何向配置文件中添加我们的自定义节?不用着急,.NET框架的一个重要特点就是它的可扩展性。在下一节中让我们来看看如何利用System.Configuration名字空间中的类自定义配置节。

后记

第一次学习微软企业库4.0,发现1.0版本的Configuration Application Block不见了,仔细的看了一下文档,原来此appblock已经转移到了企业库核心中,其配置通过System.Configuration名字空间来提供。本文大部分字句都摘自MSDN文档,其中夹杂着自己的一点理解和认识。接下来我会讨论如何在程序中应用.NET配置。由于刚刚学习企业库,所以错误在所难免,以后会逐步改进。文章先是在Word中编辑的,发布过程很是费劲。为什么没有文章的格式这么难设置呢?只好委屈大家了。有没有什么好的离线发布工具,推荐一下。

Powered by Zoundry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值