using System; using System.Collections.Generic; using System.Web; using System.Web.Caching; /// <summary> ///CacheProvider 的摘要说明 /// </summary> public class CacheProvider { public CacheProvider() { } /// <summary> /// 更新某个缓存,请确保缓存键与依赖的文件名称相同 /// </summary> /// <param name="cacheKey">缓存键</param> /// <param name="obj">该键缓存所存的对象</param> public static void UpdateCache(string cacheKey, object obj) { lock (typeof(CacheProvider)) { try { if (HttpContext.Current.Cache[cacheKey] == null) { CreateCache(cacheKey, obj); } } catch (Exception ex) { Tools.Loger("", ex.Message.ToString()); } } } /// <summary> /// 创建新缓存 /// </summary> /// <param name="cacheKey">缓存键</param> /// <param name="obj">该键缓存所存的对象</param> static void CreateCache(string cacheKey, object obj) { lock (typeof(CacheProvider)) { try { string filename = SetDepencyFilePath(cacheKey); if (filename.Trim().Length == 0) { HttpContext.Current.Response.Write("缓存依赖的文件不存在,导致此原因的问题可能是缓存的键同所依赖的文件的名称不同。"); return; } HttpRuntime.Cache.Insert(cacheKey, obj, new CacheDependency(filename), Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, new CacheItemRemovedCallback(CacheItemRemoved)); } catch (Exception ex) { Tools.Loger("", ex.Message.ToString()); } } } /// <summary> /// 取出依赖的文件的文件路径 /// </summary> /// <param name="cacheKey">依赖取出文件的缓存的键</param> /// <returns>依赖文件的文件路径</returns> static string SetDepencyFilePath(string cacheKey) { try { string virtualPath = string.Format("~/App_Data/{0}.xml", cacheKey); string filePath = HttpContext.Current.Server.MapPath(virtualPath); if (System.IO.File.Exists(filePath)) { return filePath; } else { return string.Empty; } } catch (Exception ex) { Tools.Loger("", ex.Message.ToString()); return string.Empty; } } /// <summary> /// 从 System.Web.Caching.Cache 移除缓存项时通知应用程序的回调方法。 /// </summary> /// <param name="key">从缓存中移除的键。</param> /// <param name="obj">与从缓存中移除的键关联的 System.Object 项。</param> /// <param name="reason"> System.Web.Caching.CacheItemRemovedReason 枚举指定的、从缓存移除项的原因。</param> static void CacheItemRemoved(string key, object obj, CacheItemRemovedReason reason) { try { if (CacheItemRemovedReason.DependencyChanged == reason) { CreateCache(key, obj); } } catch (Exception ex) { Tools.Loger("", ex.Message.ToString()); } } }