我们经常会遇到这样的场景:
今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的。
一般最初的做法就是加一个配置到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. “在注释中遇到意外的文件结束”--记一个令人崩溃的bug

    下午写程序,写的好好的,突然报错"在注释中遇到意外的文件结束". 下面是官方给出的错误原因是缺少注释终结器 (* /). // C1071.cpp int main() { } / ...

  2. /*透明度设置的两种方式,以及hover的用法,fixed,(relative,absolute)这两个一起用*/

    <!DOCTYPE html> /*透明度设置的两种方式,以及hover的用法,fixed,(relative,absolute)这两个一起用*/ <html lang=" ...

  3. Jmeter连接MySQL配置(能执行多条sql语句)

    Database URL为MySQL的连接串,如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”

  4. R: vector 向量的创建、操作等。

    ################################################### 问题:创建.操作向量   18.4.27 怎么创建向量 vector,,及其相关操作 ??? 解 ...

  5. push和commit的区别

    push和commit的区别 git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库.git commit操作的是本地库,git push操作的是远程库. git c ...

  6. Android运行时Crash自动恢复框架-Recovery

    转自:http://zhengxiaoyong.me/2016/09/05/Android%E8%BF%90%E8%A1%8C%E6%97%B6Crash%E8%87%AA%E5%8A%A8%E6%8 ...

  7. docker私有仓库的搭建

    Docker搭建本地私有仓库的详细步骤 Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库.使用私有仓库有许多优点:一.节省网络带宽,针对于每个镜像,不用每个人都 ...

  8. IIS中使用子目录文件作为默认文档(Default Document)替代重定向

    以前一直以为IIS应用程序的默认文档只能设置根目录下的文件,像index.html,default.aspx等,后来经同事指点,原来子目录或者子应用程序下的文件也可以添加到根应用程序的默认文档列表中. ...

  9. 洛谷P3070 [USACO13JAN]岛游记Island Travels

    P3070 [USACO13JAN]岛游记Island Travels 题目描述 Farmer John has taken the cows to a vacation out on the oce ...

  10. 接水果(fruit)——整体二分+扫描线

    题目 [题目描述] 风见幽香非常喜欢玩一个叫做 osu! 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经 DT FC 了 The big black,她觉得这个游戏太简单了,于是发明了一个更加难的 ...