Exemplo n.º 1
0
        /// <summary>
        /// 创建持久化输出流
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        protected override Stream CreateSaveStream(CacheToken token)
        {
            Directory.CreateDirectory(PhysicalPath);
            var path = Path.Combine(PhysicalPath, CreateFilename(token));

            return(File.OpenWrite(path));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 创建一个标准缓存策略
        /// </summary>
        /// <param name="context">请求上下文</param>
        /// <param name="token">缓存标示</param>
        /// <param name="provider">缓存策略提供程序</param>
        /// <param name="duration">缓存持续时间</param>
        /// <param name="enableClientCache">是否启用客户端缓存</param>
        /// <param name="localcacheVirtualPath">静态文件缓存虚拟路径</param>
        /// <param name="enableMemoryCache">是否启用内存缓存</param>
        public StandardCachePolicy(HttpContextBase context, CacheToken token, ICachePolicyProvider provider, TimeSpan duration, bool enableClientCache, string localcacheVirtualPath, bool enableMemoryCache)
            : base(context, token, provider)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (provider == null)
            {
                throw new ArgumentNullException("provider");
            }


            Duration          = duration;
            EnableClientCache = enableClientCache;

            if (localcacheVirtualPath != null)
            {
                var physicalPath = context.Server.MapPath(localcacheVirtualPath);
                CacheStorageProvider = new StaticFileCacheStorageProvider(physicalPath, enableMemoryCache);
            }
            else
            {
                CacheStorageProvider = new WebCacheStorageProvider(HttpRuntime.Cache);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 缓存项是否还有效
        /// </summary>
        /// <param name="token">缓存标识,检查检查缓存项的标识是否与提供的一致,否则也认为缓存项无效</param>
        /// <returns>是否有效</returns>
        public bool IsValid(CacheToken token)
        {
            if (IsValid())
            {
                return(CacheToken == token);
            }

            return(false);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 获取缓存项
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public virtual CacheItem GetCacheItem(CacheToken token)
        {
            var cacheItem = LoadCacheItem(token);

            if (cacheItem != null && cacheItem.IsValid(token))//检查缓存是否已过期
            {
                return(cacheItem);
            }

            return(null);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 创建持久化输入流
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        protected override Stream CreateLoadStream(CacheToken token)
        {
            var path = Path.Combine(PhysicalPath, CreateFilename(token));

            if (File.Exists(path))
            {
                return(File.OpenRead(path));
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// 创建一个缓存项
        /// </summary>
        /// <param name="token">缓存项的缓存依据</param>
        /// <param name="cached">缓存的数据</param>
        /// <param name="duration">最大缓存时间</param>
        public CacheItem(CacheToken token, ICachedResponse cached, TimeSpan duration)
        {
            CacheToken     = token;
            CachedResponse = cached;

            var shake  = Math.Min(DurationWhenCreated.TotalMilliseconds / 50, maxShake.TotalMilliseconds);
            var random = new Random(DateTime.Now.Millisecond);
            var offset = TimeSpan.FromMilliseconds(random.NextDouble() * shake);

            Expiration = DateTime.UtcNow + duration + offset;

            DurationWhenCreated = duration;
        }
Exemplo n.º 7
0
        /// <summary>
        /// 根据缓存标识创建静态缓存的文件名
        /// </summary>
        /// <param name="token">缓存标识</param>
        /// <returns></returns>
        protected virtual string CreateFilename(CacheToken token)
        {
            var cacheKey = token.CacheKey();
            var name     = invalidPathCharactor.Replace(token.CacheKey(), "");

            if (name.Length > 20)
            {
                name = name.Substring(0, 20);
            }

            var hash = FormsAuthentication.HashPasswordForStoringInConfigFile(cacheKey, "SHA1");

            return(name + "_" + hash + ".cache");
        }
Exemplo n.º 8
0
        /// <summary>
        /// 从 WebCache 获取缓存的响应
        /// </summary>
        /// <param name="cache"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static ICachedResponse GetCachedResponse(this Cache cache, CacheToken token)
        {
            var cacheItem = cache.GetCacheItem(token);

            if (cacheItem == null)
            {
                return(null);
            }

            else
            {
                return(cacheItem.CachedResponse);
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// 创建一个标准缓存策略
        /// </summary>
        /// <param name="context">请求上下文</param>
        /// <param name="token">缓存标示</param>
        /// <param name="provider">缓存策略提供程序</param>
        /// <param name="duration">缓存持续时间</param>
        /// <param name="enableClientCache">是否启用客户端缓存</param>
        /// <param name="storageProvider">缓存储存提供程序</param>
        public StandardCachePolicy(HttpContextBase context, CacheToken token, ICachePolicyProvider provider, TimeSpan duration, bool enableClientCache, ICacheStorageProvider storageProvider)
            : base(context, token, provider)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (provider == null)
            {
                throw new ArgumentNullException("provider");
            }


            Duration          = duration;
            EnableClientCache = enableClientCache;

            CacheStorageProvider = storageProvider;
        }
Exemplo n.º 10
0
        /// <summary>
        /// 获取缓存项
        /// </summary>
        /// <param name="token">缓存标识</param>
        /// <returns></returns>
        public override CacheItem GetCacheItem(CacheToken token)
        {
            if (EnableMemoryCache)
            {
                var cacheItem = HttpRuntime.Cache.GetCacheItem(token);

                if (cacheItem != null)
                {
                    if (!cacheItem.IsValid())//缓存已过期
                    {
                        return(null);
                    }

                    return(cacheItem);
                }
            }


            return(base.GetCacheItem(token));
        }
Exemplo n.º 11
0
        /// <summary>
        /// 从持久化设备中加载缓存项
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        protected virtual CacheItem LoadCacheItem(CacheToken token)
        {
            using (var stream = CreateLoadStream(token))
            {
                if (stream == null)
                {
                    return(null);
                }

                var cacheItem = Deserialize(stream);

                if (cacheItem != null && cacheItem.IsValid(token))
                {
                    return(cacheItem);
                }
                else
                {
                    return(null);
                }
            }
        }
Exemplo n.º 12
0
        /// <summary>
        /// 按照设置的默认规则获取缓存标记
        /// </summary>
        /// <param name="context">请求上下文</param>
        /// <returns></returns>
        public static CacheToken GetCacheToken(HttpContextBase context)
        {
            if (StringComparer.OrdinalIgnoreCase.Equals("post", context.Request.HttpMethod))
            {
                return(null);
            }

            if (CacheKeyPolicy == Web.CacheKeyPolicy.NoCache)
            {
                return(null);
            }

            CacheToken token = null;

            if ((CacheKeyPolicy & Web.CacheKeyPolicy.BySession) != 0)
            {
                if (!context.Session.IsCookieless && !context.Session.IsNewSession)
                {
                    token += CacheToken.FromSessionID(context);
                }
            }

            if ((CacheKeyPolicy & Web.CacheKeyPolicy.ByIdentity) != 0)
            {
                if (context.User != null && context.User.Identity != null && context.User.Identity.Name != null)
                {
                    token += CacheToken.FromCookies(context);
                }
            }

            if ((CacheKeyPolicy & Web.CacheKeyPolicy.ByVirtualPath) != 0)
            {
                token += CacheToken.FromVirtualPath(context);
            }

            return(token);
        }
Exemplo n.º 13
0
 /// <summary>
 /// 创建 CachePolicy 实例
 /// </summary>
 /// <param name="context"></param>
 /// <param name="token"></param>
 /// <param name="provider"></param>
 public CachePolicy(HttpContextBase context, CacheToken token, ICachePolicyProvider provider)
 {
     HttpContext = context;
     CacheToken  = token;
     Provider    = provider;
 }
Exemplo n.º 14
0
 /// <summary>
 /// 获取一个缓存项
 /// </summary>
 /// <param name="token">缓存标示</param>
 /// <returns></returns>
 public CacheItem GetCacheItem(CacheToken token)
 {
     return(_cache.GetCacheItem(token));
 }
Exemplo n.º 15
0
 /// <summary>
 /// 从 WebCache 获取一个缓存项
 /// </summary>
 /// <param name="cache"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public static CacheItem GetCacheItem(this Cache cache, CacheToken token)
 {
     return(cache.Get(token.CacheKey()) as CacheItem);
 }
Exemplo n.º 16
0
 /// <summary>
 /// 创建持久化输出流
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 protected abstract Stream CreateSaveStream(CacheToken token);
Exemplo n.º 17
0
 /// <summary>
 /// 创建持久化输入流
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 protected abstract Stream CreateLoadStream(CacheToken token);
Exemplo n.º 18
0
 /// <summary>
 /// 创建一个标准缓存策略
 /// </summary>
 /// <param name="context">请求上下文</param>
 /// <param name="token">缓存标示</param>
 /// <param name="provider">缓存策略提供程序</param>
 /// <param name="duration">缓存持续时间</param>
 /// <param name="enableClientCache">是否启用客户端缓存</param>
 public StandardCachePolicy(HttpContextBase context, CacheToken token, ICachePolicyProvider provider, TimeSpan duration, bool enableClientCache)
     : this(context, token, provider, duration, enableClientCache, new WebCacheStorageProvider())
 {
 }
Exemplo n.º 19
0
 /// <summary>
 /// 创建 CacheToken
 /// </summary>
 /// <param name="typeName">类型名,一般可以取 Action 的名称</param>
 /// <param name="parameters">参数列表,一般可以使用 Action 的参数列表</param>
 /// <returns>针对指定类型和参数的 CacheToken</returns>
 public static CacheToken CreateToken(string typeName, IDictionary <string, object> parameters)
 {
     return(CacheToken.CreateToken(typeName, parameters.Select(pair => pair.Key + ":" + pair.Value).ToArray()));
 }