当前位置:编程学习 > asp >>

ASP.NET自定义输出缓存提供程序

 我们知道,自从ASP.NET 发布以来,页输出缓存使开发人员能够把由网页、控件及HTTP响应等生成的输出内容存储到内存中。这样一来,在后面的Web请求时,系统能够从内存检索这些生成的输出内容而不是从头开始重新生成输出,从而使ASP.NET可以更迅速地提供内容,在性能上得到了很大的提高。但是,这种方法确有一个限制:即生成的内容一定要存储在内存中。这样一来,服务器将承受巨大流量带来的压力,输出缓存消耗的内存与来自Web应用程序的其他部分的内存需求之间导致严重冲突。
      针对上述情况,ASP.NET 4针对输出缓存增加了一个扩展点,它能够使你可以配置一个或多个自定义输出缓存提供程序。输出缓存提供程序可以使用任何的存储机制来存储HTML内容。这使得开发者有可能针对不同的持久性机制来创建自定义的输出缓存提供程序,其中可以包括本地或远程磁盘、数据库、云存储和分布式缓存引擎(如velocity、memcached)等等。
      要实现自定义输出缓存提供程序,你可以通过从System.Web.Caching.OutputCacheProvider类中派生一个类来创建自定义输出缓存提供程序。例如,下面的MyOutputCacheProvider类就是派生自OutputCacheProvider类,并创建了一个自定义输出缓存提供程序,如代码清单19-5所示:
      代码清单19-5:MyOutputCacheProvider.cs
using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.Serialization.Formatters.Binary;

using System.Timers;

using System.Web.Caching;

using System.Collections.Concurrent;

namespace _19_1

{

    public class MyOutputCacheProvider : OutputCacheProvider

    {

        private Timer timer;

        private string cachePath = "C:\\Cache\\";

        private ConcurrentDictionary<string, DateTime>

cacheExpireList;

        private const string KEY_PREFIX = "__outputCache_";

        public MyOutputCacheProvider()

        {

            cacheExpireList =

new ConcurrentDictionary<string, DateTime>();

            timer = new Timer(3000);

            timer.Elapsed += (o, e) =>

            {

                var discardedList = from cacheItem in cacheExpireList

                             where cacheItem.Value < DateTime.Now

                             select cacheItem;

                foreach (var discarded in discardedList)

                {

                    Remove(discarded.Key);

                    DateTime discardedDate;

                    cacheExpireList.TryRemove(discarded.Key,

out discardedDate);

                }

            };

            timer.Start();

        }

        /// <summary>

        /// 添加缓存

        /// </summary>

        /// <param name="key">缓存的键</param>

        /// <param name="entry">缓存的对象</param>

        /// <param name="utcExpiry">过期时间</param>

        /// <returns>返回缓存值</returns>

        public override object Add(string key, object entry,

 DateTime utcExpiry)

        {

            FileStream fs = new FileStream(

String.Format("{0}{1}.binary", cachePath, key),

 FileMode.Create, FileAccess.Write);

            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(fs, entry);

            fs.Close();

            cacheExpireList.TryAdd(key, utcExpiry.ToLocalTime());

            return entry;

        }

        /// <summary>

        /// 获得缓存值

        /// </summary>

        /// <param name="key">缓存键</param>

        /// <returns>缓存值</returns>

        public override object Get(string key)

        {

            string path =

String.Format("{0}{1}.binary", cachePath, key);

            if (File.Exists(path))

            {

                FileStream fs = new FileStream(

path, FileMode.Open, FileAccess.Read);

                BinaryFormatter formatter = new BinaryFormatter();

                object result = formatter.Deserialize(fs);

                fs.Close();

                return result;

            }

            else

            {

                return null;

            }

        }

        /// <summary>

        /// 根据键移除缓存

   &n

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,