利用XML序列化和Asp.Net Web缓存实现站点配置文件

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

时间: 2024-10-13 00:17:59

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

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-serialization JSON Media-Type Formatter JSON formatting is provided by the JsonMediaTypeFormatter class. By default, JsonMediaTypeFormatter uses the Json.

Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]

前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学习阅读英文文章的目的,又可以学习下微软新发布的技术,其实也很久了,但自己菜鸟一枚,对自己来说都是新技术了.鉴于以上两个原因,本人打算借助google翻译和有道词典,来翻译学习这个系列,并通过博客园来记录自己的翻译学习过程.由于自己阅读水平的确太菜,在借助工具的情况下,有时候搞出来的也是蹩脚的语句,自己读着都难受,尤其是到了Web API路由的那两篇,所以自己想着是不是有别人

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

虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除了对System.Web.dll程序集的依赖,实现在ASP.NET Web API框架中的URL路由系统亦是如此.也就是说,ASP.NET Web API核心框架的URL路由系统与ASP.NET本身的路由系统是相对独立的.但是当我们采用基于Web Host的方式(定义在程序集System.Web.H

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 Web API中的JSON和XML格式化器. 在ASP.NET Web API中,媒体类型格式化器(Media-type Formatter)是一种能够做以下工作的对象: 从HTTP消息体读取CLR(公共语言运行时)对象 将CLR对象写入HTTP消息体 Web API提供了用于JSON和XML的媒体类

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

使用Jil序列化JSON提升Asp.net web api 性能

JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了就是根据HTTP content-type application/json 来判断采用哪种媒体格式化器 具体实现,记得要引入Jil包 public class JilFormatter : MediaTypeFormatter { private readonly Options _jilOpti

ASP.NET Web API实现缓存的2种方式

在ASP.NET Web API中实现缓存大致有2种思路.一种是通过ETag, 一种是通过类似ASP.NET MVC中的OutputCache. 通过ETag实现缓存 首先安装cachecow.server install-package cachecow.server 在WebApiConfig中. public static class WebApiConfig { public static HttpConfiguraiton Register() { var config = new H

ASP.NET利用XML实现旗帜广告和Jquery制作旗帜广告。

一.编写ad.xml,将其放入add_Data中(放在Add_Data中的理由:1.使该XML文件在ASP.NET运行时自动获得对其的读取权限.同时可以防止在浏览器中被查看): <?xml version="1.0" encoding="utf-8"?><Advertisements><Ad> <ImageUrl>要显示图片的链接</ImageUrl> <NavigateUrl>点击图片是指向的

ASP.NET Web API通过ActionFilter来实现缓存

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading; 5 using System.Threading.Tasks; 6 using System.Web; 7 using System.Web.Caching; 8 using System.Web.Http; 9 using System.Web.Http.Controllers; 10 using