ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler,

使用<link type="text/css" rel="Stylesheet" href="HttpCombiner.ashx?" />,具体的参数请参考程序中的介绍。附件

using System;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Services;namespace SLTech.DST.Web.Application
{/// <summary>/// Summary description for $codebehindclassname$/// </summary>[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]public class HttpCombiner : IHttpHandler{private const bool DO_GZIP = true;private readonly static TimeSpan CACHE_DURATION = TimeSpan.FromDays(30);private const string DEFAULT_CSS = "decision-support-toolkit.css,controls/tab.css,controls/extension-button.css,";public void ProcessRequest(HttpContext context){var request = context.Request;// Read setName, contentType and version. //All are required. They are used as cache keyvar setName = request["s"] ?? string.Empty;var contentType = request["t"] ?? string.Empty;var version = request["v"] ?? string.Empty;var files = request["f"] ?? string.Empty;files = DEFAULT_CSS + files;// Decide if browser supports compressed responsevar isCompressed = DO_GZIP && this.CanGZip(context.Request);// Response is written as UTF8 encoding. var encoding = new UTF8Encoding(false);// If the set has already been cached, write the response directly from// cache. Otherwise generate the response and cache itif (!this.WriteFromCache(context, setName, version, isCompressed, contentType)){using (var memoryStream = new MemoryStream(5000)){// Decide regular stream or GZipStream based on whether the response// can be cached or notusing (var writer = isCompressed ?(Stream)(new GZipStream(memoryStream, CompressionMode.Compress)) :memoryStream){// Load the files defined and process each filevar fileNames = files.Split(new char[] { ',' },StringSplitOptions.RemoveEmptyEntries);foreach (string fileName in fileNames){var fileBytes = this.GetFileBytes(context,"css/"+fileName.Trim(), encoding);writer.Write(fileBytes, 0, fileBytes.Length);}writer.Close();}var responseBytes = memoryStream.ToArray();context.Cache.Insert(GetCacheKey(setName, version, isCompressed),responseBytes, null, System.Web.Caching.Cache.NoAbsoluteExpiration,CACHE_DURATION);// Generate the responsethis.WriteBytes(responseBytes, context, isCompressed, contentType);}}}private byte[] GetFileBytes(HttpContext context, string virtualPath, Encoding encoding){if (virtualPath.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase)){using (var client = new WebClient()){return client.DownloadData(virtualPath);}}else{var physicalPath = context.Server.MapPath(virtualPath);var bytes = File.ReadAllBytes(physicalPath);return bytes;}}private bool WriteFromCache(HttpContext context, string setName, string version,bool isCompressed, string contentType){var 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){var 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){var acceptEncoding = request.Headers["Accept-Encoding"];return (!string.IsNullOrEmpty(acceptEncoding) &&(acceptEncoding.Contains("gzip") || acceptEncoding.Contains("deflate")));}private string GetCacheKey(string setName, string version, bool isCompressed){return "HttpCombiner." + setName + "." + version + "." + isCompressed;}public bool IsReusable{get{return false;}}}
}

转载于:https://www.cnblogs.com/sntetwt/p/3375586.html

ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler相关推荐

  1. asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度

    介绍 使用许多小得JS.CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维护性,这是一个很好的实践.但这样做反过来却损失了网站的性能.虽然你应该将你的Javascript代码写在小文件中并 ...

  2. 页面加载速度-合并资源文件

    前言 一直觉得自己的博客站点页面加载很慢, 就想着去优化一下. 呐, 下图是一次文章页面的加载, 需要2.5s. 其中 js 文件就有18个. 众所周知, 浏览器对资源文件的并行下载数量是有限制的(不 ...

  3. js网页顶部线性页面加载进度条,jquery头部线性进度条总结

    前言 网页顶部加载进度条,近年来很流行,很多网站都采用了这种加载方式.网上也有这样类似的插件,今天我们总结一下网页顶部线性页面加载进度条. 头部LoadingBar线性进度条总结 上面的代码只是静态效 ...

  4. instant.page —— 一个 JS 脚本实现网站预加载,提升页面加载速度

    instant.page 使用即时预加载技术,在用户点击之前预先加载页面.当用户的鼠标悬停在一个链接上超过 65 毫秒时,浏览器会对此页面进行预加载,当用户点击链接后,就从预加载的缓存中直接读取页面内 ...

  5. MaccmsV10切换JS播放器,优化加载速度

    引言:默认自带dpplayer播放器和videoJs播放器 为什么要切换自己的播放器? 1:采集的影视资源大部分是外站的,外站资源平台一般都会标配播放器,便于放自己的一些广告和菠菜,无可厚非. 2:还 ...

  6. Yii --EClientScript 扩展,css,js文件代码压缩合并加载

    扩展插件下载地址,解压后复制到/protected/vendor/ https://github.com/muayyad-alsadi/yii-EClientScript main配置文件配置插件,c ...

  7. nuxt 头部引入js文件 第一次进入页面不加载js文件的解决方法

    head () {return {title: '',meta: [{ hid: 'description', name: 'description', content: '' }],script: ...

  8. js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习

    前面我们学习了spring框架源码,做了一些自己手写的学习,最近,我们开始学习springMVC框架的学习 ,springMVC框架,相信大家不陌生了,所以这里不做过多的介绍了. SpringMVC以 ...

  9. 使用cdn来加速字体文件在前端的加载速度,并监听字体是否加载完成

    最近在个人网站butterpig中实现了个性印章的在线设计功能,里面目前一共实现了有八九种个性印章的样式,并且还有六七种网络开源商用的字体类型.具体效果可以访问:个性印章在线设计查看. 印章的设计,其 ...

最新文章

  1. 生物信息行业应该具备哪些基础素养?重点应该放在计算机方面还是生物方面或者说其他?
  2. docker server 容器连接sql_Docker使用指南
  3. [数字信号处理]IIR滤波器的间接设计(C代码)(转)
  4. ASP.NET MVC WebAPI 资源整理
  5. xml配置linux启动脚本,linux中利用Shell脚本实现自动安装部署weblogic服务
  6. GC-ALLOC 的另一个重要作用,查内存泄漏
  7. 2021 大前端技术回顾及未来展望
  8. WEB前端 vue学习一使用 vue-cli 搭建项目
  9. ​供应链管理-ERP的前世今生
  10. 拓端tecdat|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
  11. win10壁纸不能幻灯片放映_教你巧妙解决雨林木风Win10系统中背景桌面无法自动播放幻灯片...
  12. 计算机科学名词,计算机科学中的术语(1)
  13. 计算机5克,C盘莫名其妙少了5个多G,这是怎么回事??
  14. 用Python从大到小排序
  15. oracle安装点下一步退出,学习笔记:oracle之win10安装卸载oracle 11gR2步骤及常见问题解决...
  16. 蓝色蝴蝶(好听的毕业歌)
  17. 极简烟雨图床正式版源码V2.1.3/高速外链图床
  18. 笔记本电脑的计算机配置在哪里可以找到,如何查看笔记本电脑的配置?笔记本配置查看方法...
  19. html+ajax登陆,jQuery+Ajax模拟用户登录功能的实现代码
  20. 微信小程序页面间通信实现pub-sub

热门文章

  1. 马里奥AI实现方式探索 ——神经网络+增强学习
  2. 在UE4中创建受《羞辱》启发的环境
  3. LOL手游诺手对线技巧,上分率提高60%,战神玩家推荐玩法
  4. Mybatis常见面试题(10个必备面试题)
  5. Java扑克牌(enum)
  6. python jieba库用法
  7. oracle11g自动内存管理
  8. letecode [160] - Intersection of Two Linked Lists
  9. Python笔记——Django路由系统
  10. php多线程解决之stream_socket_client