Web 下配置文件信息的读写

在基于 .net 2.0 的企业库中,原来的配置应用程序块被废除了,使用了 .net 2.0 自带的读写配置功能,下面我们就来看看 .net 2.0 中读写配置的功能。

即:  ConfigurationManager  类

注意:
ConfigurationManager 是处理客户端应用程序配置文件的首选方法;不推荐使用任何其他方法。
对于 Web 应用程序,建议使用 WebConfigurationManager 类。

这个类的  AppSettings 属性 在以前1.0 的时候,就有了, 2.0 中增加了 ConnectionStrings 属性。
这些都不是今天我们要探讨的内容,我们今天要探讨的内容,是把一个配置类保存到配置文件中,以及把这个配置类从配置文件中实例化出来。

这个配置类,必须是 派生自
System.Configuration.ConfigurationSection 类

如下面的类就是一个配置类

using System.Text;
using System.Configuration;
namespace ConfigTest
{
    class ConfigDataClass : ConfigurationSection
    {
        public ConfigDataClass()
        { }

        [ConfigurationProperty("id")]
        public int ID{
            get{return (int)this["id"];}
            set{   this["id"] = value;}
        }

        [ConfigurationProperty("name")]
        public string Name{
            get{ return this["name"].ToString();}
            set{ this["name"] = value;}
        }

        public override string ToString(){
            StringBuilder info = new StringBuilder();
            info.AppendFormat("id = {0};name = {1}", ID, Name);
            return info.ToString();
        }
    }
}


先说如何把这个配置类更新到配置文件中

// 配置信息类初始化
ConfigDataClass configData = new ConfigDataClass();
configData.ID = 100;
configData.Name = "我是谁?";

// 打开当前文件的配置文件
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// 干掉原先的配置
config.Sections.Remove("SettingsData");
// 把新的配置更新上去
config.Sections.Add("SettingsData", configData);
// 保存配置文件
config.Save();

MessageBox.Show(configData.ToString());


读取配置信息

ConfigDataClass configData = ConfigurationManager.GetSection("SettingsData") as ConfigDataClass;
if (configData == null) return;
MessageBox.Show(configData.ToString());

当文件修改的时候,自动从新登录配置文件需求

这个更简单,只需要使用一个 System.IO.FileSystemWatcher 对象即可
private FileSystemWatcher watcher;

在初始化的时候,订阅文件改变事件。

// Initialize file system watcher
watcher = new FileSystemWatcher(AppDomain.CurrentDomain.BaseDirectory);
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.EnableRaisingEvents = false;

然后在 watcher_Changed 方法中,

private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    if (e.FullPath.ToLower().Contains(".config"))
    {
  for (int i = 0; i < 3; i++)
  {
   try
   {
    // Using the static method, read the cached configuration settings
    ConfigurationManager.RefreshSection("EditorSettings");
    break;
   }
   catch (ConfigurationErrorsException)
   {
    if (i == 2) throw;
    else Thread.Sleep(100);
   }
  }
    }
}

显然,上述的功能已经能满足我们的需求了,所以企业库才废弃了之前的配置管理应用程序块。

 

 

注:这算是对上篇".net 下配置文件的操作"的补充,这里借用了上面的已有示例代码。
上篇 Blog  在  http://blog.joycode.com/ghj/archive/2006/02/10/71293.aspx

WEB 下配置文件的读写跟 客户端应用程序配置文件 下 对配置文件的读写,几乎完全是一样的。只不过 , web.config 有多重继承的问题。
子网站目录下如果没配置,会继承自上级目录。依次类推,这是一个多层继承的问题。

同样是上篇 Blog 的配置类 ,我们下面来看看 Web 下的读写操作
using System.Web.Configuration;

写操作:
卸载掉原来节,新增节来写操作
        ConfigDataClass configData = new ConfigDataClass();
        configData.ID = 100;
        configData.Name = "我是谁?";
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        config.Sections.Remove("SettingsData");
        config.Sections.Add("SettingsData", configData);
        config.Save();

在原来节基础上的修改操作
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        ConfigDataClass configData = config.GetSection("SettingsData") as ConfigDataClass;
        configData.ID = 1003;
        configData.Name = "我";
        config.Save();

读操作:
        ConfigDataClass configData = ConfigurationManager.GetSection("SettingsData") as ConfigDataClass;
        if (configData == null) return string.Empty;
        return configData.ToString();

从上面我们可以看到
除了
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
这一行代码 和 引用的 名称空间  using System.Web.Configuration; 不同外,Web 程序跟 客户端应用程序完全是一样的代码。

不论是 Web 程序,还是 客户端应用程序,有时候,一个配置文件是不够的,我们可能需要多个配置文件,下面我们就看看如何对其他配置文件当系统默认的配置文件来读写。
注意,我们这时候用的是 System.Configuration.Configuration 类,不论 Web 程序,还是 客户端应用程序 都可以用这个类。

更新指定的另外配置文件
        ConfigurationFileMap fileMap = new ConfigurationFileMap();
        fileMap.MachineConfigFilename = @"D:/My2005Codes/WebTestCode/TestWEBSite/aa.config";
        System.Configuration.Configuration config = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

        ConfigDataClass configData = new ConfigDataClass();
        configData.ID = 303;
        configData.Name = "CSDN?";

        config.Sections.Remove("SettingsData");
        config.Sections.Add("SettingsData", configData);
        config.Save();

在写操作之前,这个配置文件可以没有上述配置节,但是必须有下面几行信息,否则就会报没有根节点。
<?xml version="1.0"?>
<configuration>
</configuration>


完成写操作后,这个 aa.config 文件就变成了

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="SettingsData" type="ConfigDataClass, App_Code.yltp08ba, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <SettingsData id="303" name="CSDN?" />
</configuration>

读取指定的另外配置文件

        ConfigurationFileMap fileMap = new ConfigurationFileMap();
        fileMap.MachineConfigFilename = @"D:/My2005Codes/WebTestCode/TestWEBSite/aa.config";
        System.Configuration.Configuration config = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

        ConfigDataClass configData = config.GetSection("SettingsData") as ConfigDataClass;
        if (configData == null) return string.Empty;
        return configData.ToString();


如果是 客户端应用程序,你还可以 通过使用 System.Configuration.ConfigurationManager.OpenMappedExeConfiguration  读写多个客户端应用程序默认配置文件。

当然这些功能完全可以用类的序列化,反序列化来用,但是既然有这个功能,干么不用呢?

你可能感兴趣的:(Web,.net,String,配置管理,Blog,null)