zoukankan      html  css  js  c++  java
  • 缓存脚本和Css文件 岁月无情

    public class HttpCombiner : IHttpHandler
        {
            
    private const bool DO_GZIP = true;
            
    private readonly static TimeSpan CACHE_DURATION = TimeSpan.FromDays(30);

            
    public void ProcessRequest(HttpContext context)
            {

                HttpRequest request 
    = context.Request;

                
    //获取配置信息
                string setName = request["s"?? string.Empty;
                
    string contentType = request["t"?? string.Empty;
                
    string version = request["v"?? string.Empty;

                
    // 确认浏览器是否支持压缩输出
                bool isCompressed = DO_GZIP && this.CanGZip(context.Request);

                
    //以utf8向浏览器输出
                UTF8Encoding encoding = new UTF8Encoding(false);

                
    //如果缓存中存在该信息则直接从缓存中读否则下载文件并存入缓存
                if (!this.WriteFromCache(context, setName, version, isCompressed, contentType))
                {
                    
    using (MemoryStream memoryStream = new MemoryStream(5000))
                    {
                        
    using (Stream writer = isCompressed ?
                            (Stream)(
    new GZipStream(memoryStream, CompressionMode.Compress)) :
                            memoryStream)
                        {
                            
    //从配置文件中获取缓存文件列表
                            string setDefinition =
                                System.Configuration.ConfigurationManager.AppSettings[setName] 
    ?? "";
                            
    string[] fileNames = setDefinition.Split(new char[] { ',' },
                                StringSplitOptions.RemoveEmptyEntries);

                            
    foreach (string fileName in fileNames)
                            {
                                
    byte[] fileBytes = this.GetFileBytes(context, fileName.Trim(), encoding);
                                writer.Write(fileBytes, 
    0, fileBytes.Length);
                            }

                            writer.Close();
                        }


                        
    //将信息写入缓存
                        byte[] responseBytes = memoryStream.ToArray();
                        context.Cache.Insert(GetCacheKey(setName, version, isCompressed),
                            responseBytes, 
    null, System.Web.Caching.Cache.NoAbsoluteExpiration,
                            CACHE_DURATION);

                        
    //输出
                        this.WriteBytes(responseBytes, context, isCompressed, contentType);
                    }
                }
            }

            
    private byte[] GetFileBytes(HttpContext context, string virtualPath, Encoding encoding)
            {
                
    if (virtualPath.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase))
                {
                    
    using (WebClient client = new WebClient())
                    {
                        
    return client.DownloadData(virtualPath);
                    }
                }
                
    else
                {
                    
    string physicalPath = context.Server.MapPath(virtualPath);
                    
    byte[] bytes = File.ReadAllBytes(physicalPath);
                    
    return bytes;
                }
            }

            
    private bool WriteFromCache(HttpContext context, string setName, string version,
                
    bool isCompressed, string contentType)
            {
                
    byte[] responseBytes = context.Cache[GetCacheKey(setName, version, isCompressed)] as byte[];

                
    if (null == responseBytes || 0 == responseBytes.Length) return false;

                
    this.WriteBytes(responseBytes, context, isCompressed, contentType);
                
    return true;
            }

            
    private void WriteBytes(byte[] bytes, HttpContext context,
                
    bool isCompressed, string contentType)
            {
                HttpResponse response 
    = context.Response;

                response.AppendHeader(
    "Content-Length", bytes.Length.ToString());
                response.ContentType 
    = contentType;
                
    if (isCompressed)
                    response.AppendHeader(
    "Content-Encoding""gzip");

                context.Response.Cache.SetCacheability(HttpCacheability.Public);
                context.Response.Cache.SetExpires(DateTime.Now.Add(CACHE_DURATION));
                context.Response.Cache.SetMaxAge(CACHE_DURATION);
                context.Response.Cache.AppendCacheExtension(
    "must-revalidate, proxy-revalidate");

                response.OutputStream.Write(bytes, 
    0, bytes.Length);
                response.Flush();
            }

            
    private bool CanGZip(HttpRequest request)
            {
                
    string acceptEncoding = request.Headers["Accept-Encoding"];
                
    if (!string.IsNullOrEmpty(acceptEncoding) &&
                     (acceptEncoding.Contains(
    "gzip"|| acceptEncoding.Contains("deflate")))
                    
    return true;
                
    return false;
            }

            
    private string GetCacheKey(string setName, string version, bool isCompressed)
            {
                
    return "HttpCombiner." + setName + "." + version + "." + isCompressed;
            }

            
    public bool IsReusable
            {
                
    get
                {
                    
    return true;
                }
            }
        }

    配置文件


            <add key="Set_Css" value="~/App_Themes/Default/Css1.css,~/App_Themes/Default/Css2.css"/>
            
    <add key="Set_Javascript" value="~/Javascripts/Js1.js,~/Javascripts/Js2.js,http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"/>

     调用


    //指定Css文件
    //<link   type="text/css" 
    //        rel="Stylesheet" 
    //        href="HttpCombiner.ashx?s=Set_Css&t=text/css&v=1" />

    //指定脚本文件
    //<script     
    //    type="text/javascript" 
    //    src="HttpCombiner.ashx?s=Set_Javascript&t=type/javascript&v=2" >
    //</script>
  • 相关阅读:
    org.apache.catalina.LifecycleException: Protocol handler start failed
    达梦数据库修改表失败 错误号: -6407 错误消息: 锁超时
    mybatis sql语句配置大于号小于号的处理(元素内容必须由格式正确的字符数据或标记组成)
    Unity基础—Transform类
    Naocs 配置中心报错问题
    inux 设置开机自启动 文件配置开机自启动命令
    jar中配置文件读取外面的配置文件
    Unity 制作天空盒
    Maven 剔除已存在jar包
    Maven安装本地jar包到本地仓库
  • 原文地址:https://www.cnblogs.com/huyinyang/p/2524970.html
Copyright © 2011-2022 走看看