ASP.NET MVC 3 网站优化总结(六)压缩 HTML


压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽。今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完成 html 的压缩。

其实我们在 ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩这篇文章中使用的就是这种方法,主要看看实现的 FilterAttribute 类:

public class WhitespaceFilterAttribute : ActionFilterAttribute
{
   
public override void OnActionExecuting(ActionExecutingContext filterContext)
   
{
       
var request = filterContext.HttpContext.Request;
       
var response = filterContext.HttpContext.Response;
        response
.Filter = new WhiteSpaceFilter(response.Filter, s =>
       
{
            s
= Regex.Replace(s, @"\s+(?=<)|\s+$|(?<=>)\s+", "");

           
//single-line doctype must be preserved
           
var firstEndBracketPosition = s.IndexOf(">");
           
if (firstEndBracketPosition >= 0)
           
{
                s
= s.Remove(firstEndBracketPosition, 1);
                s
= s.Insert(firstEndBracketPosition, ">");
           
}
           
return s;
       
});
   
}
}
 

使用时在 Action 方法上添加 Filter 属性即可,如下:

[WhitespaceFilter]
public ActionResult Index(string id)
{
   
return View();
}

我主要修改了下作者使用的正则,因为原正则会将<pre></pre>中的空格也进行替换,并指定编码为 UTF-8。

这样就在 ASP.NET MVC 3 中实现了 html 的压缩,大家可以下载 WhiteSpaceFilter.rar 类来自己试试!




    /// <summary>
    ///  gzip
    /// [Compress]
    ///public ActionResult Index(string id)
    ///{
    ///    return View();
    ///}
    /// </summary>
    public class CompressAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
            if (!string.IsNullOrEmpty(acceptEncoding))
            {
                acceptEncoding = acceptEncoding.ToLower();
                var response = filterContext.HttpContext.Response;
                if (acceptEncoding.Contains("gzip"))
                {
                    response.AppendHeader("Content-encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                }
                else if (acceptEncoding.Contains("deflate"))
                {
                    response.AppendHeader("Content-encoding", "deflate");
                    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                }
            }
        }
    }




    /// <summary>
    /// 压缩 HTML
    /// [WhitespaceFilter]
    ///public ActionResult Index(string id)
    ///{
    ///    return View();
    ///}
    /// </summary>
    public class WhitespaceFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;
            response.Filter = new WhiteSpaceFilter(response.Filter, s =>
            {
                s = Regex.Replace(s, @"\s+(?=<)|\s+$|(?<=>)\s+", "");


                //single-line doctype must be preserved
                var firstEndBracketPosition = s.IndexOf(">");
                if (firstEndBracketPosition >= 0)
                {
                    s = s.Remove(firstEndBracketPosition, 1);
                    s = s.Insert(firstEndBracketPosition, ">");
                }
                return s;
            });
        }
    }




    public class WhiteSpaceFilter : Stream
    {
        private Stream _shrink;
        private Func<string, string> _filter;


        public WhiteSpaceFilter(Stream shrink, Func<string, string> filter)
        {
            _shrink = shrink;
            _filter = filter;
        }




        public override bool CanRead { get { return true; } }
        public override bool CanSeek { get { return true; } }
        public override bool CanWrite { get { return true; } }
        public override void Flush() { _shrink.Flush(); }
        public override long Length { get { return 0; } }
        public override long Position { get; set; }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _shrink.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _shrink.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            _shrink.SetLength(value);
        }
        public override void Close()
        {
            _shrink.Close();
        }


        public override void Write(byte[] buffer, int offset, int count)
        {
            // capture the data and convert to string
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string s = Encoding.UTF8.GetString(buffer);


            // filter the string
            s = _filter(s);


            // write the data to stream
            byte[] outdata = Encoding.UTF8.GetBytes(s);
            _shrink.Write(outdata, 0, outdata.GetLength(0));
        }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值