我们经常会遇到这样的场景:
今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的。
一般最初的做法就是加一个配置到Web.Config文件的AppSettings中去。但是这样有一个问题,那就是改一下配置节点,AppDomain就需要重启,很是不爽。
变通一点的会搞出一个xml文件,利用序列化去动态的读取。但是,哥!每次都读文件不觉得太耗IO吗?尤其是使用频率高话?

下面上代码吧,懒的废话了,关键地方都注释了,也不是什么高深的技术:

先来配置文件(注意Config路径要自己建,代码没有处理)和对应的配置文件代码:

<?xml version="1.0" encoding="utf-8"?>
<SimpleBizConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>12</ID>
<Key>MyKey</Key>
<ListSimple>
<string>简单</string>
<string>list</string>
<string>集合</string>
</ListSimple>
</SimpleBizConfig>
using System.Text;
using Glutton.Web.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebTest.Models
{
public class SimpleBizConfig : ISimpleConfig
{
/// <summary>
/// 默认配置文件路径
/// </summary>
public string GetPath()
{
return "~/Config/SimpleBizConfig.cfg";
} public string GetCacheKey()
{
return "~/MyConfig_SimpleBizConfig";
} public SimpleBizConfig()
{
this.ID = 1;
this.Key = "MyKey";
this.ListSimple = new List<string>();
} public int ID { get; set; } public string Key { get; set; } public List<string> ListSimple { get; set; } internal string Desc()
{
StringBuilder sb = new StringBuilder();
sb.Append("类型:SimpleBizConfig").Append("<br/>"); sb.Append("ID = " + this.ID.ToString()).Append("<br/>");
sb.Append("Key = " + this.Key).Append("<br/>"); sb.Append("list").Append("<br/>"); for (int i = 0; i < this.ListSimple.Count; i++)
{
sb.Append("index:" + i.ToString() + ",value:" + ListSimple[i]).Append("<br/>");
} return sb.ToString();
}
}
}

再来管理配置文件的类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Caching;
using System.Xml.Serialization; namespace Glutton.Web.Configuration
{
public interface ISimpleConfig
{
string GetPath(); string GetCacheKey();
} public class ConfigManager
{
public static T GetConfig<T>() where T : class ,ISimpleConfig, new()
{
T tmpT = new T();
string cacheKey = tmpT.GetCacheKey(); //先尝试从cache中取数据
T t = GetFromCache<T>(cacheKey);//很郁闷,没有静态泛型接口 if (t != null)
{
return t;
} //cache没有数据,直接读配置文件
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); string configFilePath = HttpContext.Current.Server.MapPath(tmpT.GetPath()); if (!File.Exists(configFilePath))
{
//文件不存在,初始化,这里需要配置文件类实现默认的初始化动作
using (TextWriter writer = new StreamWriter(configFilePath))
{
t = new T();
xmlSerializer.Serialize(writer, t);
}
}
else
{
using (FileStream fs = new FileStream(configFilePath, FileMode.Open))
{
t = xmlSerializer.Deserialize(fs) as T;
}
} //存到缓存里面去,依赖web缓存的文件依赖功能实现监控配置文件修改
SetToCache<T>(cacheKey, configFilePath, t); return t;
} private static void SetToCache<T>(string cacheKey, string configFilePath, T t) where T : class ,new()
{
HttpRuntime.Cache.Insert(cacheKey, t, new CacheDependency(configFilePath), //文件依赖过期
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);
} private static T GetFromCache<T>(string cacheKey) where T : class ,new()
{
return HttpRuntime.Cache[cacheKey] as T;
}
}
}

看看调用的方法,HomeController里面加了一个测试方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Glutton.Web.Configuration;
using WebTest.Models; namespace WebTest.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
} public ActionResult About()
{
ViewBag.Message = "Your application description page."; return View();
} public ActionResult Contact()
{
ViewBag.Message = "Your contact page."; return View();
} public string TestCfg()
{
return ConfigManager.GetConfig<SimpleBizConfig>().Desc();
}
}
}

看看效果,:-D:

利用XML序列化和Asp.Net Web缓存实现站点配置文件的更多相关文章

  1. JSON and XML Serialization in ASP.NET Web API

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-seri ...

  2. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  3. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  4. ASP.NET Web API框架揭秘:路由系统的几个核心类型

    ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...

  5. Professional C# 6 and .NET Core 1.0 - Chapter 42 ASP.NET Web API

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处: -------------------------------------------------------- ...

  6. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  7. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  8. 在asp.net web api中利用过滤器设置输出缓存

    介绍 本文将介绍如何在asp.net web api中利用过滤器属性实现缓存. 实现过程 1,首先在web.config文件下appsettings下定义“CacheEnabled”和“CacheTi ...

  9. ASP.NET Web API编程——序列化与内容协商

    1 多媒体格式化器 多媒体类型又叫MIME类型,指示了数据的格式.在HTTP协议中多媒体类型描述了消息体的格式.一个多媒体类型包括两个字符串:类型和子类型. 例如: text/html.image/p ...

随机推荐

  1. 3.JasperReports学习笔记3-在浏览器生成PDF文件

    转自:https://i.cnblogs.com/posts?categoryid=921197 一.新建web工程,导入jasperreports所需的jar包,配置web.xml <serv ...

  2. linux命令-bzip2压缩

    gzip和bzip2 都是压缩命令  区别是压缩算法不一样  一般bzip2压缩的效率高  都不能压缩目录 bzip2 压缩 [root@wangshaojun ~]# bzip2 install.l ...

  3. 【问题】Expandable数据集的定义的正确方法,TabActivity弃用替代,Gallery替代,imageswitcher

    Expandable 问题: http://www.cnblogs.com/xingyyy/p/3389611.html 扩展阅读:http://blog.csdn.net/lmj623565791/ ...

  4. 第2天视频 08_androidHelloworld

    为什么应用的包名要用公司域名倒写呢?如何区分不同的安卓应用?高版本的应用装了之后会把低版本的应用覆盖掉.如果是不同的应用跟其他应用没关系只要装上去就可以了.区别不同的应用用的比较关键的东西是一个是应用 ...

  5. 为组件设定UI

    -----------------siwuxie095                             工程名:CustomizeSwing 包名:com.siwuxie095.swing 类 ...

  6. JSP错误页面

    exception是JSP九大内置对象之一,其实例代表其他页面的异常和错误.只有当页面是错误处理页面时,即isErroePage为 true时,该对象才可以使用.对于C项,errorPage的实质就是 ...

  7. php小块代码

    //页面本身网址 "http://".$_SERVER["HTTP_HOST"].preg_replace("/[^\/]+$/",&quo ...

  8. 【Strtus2】

    基于mvc设计模式的web应用框架!strtus2作为控制器来建立模型与视图数据的交互.

  9. Note: OBLIVIATE: A Data Oblivious File System for Intel SGX

    OBLIVIATE redesigned ORAM for SGX filesystem operations for confuse access patterns to protect user ...

  10. Maven项目骨架搭建

    1. 如何使用Maven的archetype快速生成一个新项目 2. Maven之自定义archetype生成项目骨架(一) 3. 使用maven3 创建自定义的archetype 4. 使用mave ...