博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net 程序优化js,css合并与压缩
阅读量:6750 次
发布时间:2019-06-25

本文共 3203 字,大约阅读时间需要 10 分钟。

访问时将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(
30) };
 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 < 
0)
 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 
100             
//
是允许文档在被视为陈旧之前存在的最长绝对时间。 
101             response.Cache.SetMaxAge(TimeSpan.FromTicks(expires.Ticks));
102 
103             response.Cache.SetSlidingExpiration(
true);
104         }
105         
private 
class CompressCacheItem
106         {
107             
///
 
<summary>
108 
            
///
 类型 js 或 css 
109 
            
///
 
</summary>
110             
public 
string Type { 
get
set; } 
//
 js css  
111             
///
 
<summary>
112 
            
///
 内容
113 
            
///
 
</summary>
114             
public 
string Content { 
set
get; }
115             
///
 
<summary>
116 
            
///
 过期时间
117 
            
///
 
</summary>
118             
public DateTime Expires { 
set
get; }
119         }
120     }
 http://www.cnblogs.com/benwu/archive/2012/11/09/2762857.html
你可能感兴趣的文章
碟片数量再攀新高峰:磁盘驱动器制造商大胆加码
查看>>
2017年SSD将超存储市场33%份额
查看>>
再说智能手环:我为何会坚持佩戴半年?
查看>>
关于ASP.NET内存缓存你需要知道的10点
查看>>
为IoT和大数据项目分配IT资源
查看>>
GNU KHATA:开源的会计管理软件
查看>>
MIT做了一个全自动的大数据分析系统
查看>>
软件定义架构能为我做什么?
查看>>
未来的物联网 必须具备的三样东西是什么?
查看>>
想在网络安全领域深耕发展 需要具备这几种学位
查看>>
雅虎“卖身”之后:梅耶尔的角色会如何转换?
查看>>
在Vista安装SQL 2008 Express遭遇属性不匹配错误解决办法
查看>>
Human-like learning在对话机器人中的魔性运用
查看>>
cacti 服务器的搭建
查看>>
技术面试官之路
查看>>
详解iBaits中SqlMapClientTemplate的使用
查看>>
Laravel 安装
查看>>
Qt based Application Extension
查看>>
Spring Boot专题背景简介
查看>>
setTimeout使用闭包功能,实现定时打印数值
查看>>