访问时将js和css压缩并且缓存在客户端,
采用的是Yahoo.Yui.Compressor组件还完成的,从这里可下载

创建一个IHttpHandler来处理文件


  1 public class CombineFiles : IHttpHandler
  2     {
  3         private const string CacheKeyFormat = "_CacheKey_{0}_";
  4 
  5         private const bool IsCompress = true; //需要压缩
  6 
  7         public bool IsReusable
  8         {
  9             get
 10             {
 11                 return false;
 12             }
 13         }
 14 
 15         public void ProcessRequest(HttpContext context)
 16         {
 17             HttpRequest request = context.Request;
 18             HttpResponse response = context.Response;
 19 
 20             string cachekey = string.Empty;
 21 
 22             string type = request.QueryString["type"];
 23             if (!string.IsNullOrEmpty(type) && (type == "css" || type == "js"))
 24             {
 25                 if (type == "js")
 26                 {
 27                     response.ContentType = "text/javascript";
 28 
 29                 }
 30                 else if (type == "css")
 31                 {
 32                     response.ContentType = "text/css";
 33                 }
 34 
 35                 cachekey = string.Format(CacheKeyFormat, type);
 36 
 37                 CompressCacheItem cacheItem = HttpRuntime.Cache[cachekey] as CompressCacheItem;
 38                 if (cacheItem == null)
 39                 {
 40                     string content = string.Empty;
 41                     string path = context.Server.MapPath("");
 42                     //找到这个目录下所有的js或css文件,当然也可以进行配置,需求请求压缩哪些文件
 43                     //这里就将所的有文件都请求压缩
 44                     string[] files = Directory.GetFiles(path, "*." + type);
 45                     StringBuilder sb = new StringBuilder();
 46                     foreach (string fileName in files)
 47                     {
 48                         if (File.Exists(fileName))
 49                         {
 50                             string readstr = File.ReadAllText(fileName, Encoding.UTF8);
 51                             sb.Append(readstr);
 52                         }
 53                     }
 54 
 55                     content = sb.ToString();
 56 
 57                     // 开始压缩文件
 58                     if (IsCompress)
 59                     {
 60                         if (type.Equals("js"))
 61                         {
 62                             content = JavaScriptCompressor.Compress(content);
 63                         }
 64                         else if (type.Equals("css"))
 65                         {
 66                             content = CssCompressor.Compress(content);
 67                         }
 68                     }
 69 
 70                     //输入到客户端还可以进行Gzip压缩 ,这里就省略了
 71 
 72                     cacheItem = new CompressCacheItem() { Type = type, Content = content, Expires = DateTime.Now.AddDays() };
 73                     HttpRuntime.Cache.Insert(cachekey, cacheItem, null, cacheItem.Expires, TimeSpan.Zero);
 74                 }
 75 
 76                 string ifModifiedSince = request.Headers["If-Modified-Since"];
 77                 if (!string.IsNullOrEmpty(ifModifiedSince)
 78                     && TimeSpan.FromTicks(cacheItem.Expires.Ticks - DateTime.Parse(ifModifiedSince).Ticks).Seconds < )
 79                 {
 80                     response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
 81                     response.StatusDescription = "Not Modified";
 82                 }
 83                 else
 84                 {
 85                     response.Write(cacheItem.Content);
 86                     SetClientCaching(response, cacheItem.Expires);
 87                 }
 88             }
 89 
 90         }
 91 
 92         private void SetClientCaching(HttpResponse response, DateTime expires)
 93         {
 94             response.Cache.SetETag(DateTime.Now.Ticks.ToString());
 95             response.Cache.SetLastModified(DateTime.Now);
 96 
 97             //public 以指定响应能由客户端和共享(代理)缓存进行缓存。    
 98             response.Cache.SetCacheability(HttpCacheability.Public);
 99 
             //是允许文档在被视为陈旧之前存在的最长绝对时间。 
             response.Cache.SetMaxAge(TimeSpan.FromTicks(expires.Ticks));
 
             response.Cache.SetSlidingExpiration(true);
         }
         private class CompressCacheItem
         {
             /// <summary>
             /// 类型 js 或 css 
             /// </summary>
             public string Type { get; set; } // js css  
             /// <summary>
             /// 内容
             /// </summary>
             public string Content { set; get; }
             /// <summary>
             /// 过期时间
             /// </summary>
             public DateTime Expires { set; get; }
         }
     }  http://www.cnblogs.com/benwu/archive/2012/11/09/2762857.html

Asp.net 程序优化js,css合并与压缩的更多相关文章

  1. Google Pagespeed,自动压缩优化JS/CSS/Image

    Google Pagespeed,自动压缩优化JS/CSS/Image 浏览: 发布日期:// 分类:技术分享 关键字: Nginx Appache Pagespeed 自动压缩优化JS/CSS/Im ...

  2. js文件合并,压缩,缓存,延迟加载

    做web前段也有一段时间了,对于web中js文件的加载有些体会想跟大家一起分享一下. 1.首先说说js文件的合并和压缩吧 为了便于集中式管理js的合并和压缩我们创建一个Js.ashx文件来专门处理合并 ...

  3. Gulp学习指南之CSS合并、压缩与MD5命名及路径替换(转载)

    本文转载自: Gulp学习指南之CSS合并.压缩与MD5命名及路径替换

  4. requireJS中如何用r.js对js进行合并和压缩css文件

    我运行的环境是windows+node.js,首先是用npm安装requirejs(全局安装,即使用 'npm install requirejs -g',这样方便在各个目录调用),接着就是下载r.j ...

  5. [Asp.net Mvc]为js,css静态文件添加版本号

    方式一: 思路 string version = ViewBag.Version; @Scripts.RenderFormat("<script type=\"text/ja ...

  6. 网站优化JS css压缩

    在nginx 中开启gzip压缩后,可以大大减少资js css 体积,原来200KB,压缩后只有66KB server{ gzip on; gzip_types text/plain applicat ...

  7. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  8. gulp学习指南之CSS合并、压缩与MD5命名及路径替换

    1.引入插件 var gulp = require('gulp'), // uglify = require('gulp-uglify'), concat = require('gulp-concat ...

  9. ASP.NET下使用Combres对JS、CSS合并和压缩

    记录一下,如何简单快捷压缩js和css,通过合并来减少请求次数. 用到的网址: http://www.nuget.org/packages/combres/ https://github.com/bu ...

随机推荐

  1. Qt creator 编译错误:无法解析的外部符号(命令)

    问题来自于:仅仅是在creator 中加入了一个新的DIalog类,并在main(),中实例化并show.就出现例如以下的错误: main.obj:-1: error: LNK2019: 无法解析的外 ...

  2. sudo apt-get update 时出现的hit、ign、get的含义

    hit,命中表示链接上这个网站 get获取表示有更新并且下载, ign忽略表示无更新或者更新无关紧要或者不需要,譬如某些插件系统已经有了或者语言翻译包

  3. Oracle中文字符乱码?设置Oracle客户端字符编码与服务端一致

    经常可能出现查询Oracle数据时,中文显示乱码,这很可能是因为,Oracle服务端的字符编码与客户端不一致引起的. 这时,我们需要做的是,如何设置自己的客户端字符编码与服务端一致. 查询Oracle ...

  4. 用C++画光(一)——优化

    写在前面 在先前的画光系列中,实现实体几何.反射.折射等效果,但是最大的一个缺陷是复杂度太高.当采样是1024时,渲染时间直线上升(用4线程),以至好几个小时才能完成一副作品,实现太慢.然而,当我看到 ...

  5. 不同版本Lua介绍

    luainterface.nlua.ulua.unilua.cstolua.slua luainterface:LuaInterface是开源的C#的lua桥接库,配合开源库luanet,能轻松实现L ...

  6. UBuntu14.04下安装和卸载Qt5.3.1

    安装: 1. Qt5.3.1下载地址为:http://qt-project.org/,选择”Qt 5.3.1 for Linux 32-bit”版本,文件名是”qt-opensource-linux- ...

  7. Brocade300 commands

    aaaconfig                  Configure RADIUS for AAA servicesad                         Specifies all ...

  8. VBA学习笔记(4)--文件夹和文件遍历一层

    说明(2017.3.22): 1. '遍历指定文件夹里的文件 '遍历指定文件夹,返回第一层文件(不含文件夹) Public Sub test1() Dim k% Dim filename$ Dim p ...

  9. 【WPF】Viewbox标签——控件大小适应父容器

    需求:图片拉伸至填满Image控件. 使用标签进行嵌套. <Grid> <Viewbox> <Image Name="myImage" /> & ...

  10. 一站式学习Wireshark(一):Wireshark基本用法

    按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...