我们经常会遇到这样的场景:
今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的。
一般最初的做法就是加一个配置到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. Devexpress GridControl

    1.隐藏“Drag a column header here to group by that column”如下: 选择gridview->属性 选择OptionView->ShowGr ...

  2. 调试opencv调用摄像头程序时碰到的问题

    昨天晚上想把opencv学习笔记整理一下,当跑opencv调用摄像头的程序的时候老是出现Assertion failed (size.width>0 && size.height ...

  3. /*用户登录注册页面输入框的设置*/<span>的使用

    <!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...

  4. 【总结整理】overflow: auto/hidden;清除自己

    .top-nav{ font-size: 12px; font-weight: bold; list-style-type: none; border-bottom: 8px solid #DC4E1 ...

  5. TCP的三次握手和四次挥手,为什么?

    首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双 ...

  6. 转:JMeter整合InfluxDB,Grafana让测试结果实时显示

    软件版本: apache-jmeter-2.13.tgz grafana-2.1.1-1.x86_64.rpm influxdb-0.8.8-1.x86_64.rpm 虽然官方不在支持influxdb ...

  7. jmeter响应结果乱码问题

    问题分析 当响应数据或响应页面没有设置编码时,jmeter会按照jmeter.properties文件中,sampleresult.default.encoding设置的格式解析 默认ISO-8859 ...

  8. 2. DVWA亲测CSRF漏洞

    DVWA登陆      用户名:admin   密码:password Low级: 查看源代码: <?php if (isset($_GET['Change'])) { // Turn requ ...

  9. elasticsearch shard 和 replica

    (1)index包含多个shard(2)每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力(3)增减节点时,shard会自动在nodes中负载均衡(4) ...

  10. 《OD学storm》20160828

    一.Storm项目 1. 架构 javasdk -> nginx -> 日志文件 -> flume agent(collector) -> hdfs -> kafka - ...