请教一个调试时正常运行时更改CacheDependency关联文件后Cache丢失的问题,比较怪异
uno 2007-01-31 10:28:19 症状是:
调试的时候一切正常——在其他窗体内访问CacheManager.ConfigData可以取得正确的内容,当cache.config文件被更改后,刷新窗体能够得到修改后的内容
运行的时候就出问题——在其他窗体内访问CacheManager.ConfigData可以取得正确的内容,当cache.config文件被更改后,刷新窗体CacheManager.ConfigData返回总是null
何解?
附上源码:
****************************************************************
public class CacheManager
{
private const string CONFIGFILE_DEFAULTNAME = "cache.config";
private static string _Key = "_CacheConfig";
private static HttpContext _Context = null;
public static CacheConfigData ConfigData
{
get
{
try
{
return (CacheConfigData)_Context.Cache[_Key];
}
catch
{
return null;
}
}
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="context">应用程序Context对象</param>
public static void Init(HttpContext context)
{
if (null == context) return;
_Context = context;
// 获取配置文件路径(默认的配置文件名)
string configFilePath = context.Server.MapPath(Path.Combine("~/", CONFIGFILE_DEFAULTNAME));
CacheConfigData dataCacheConfig = GetConfigData(configFilePath);
if (null == dataCacheConfig) return;
InitCache(dataCacheConfig); // 实现中...
// 将配置数据加入缓存
AddConfigToCache(_Key, dataCacheConfig, configFilePath);
}
/// <summary>
/// 获取配置数据
/// </summary>
/// <param name="configFilePath">配置文件路径</param>
/// <returns>配置数据</returns>
protected static CacheConfigData GetConfigData(string configFilePath)
{
// 如文件不存在则返回
if (!File.Exists(configFilePath)) return null;
// 创建配置数据集对象
CacheConfigData dataCacheConfig = new CacheConfigData();
try
{
// 读取配置文件中的数据到数据集
dataCacheConfig.ReadXml(configFilePath);
}
catch
{
}
// 如果没有数据被读入则返回
if (!dataCacheConfig.HasChanges()) return null;
return dataCacheConfig;
}
/// <summary>
/// 将配置数据加入系统缓存
/// </summary>
/// <param name="key">键值</param>
/// <param name="data">数据</param>
/// <param name="fileDependency">依赖的配置文件</param>
protected static void AddConfigToCache(string key, CacheConfigData data, string fileDependency)
{
if (_Context == null) return;
// 创建缓存依赖(关联依赖的配置文件)
CacheDependency dependency = new CacheDependency(fileDependency);
// 创建缓存更改时的回调函数
System.Web.Caching.CacheItemRemovedCallback callback = new CacheItemRemovedCallback(CacheManager_CacheItemRemovedCallback);
// 将配置数据加入系统缓存(不过期)
_Context.Cache.Add(_Key, data, dependency,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
callback);
}
/// <summary>
/// 缓存更改时的回调函数
/// </summary>
/// <param name="key"></param>
/// <param name="data"></param>
/// <param name="reason"></param>
protected static void CacheManager_CacheItemRemovedCallback(string key, object data, System.Web.Caching.CacheItemRemovedReason reason)
{
if (!(data is CacheConfigData)) return;
if (reason == System.Web.Caching.CacheItemRemovedReason.DependencyChanged)
{
Init(_Context);
}
}
// ...
}