使用 Configuration
类可以完成大部分的配置工作。该类用于对计算机、.NET 客户应用程序、ASP.NET 应用程序、Web 目录、以及保存在 Web 目录中的资源配置进行展示,
在 ASP.NET 2.0 中,你可以通过使用 WebConfigurationManager
对象的方法获取配置段并对 Configuration
类实例进行访问。在 .NET Framework 客户应用程序中,你可以使用类似的 ConfigurationManager
对象。
下面的内容对不同情况下的配置类使用方式进行描述。
下例所有实例都需要首先使用非静态的 System.Configuration.Configuration.GetSection(System.String)
方法和 System.Configuration.Configuration.GetSectionGroup(System.String)
方法创建 System.Configuration.Configuration
类实例。这样允许你从任何应用程序中获取配置信息。如果你在获取当前应用程序的配置信息时,请使用静态方法 GetSection
,以获得更快的处理速度。
打开被映射在全局配置设定中的配置对象
要打开全局配置文件,你的应用程序应该调用 WebConfigurationManager
类的静态方法 OpenMachineConfiguration
。在接下来的代码实例中,OpenMachineConfiguration
方法打开并返回与 .NET Framework 2.0 的 Machine.config 文件相匹配的配置对象。该方法被重载后的其他版本则允许你对位置、远程服务器、以及用户信息进行指定。
// 获取本地计算机的机器配置设定 System.Configuration.Configuration machineConfig = System.Web.Configuration.WebConfigurationManager.OpenMachineConfiguration(); machineConfig.SaveAs("c:\\machineConfig.xml");
配置 API 通常是与版本相关的。所以,不可以使用该方法打开其他版本 .NET Framework 中的 Machine.config 文件。
必需的特权
要打开机器配置文件,应用程序需要拥有物理 Machine.config 文件的读取权限。要对机器配置进行更改,应用程序需要拥有该文件的写入权限,以及创建 .NET Framework 配置目录的特权。
打开被映射在 Web 应用程序配置中的配置对象
要打开 Web 应用程序的配置文件,你的应用程序需要调用 WebConfigurationManager
类的静态方法 OpenWebConfiguration
,并把要打开的 Internet 信息服务(IIS)管理器虚拟目录的相关路径作为参数传递。
path 参数的值可以从包含被请求配置的 IIS 元数据库路径中获取。例如,如果 IIS 元数据库路径是 W3SVC1/ROOT/Temp,因为默认网站是 1,那么 path 的值就应该就是 /Temp。
在下例代码实例中,OpenWebConfiguration
方法打开并返回与默认网站的 Temp 应用程序相对应的配置对象。该配置对象包括本地 Web.config 文件中指定的配置设定以及所有继承自父配置文件的设定,一直追溯到 Machine.config 文件。该方法被重载的其他版本允许你对网站、位置、远程服务器、以及用户信息进行指定。
// 获取 Web 应用程序的配置设定。 System.Configuration.Configuration webConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Temp"); webConfig.SaveAs("c:\\webConfig.xml");
甚至在物理 Web.config 文件不存在的时候也能够打开 System.Configuration.Configuration
对象。这种情况下被返回的配置由继承自配置文件层次中的全部设定而组成。
必需的特权
要打开 Web 配置文件,应用程序需要拥有物理 Web.config 文件以及配置层次中的所有父文件的读取权限。
打开被映射到配置段中的配置对象
要从配置段中获取配置信息,你的应用程序需要调用 Configuration
类的非静态方法 GetSectionGroup
,并传递配置段名参数。至于包含在配置段分组中的配置段,你既可以为配置段(System.web/anonymouseIdentification
)使用 XPath
,也可以获取第一个被映射到配置段分组的配置对象。
下例代码实例中,OpenWebConfiguration
方法打开并返回默认网站的 Web 应用程序(Temp)配置对象,然后使用该对象获取 system.web
配置段分组的引用,该对象同样也可以被用于获取 anonymouseIdentification
配置段的引用。
// 获取 <anonymouseIdentification> 配置段中的配置设定。 System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Temp"); System.Web.Configuration.SystemWebSectionGroup systemWeb = config.GetSectionGroup("system.web") as System.Web.Configuration.SystemWebSectionGroup; System.Web.Configuration.AnonymousIdentificationSection sectionConfig = systemWeb.AnonymousIdentification; if (null != sectionConfig) { StringBuilder sb = new StringBuilder(); sb.Append("<anonymousIdentification> attributes:\r\n"); System.Configuration.PropertyInformationCollection props = sectionConfig.ElementInformation.Properties; foreach (System.Configuration.PropertyInformation prop in props) { sb.AppendFormat("{0} = {1}\r\n", prop.Name.ToString(), prop.Value.ToString()); } Console.WriteLine(sb.ToString()); }
甚至在物理 Web.config 文件不存在的时候也能够打开 System.Configuration.Configuration
对象。这种情况下被返回的配置由继承自配置文件层次中的全部设定而组成。
必需的权限
要打开某个 Web 配置文件的配置段,应用程序需要拥有物理 Web.config 文件以及所有父文件的读取权限。被托管代码应用程序还需要相应的权限以对系统配置段进行读取。完全可信度和高可信度的应用程序在默认时已经拥有这些权限。换句话说,默认时,中可信度和低可信度应用程序将无法对配置段进行读取。
打开被映射到远程配置设定中的配置对象
你可以使用配置 API 打开远程计算机上的配置。配置 API 可以打开另一台计算机中的机器配置文件,以及任何 IIS 应用程序或子目录中的应用程序配置文件。
要打开另一台电脑的机器配置文件,应用程序需要调用静态方法 OpenMachineConfiguration
,并把服务器名称作为参数传递给该方法。
要打开另一台电脑的 Web.config 文件,应用程序需要调用静态方法 OpenWebConfiguration
,并把网站相对路径、网站标识符、和服务器名称一并传递给配置对象。被返回的配置对象中包括了本地 Web.config 文件设定和所有父配置文件中的被继承设定,一直追溯到 Machine.config 文件。
服务器名称是有效的 Windows 网络计算机名称。这些名称并没有被 ASP.NET 处理,而是直接传递给操作系统。
下例代码实例说明了如何打开默认网站根配置中的机器配置,以及应用程序目录中的 Web 配置。
IntPtr userToken = System.Security.Principal.WindowsIdentity.GetCurrent().Token; // 获取远程计算机的机器配置设定。 System.Configuration.Configuration remoteMachineConfig = System.Web.Configuration.WebConfigurationManager.OpenMachineConfiguration(null, "ServerName", userToken); remoteMachineConfig.SaveAs("c:\\remoteMachineConfig.xml"); // 获取远程计算机的根网站配置。 System.Configuration.Configuration remoteRootConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null, null, null, "ServerName", userToken); remoteRootConfig.SaveAs("c:\\remoteRootConfig.xml"); // 获取远程计算机目录 W3SVC/1/Root/Temp 的应用程序配置设定 System.Configuration.Configuration remoteWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Temp", "1", null, "ServerName", userToken); remoteWebConfig.SaveAs("c:\\remoteWebConfig.xml");
必需的特权
要打开远程计算机上的配置文件,应用程序必须拥有远程计算机上的管理员特权。这个需求比在本地使用时要受到更多的限制。至于本地配置文件,应用程序只需要拥有配置文件和 IIS 元数据库(用于解析 IIS 路径)的读取权限就可以了。
请在尝试进行配置之前使用“-config+”参数运行远程计算机上的 Aspnet_regiis.exe 工具。
更新配置设定
要对已打开的配置对象进行更新,应用程序需要调用 Configuration
对象的 Save
方法或者 SaveAs
方法。这些方法为该对象对任何配置设定所做的更改进行写入。如果配置文件尚不存在,将会自动创建一个全新的配置文件。
下例代码实例把 compilation
配置段的 debug
参数设置成 true
。
// 更新 Web 应用程序配置设定。 System.Configuration.Configuration updateWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Temp"); System.Web.Configuration.CompilationSection compilation = updateWebConfig.GetSection("system.web/compilation") as System.Web.Configuration.CompilationSection; Console.WriteLine("Current <compilation> debug = {0}", compilation.Debug); compilation.Debug = true; if (!compilation.SectionInformation.IsLocked) { updateWebConfig.Save(); Console.WriteLine("New <compilation> debug = {0}", compilation.Debug); } else { Console.WriteLine("Could not save configuration."); }
现在,在更新配置数据的时候不存在任何有效的锁定功能。因此,配置 API 会使用一个优化的合作模型对配置进行更改。在优化的合作模型之下,如果两个应用程序同时打开相同的配置,它们将会得到配置对象的唯一配置。如果某个应用程序尝调用 Save
或 SaveAs
方法对配置文件进行更改,并且实际的配置文件在应用程序已经在获取配置对象之后更新了配置,那么该方法就会引起一个异常。实际文件可能在另一个应用程序更新配置或者对依赖于文件的配置 API 进行更改的时候就已经被更改。
必需的特权
要更改 Web 配置,应用程序需要拥有文件的写入权限,还要拥有包含该文件的目录的创建特权。