请教一个调试时正常运行时更改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);
}
}

// ...
}
...全文
224 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
uno 2007-02-01
  • 打赏
  • 举报
回复
不好意思,我写错了

调试时:
如果在回调函数内设置断点,可以正常获取data
如果把断点都去除,data就得不到——这种情况下,我还无法证实回调函数是否被调用……

***************************************
对你的意见,我有一个疑问:
在回调函数内我可以获得当前被舍弃的Cache数据,此时Context内的数据已经被删除了(断点跟踪数据返回为空)
而且根据业务逻辑,文件更改意味着配置项的内容更改,我的考虑是与其逐条检测更改,不如重新读取数据整体更新
cpp2017 2007-01-31
  • 打赏
  • 举报
回复
调试与运行的不同之处就是用户不同,即权限不同.
cpp2017 2007-01-31
  • 打赏
  • 举报
回复
跟踪一下,是不是回调函数没有执行. 另外一个.个人以为这样写并不是很好. 在依赖文件更改好,马上去初始化.其实没有必要. 应该在访问的时候判断cache中如果没有内容,再去初始化. 这样在没有访问且依赖文件修改后的一段时间内,可以不用占用内在保存这些数据.

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧