欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net MVC网站中配置文件的读写

程序员文章站 2023-11-12 23:39:04
网站中有很多需要设置的内容,像网站信息,注册设置,上传设置等。如果保存在数据库中需要单独建张表,表中只有一条记录,这样会让数据库很臃肿,而且频繁存取数据库的效率也是个问题。...

网站中有很多需要设置的内容,像网站信息,注册设置,上传设置等。如果保存在数据库中需要单独建张表,表中只有一条记录,这样会让数据库很臃肿,而且频繁存取数据库的效率也是个问题。而保存在config文件里是个不错选择,而且带有缓存功能! 

我们可以在web.config的配置节写入配置。 

<configuration>
 <configsections>
 <section name="entityframework" type="system.data.entity.internal.configfile.entityframeworksection, entityframework, version=6.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089" requirepermission="false" />
 <!--这里可以定义配置节 -->
 <!-- for more information on entity framework configuration, visit http://go.microsoft.com/fwlink/?linkid=237468 -->
 </configsections> 

但是把大量的配置都写入这里也会造成web.config的臃肿,可以采用把配置节定义在这里,把具体配置信息保存在其他文件中。 

以上传配置信息为例,看一下理想的结构 

.Net MVC网站中配置文件的读写

config\upload.config的内容 

.Net MVC网站中配置文件的读写

1、配置的元素。采用<add />的形式,是一个键和值得表示形式。<add key="maxsize" value="1500000" />。 
2、元素的集合,里面定义一系列的元素。<uploadconfig>……</uploadconfig> 
3、自定义节,表示自定义的一个节点。<section name="uploadconfig"  type="ninesky.models.config.uploadconfig, ninesky.models"/> 

name:节点名,type:处理节点的类行,逗号前是类名,逗号后是缩在程序集。

我们要创建这个类来管理配置 

一、创建键,值元素类。 

里面只有两个读写属性key和value,内容非常简单 

using system.configuration;

namespace ninesky.models.config
{
 /// <summary>
 /// 键值元素类
 /// <remarks>
 /// 创建:2014.03.09
 /// </remarks>
 /// </summary>
 public class keyvalueelement:configurationelement
 {
  /// <summary>
  /// 键
  /// </summary>
  [configurationproperty("key",isrequired=true)]
  public string key {
   get { return this["key"].tostring(); }
   set { this["key"] = value; }
  }
  /// <summary>
  /// 值
  /// </summary>
  [configurationproperty("value")]
  public string value
  {
   get { return this["value"].tostring(); }
   set { this["value"] = value; }
  }
 }
}

二、创建元素集合类。内容很简单都进行了注释 

using system;
using system.configuration;

namespace ninesky.models.config
{
 /// <summary>
 /// 元素集合类
 /// <remarks>
 /// 创建:2014.03.09
 /// </remarks>
 /// </summary>
 [configurationcollection(typeof(keyvalueelement))]
 public class keyvalueelementcollection:configurationelementcollection
 {
  //忽略大小写
  public keyvalueelementcollection() : base(stringcomparer.ordinalignorecase) { }
  /// <summary>
  /// 集合中指定键的元素
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  new public keyvalueelement this[string name]
  {
   get { return (keyvalueelement)base.baseget(name); }
   set
   {
    if (base.properties.contains(name)) base[name] = value;
    else base.baseadd(value);
   }
  }
  /// <summary>
  /// 创建新元素.
  /// 必须重写
  /// </summary>
  /// <returns></returns>
  protected override configurationelement createnewelement()
  {
   return new keyvalueelement();
  }
  /// <summary>
  /// 获取元素的键
  /// </summary>
  /// <param name="element"></param>
  /// <returns></returns>
  protected override object getelementkey(configurationelement element)
  {
   return ((keyvalueelement)element).key;
  }
 }
}

三、配置节类 

类中定义私有属性keyvalues。进行读写配置节集合,然后定义一系列的需要的配置属性,操作就是对keyvalues的元素读写。 

using system.configuration;

namespace ninesky.models.config
{
 /// <summary>
 /// 上传设置配置节
 /// <remarks>
 /// 创建:2014.03.09
 /// </remarks>
 /// </summary>
 public class uploadconfig:configurationsection
 {
  private static configurationproperty _property = new configurationproperty(string.empty, typeof(keyvalueelementcollection), null, configurationpropertyoptions.isdefaultcollection);
  /// <summary>
  /// 配置列表
  /// </summary>
  [configurationproperty("", options = configurationpropertyoptions.isdefaultcollection)]
  private keyvalueelementcollection keyvalues
  {
   get { return (keyvalueelementcollection)base[_property]; }
   set { base[_property] = value; }
  }
  /// <summary>
  /// 最大大小
  /// </summary>
  public int maxsize
  {
   get
   {
    int _value =0;
    if (keyvalues["maxsize"] != null) int.tryparse(keyvalues["maxsize"].value, out _value);
    return _value;
   }
   set
   {
    if (keyvalues["maxsize"] == null) keyvalues["maxsize"] = new keyvalueelement() { key = "maxsize", value = value.tostring() };
    else keyvalues["maxsize"].value = value.tostring();
   }
  }

  /// <summary>
  /// 上传目录
  /// 为应用程序目录起的文件夹名,前面不带~/
  /// </summary>
  public string path
  {
   get
   {
    if (keyvalues["path"] == null) return "upload";
    return keyvalues["path"].value;
   }
   set
   {
    if (keyvalues["path"] == null) keyvalues["path"] = new keyvalueelement() { key = "path", value = value };
    else keyvalues["path"].value = value;
   }
  }

  /// <summary>
  /// 允许上传的图片类型文件扩展,多个用“,”隔开
  /// </summary>
  public string imageext
  {
   get
   {
    if (keyvalues["imageext"] == null) return string.empty;
    return keyvalues["imageext"].value;
   }
   set
   {
    if (keyvalues["imageext"] == null) keyvalues["imageext"] = new keyvalueelement() { key = "imageext", value = value };
    else keyvalues["imageext"].value = value;
   }
  }

  /// <summary>
  /// 允许上传的flash类型文件扩展,多个用“,”隔开
  /// </summary>
  public string flashext
  {
   get
   {
    if (keyvalues["flashext"] == null) return string.empty;
    return keyvalues["flashext"].value;
   }
   set
   {
    if (keyvalues["flashext"] == null) keyvalues["flashext"] = new keyvalueelement() { key = "flashext", value = value };
    else keyvalues["flashext"].value = value;
   }
  }

  /// <summary>
  /// 允许上传的媒体类型文件扩展,多个用“,”隔开
  /// </summary>
  public string mediaext
  {
   get
   {
    if (keyvalues["mediaext"] == null) return string.empty;
    return keyvalues["mediaext"].value;
   }
   set
   {
    if (keyvalues["mediaext"] == null) keyvalues["mediaext"] = new keyvalueelement() { key = "mediaext", value = value };
    else keyvalues["mediaext"].value = value;
   }
  }

  /// <summary>
  /// 允许上传的文件类型文件扩展,多个用“,”隔开
  /// </summary>
  public string fileext
  {
   get
   {
    if (keyvalues["fileext"] == null) return string.empty;
    return keyvalues["fileext"].value;
   }
   set
   {
    if (keyvalues["fileext"] == null) keyvalues["fileext"] = new keyvalueelement() { key = "fileext", value = value };
    else keyvalues["fileext"].value = value;
   }
  }
 }
}

四、读取配置 
也是最关系的,配置信息怎么读出来。在上面类写好后读取非常容易了,只需用webconfigurationmanager.openwebconfiguration("~"). getsection()获取配置节的实例,局可以使用属性值了 

var _uploadconfig = system.web.configuration.webconfigurationmanager.openwebconfiguration("~").getsection("uploadconfig") as ninesky.models.config.uploadconfig;
   //文件最大限制
   int _maxsize = _uploadconfig.maxsize;
   //文件路径
   string _fileparth = _uploadconfig.path ;
   string _dirname;
   //允许上传的类型
   hashtable exttable = new hashtable();
   exttable.add("image", _uploadconfig.imageext);
   exttable.add("flash", _uploadconfig.fileext);
   exttable.add("media", _uploadconfig.mediaext);
   exttable.add("file", _uploadconfig.fileext);

五、写入配置
 跟读取类似,把属性值设置后save()一下,内容就会保存到config\upload.config中。 

代码如下: 

var _uploadconfig = system.web.configuration.webconfigurationmanager.openwebconfiguration("~").getsection("uploadconfig") as ninesky.models.config.uploadconfig;
   //文件最大限制
   int _maxsize = _uploadconfig.maxsize;
   _uploadconfig.fileext = "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2";
   _uploadconfig.flashext = "swf,flv";
   _uploadconfig.imageext = "gif,jpg,jpeg,png,bmp";
   _uploadconfig.mediaext = "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb";
   _uploadconfig.path = "upload";
   _uploadconfig.currentconfiguration.save();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。