v7.3.2018.0614   重构高性能资源池,减少GC压力,增加线程池,让异步任务得到平等竞争CPU的机会
大石头 编写于 2018-06-14 17:56:44
X
using System;
using System.IO;
using NewLife.Collections;

namespace NewLife.Net.Http
{
    /// <summary>Http缓存。以Url作为缓存键</summary>
    class HttpCache
    {
        #region 属性
        private Int32 _Expriod = 600;
        /// <summary>过期时间。单位是秒,默认0秒,表示永不过期</summary>
        public Int32 Expriod { get { return _Expriod; } set { _Expriod = value; } }

        private DictionaryCache<String, HttpCacheItem> _Items;
        /// <summary>缓存项</summary>
        private DictionaryCache<String, HttpCacheItem> Items
        {
            get
            {
                if (_Items == null) _Items = new DictionaryCache<String, HttpCacheItem>(StringComparer.OrdinalIgnoreCase) { Expire = Expriod };
                return _Items;
            }
            set { _Items = value; }
        }
        #endregion

        #region 方法
        public HttpCacheItem GetItem(String url)
        {
            return Items[url];
            //HttpCacheItem item = null;
            //if (!Items.TryGetValue(url, out item)) return null;
            //lock (Items)
            //{
            //    if (!Items.TryGetValue(url, out item)) return null;

            //    // 移除过期
            //    if (item.ExpiredTime < DateTime.Now)
            //    {
            //        Items.Remove(url);
            //        item = null;
            //    }

            //    return item;
            //}
        }

        public HttpCacheItem Add(HttpHeader request, HttpHeader response)
        {
            var url = request.RawUrl;
            var item = new HttpCacheItem() { Url = url, Request = request, Response = response };
            item.Stream = response.GetStream();
            //lock (Items)
            //{
            //    Items[url] = item;
            //}
            Items[url] = item;

            return item;
        }
        #endregion
    }

    /// <summary>Http缓存项。</summary>
    class HttpCacheItem
    {
        #region 属性
        private String _Url;
        /// <summary>网址</summary>
        public String Url { get { return _Url; } set { _Url = value; } }

        private HttpHeader _Request;
        /// <summary>请求</summary>
        public HttpHeader Request { get { return _Request; } set { _Request = value; } }

        private HttpHeader _Response;
        /// <summary>响应</summary>
        public HttpHeader Response { get { return _Response; } set { _Response = value; } }

        private Stream _Stream;
        /// <summary>数据流</summary>
        public Stream Stream { get { return _Stream ?? (_Stream = new MemoryStream()); } set { _Stream = value; } }

        //private DateTime _StartTime = DateTime.Now;
        ///// <summary>开始时间</summary>
        //public DateTime StartTime { get { return _StartTime; } set { _StartTime = value; } }

        //private DateTime _ExpiredTime = DateTime.Now.AddMinutes(10);
        ///// <summary>到期时间</summary>
        //public DateTime ExpiredTime { get { return _ExpiredTime; } set { _ExpiredTime = value; } }
        #endregion
    }
}