1.4.8 通过编程读写Web.config配置节
早在.NET 2.0的时候,微软就提供了ConfigurationManager和WebConfigurationManager这两个类来管理配置文件。其中,ConfigurationManager类在System.Configuration命名空间中,而WebConfigurationManager类在System.Web.Configuration命名空间中。在它们的使用上,对于Web应用程序配置,建议使用 System.Web.Configuration. WebConfigurationManager类,而不建议使用 System.Configuration.ConfigurationManager类。此外,使用时还应该注意其他类都无法继承这两个类。
1. 使用ConfigurationManager访问配置信息
若要使用ConfigurationManager类来访问配置信息,可以调用 GetSection 方法。但对于某些节,例如 appSettings 和 connectionStrings,可以使用 AppSettings 和 ConnectionStrings 来进行访问。如下面的代码所示:
- //获取connectionStrings节点
- ConfigurationManager.ConnectionStrings["ConnectString"]
- //获取appSettings节点
- ConfigurationManager.AppSettings["CustomerName"];
2. 使用WebConfigurationManager访问配置信息
前面已经说过,在对于Web应用程序配置操作方面,ConfigConfigurationManager类提供强大的支持,它允许你在运行时从配置文件抓取信息。在日常操作中,主要使用它的如下成员,如表1-2所示。
表1-2 ConfigConfigurationManager类的主要成员
![]() |
(2)在<appSettings>节点中添加新元素
- //获取appSettings节点
- WebConfigurationManager.AppSettings["CustomerName"];
- //获取connectionStrings节点
- WebConfigurationManager.ConnectionStrings["ConnectString"];
- 上面只是简单地获取<appSettings>配置节点的值,除此之外,还可以像下面这样获取:
- //打开配置文件
- Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
- //获取appSettings节点
- AppSettingsSection appSettings = (AppSettingsSection) config.GetSection("appSettings");
- //获取key为CustomerName的value值
- string customerName = appSettings.Settings["CustomerName"].Value;
- //获取所有key的value值
- string[] appKeys = appSettings.Settings.AllKeys;
- for (int i = 0; i < appSettings.Settings.Count; i++)
- {
- Response.Write(appSettings.Settings[appKeys[i]].Value);
- }
- //打开配置文件
- Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
- //获取appSettings节点
- AppSettingsSection appSection = (AppSettingsSection) config.GetSection("appSettings");
- //在appSettings节点中添加元素
- appSection.Settings.Add("newkey1", "newkey1's value");
- appSection.Settings.Add("newkey2", "newkey2's value");
- //保存
- config.Save();
运行代码之后就可以看见配置文件的<appSettings>节点中添加了两个新元素,如下所示:
- <appSettings>
- <add key="newkey1" value="newkey1's value" />
- <add key="newkey2" value="newkey2's value" />
- </appSettings>
(3)修改和删除<appSettings>节点或属性
- //打开配置文件
- Configuration config = WebConfigurationManager. OpenWebConfiguration("~");
- //获取appSettings节点
- AppSettingsSection appSection = (AppSettingsSection) config.GetSection("appSettings");
- //删除appSettings节点中的元素
- appSection.Settings.Remove("newkey1");
- //修改appSettings节点中的元素
- appSection.Settings["newkey2"].Value = "修改newkey2的值";
- config.Save();
- 运行结果如下所示:
- <appSettings>
- <add key="newkey2" value="修改newkey2的值" />
- </appSettings>
3. 用XmlDocument修改Web.config配置节点的值
除了上面的方法之外,还可以使用XmlDocument类来修改Web.config的节点值。程序方法如代码清单1-10所示。
代码清单1-10 用程序修改<appSettings>配置节里Key的值
- /// <summary>
- /// 修改web.config文件appSettings配置节中的add里的value属性
- /// </summary>
- /// <param name="key">add里的key</param>
- /// <param name="strValue">要修改的值</param>
- public void UpdateWebConfig(string key, string strValue)
- {
- //要修改的配置文件路径
- string keyPath = "/configuration/appSettings/add[@key='?']";
- XmlDocument webConfig = new XmlDocument();
- //web.config文件的存储路径
- string webConfigPath = HttpContext.Current. Server.MapPath("~") + @"\web.config";
- //将web.config文件加载到XmlDocument中
- webConfig.Load(webConfigPath);
- //查找要修改的配置节
- XmlNode updateKey = webConfig.SelectSingleNode ((keyPath.Replace("?", key)));
- if (updateKey == null)
- {
- throw new ArgumentException("没有找到<add key='" + key + "' value=/>的配置节");
- }
- //修改配置节的值
- updateKey.Attributes["value"].InnerText = strValue;
- //修改后保存
- webConfig.Save(webConfigPath);
- }
好,现在假设要通过上面的方法将“<add key="Title" value="系统名称"/>”的“value”修改成“EipsoftCRM管理系统”,我们只要传入相关的参数就可以了。代码如下:
- UpdateWebConfig("Title"," EipsoftCRM管理系统")
利用上面的方法,读者可以举一反三,使用相同的处理方式修改其他配置节。
注意 虽然可以通过多种手段去修改配置文件里的配置节,但这样做是非常不理想的。修改配置所花的代价很大:文件的访问速度会很慢,而且它所需要的同步化增加了许多额外的开销,新程序域创建(在每次配置设置修改时发生)会花很大代价。所以,除非特殊情况,建议不要轻易去修改配置文件。