代码之家  ›  专栏  ›  技术社区  ›  orip

从文件中动态读取资源

  •  3
  • orip  · 技术社区  · 16 年前

    部署后,我想更改一些字符串,而无需重新启动进程(因此.config文件已丢失)。

    可以编写高效解析配置文件(XML/JSON/YAML/?)的代码,例如将结果缓存X秒或监视其变化 FileSystemWatcher

    Json.NET CacheDependency

    public class CachingJsonParser
    {
        public static CachingJsonParser Create()
        {
            return new CachingJsonParser(
                HttpContext.Current.Server,
                HttpContext.Current.Cache);
        }
    
        private readonly HttpServerUtility _server;
        private readonly Cache _cache;
    
        public CachingJsonParser(HttpServerUtility server, Cache cache)
        {
            _server = server;
            _cache = cache;
        }
    
        public T Parse<T>(string relativePath)
        {
            var cacheKey = "cached_json_file:" + relativePath;
            if (_cache[cacheKey] == null)
            {
                var mappedPath = _server.MapPath(relativePath);
                var json = File.ReadAllText(mappedPath);
                var result = JavaScriptConvert.DeserializeObject(json, typeof(T));
                _cache.Insert(cacheKey, result, new CacheDependency(mappedPath));
            }
            return (T)_cache[cacheKey];
        }
    }
    

    {
        "UserName": "foo",
        "Password": "qwerty"
    }
    

    对应数据类:

    class LoginData
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    

    解析和缓存:

    var parser = CachingJsonParser.Create();
    var data = parser.Parse<LoginData>("~/App_Data/login_data.json");
    
    1 回复  |  直到 16 年前
        1
  •  5
  •   Rashmi Pandit    16 年前

    CacheDependency : CacheItemUpdateCallback :

    编辑: 这是我的示例代码

    protected void Page_Load(object sender, EventArgs e)
    {
            XmlDocument permissionsDoc = null;
    
            if (Cache["Permissions"] == null)
            {
                string path = Server.MapPath("~/XML/Permissions.xml");
                permissionsDoc = new XmlDocument();
                permissionsDoc.Load(Server.MapPath("~/XML/Permissions.xml"));
                Cache.Add("Permissions", permissionsDoc,
                                new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                               Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                        CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
            }
            else
            {
                permissionsDoc = (XmlDocument)Cache["Permissions"];
            }
    }
    
    private void ReloadPermissionsCallBack(string key, object value, CacheItemRemovedReason reason)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/XML/Permissions.xml"));
            Cache.Insert("Permissions", doc ,
                                new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                               Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                        CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
        }
    
    推荐文章