【问题标题】:Dynamically reading resources from a file从文件中动态读取资源
【发布时间】:2010-10-26 20:24:39
【问题描述】:

我一直在将 resx 文件用于静态字符串,以便有一个中心位置来更改它们。问题是项目构建和部署后我无法更改它们。

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

可以编写高效解析配置文件 (XML/JSON/YAML/?) 的代码,例如将结果缓存 X 秒或使用 FileSystemWatcher 监视它的更改,但是已经完成了类似的操作吗?

编辑:使用 Json.NET 和 Rashmi Pandit 指向 CacheDependency 的指针我编写了这个 JSON 解析类,它会缓存解析结果,直到文件更改:

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];
    }
}

用法

JSON 文件:

{
    "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");

【问题讨论】:

    标签: c# asp.net json caching resources


    【解决方案1】:

    您可以使用 xml 文件并将其存储在缓存中。当对文件进行任何更改时,您可以使用 CacheDependency 重新加载缓存。 链接: CacheDependencyCacheItemUpdateCallback

    在您的情况下,您的缓存应该将 XmlDocument 存储为值

    编辑: 这是我的示例代码

    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));
        }
    

    【讨论】:

    • 太棒了,我以前从未听说过 CacheDependency :)
    • 我正在使用它来缓存 xml 文件中的用户权限。每次 xml 文件发生更改时,都会调用 CacheItemUpdateCallback 将 xml 文件重新加载到缓存中。
    • 很酷的事情(对我来说)是它不在乎你存储什么,XML 或其他 - 非常好!
    • 谢谢...所以我猜你会用它:)
    • BTW Rashmi Pandit - 我看到您不需要使用回调或复制解析逻辑:只需保留 if (Cache[key] == null) 检查,并添加缓存依赖项Cache.Insert(键、值、依赖)
    猜你喜欢
    • 2016-06-17
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多