从MVC中生成的HTML中删除额外的空格

WOP*_*OPR 30 html compression asp.net-mvc whitespace http-compression

我有一个MVC应用程序视图,生成相当大的HTML值表(> 20MB).

我正在使用压缩过滤器压缩控制器中的视图

 internal class CompressFilter : ActionFilterAttribute
 {
     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
         HttpRequestBase request = filterContext.HttpContext.Request;
         string acceptEncoding = request.Headers["Accept-Encoding"];
         if (string.IsNullOrEmpty(acceptEncoding))
             return;
         acceptEncoding = acceptEncoding.ToUpperInvariant();
         HttpResponseBase 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);
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

有没有办法在运行压缩过滤器之前消除视图中生成的(非常大)冗余空白量(以减少压缩工作量和大小)?

编辑: 我使用下面的Womp建议的WhiteSpaceFilter技术.

感兴趣的是Firebug分析的结果:

1)没有压缩,没有空白条 - 21MB,2.59分钟
2)使用GZIP压缩,没有空白条 - 2MB,17.59s
3)使用GZIP压缩,空白条--558kB,12.77s

所以当然值得.

wom*_*omp 20

这个人编写了一个简洁的小空白压缩器,只需通过正则表达式运行字节的快速块副本,即可去掉空间的blob.他把它写成了一个http模块,但是你可以从中获取7行的主力代码并将其放入你的函数中.

  • 只是向人们发出警告,如果您阅读该链接上的评论,则解决方案存在一些缺陷. (7认同)

tug*_*erk 6

@womp已经提出了一个很好的方法,但该模块已经过时了.我一直在使用它,但事实证明它不是一种最佳方式.这是我问过的问题:

从整个Html中移除空格,但在pre中使用正则表达式

我是这样做的:

public class RemoveWhitespacesAttribute : ActionFilterAttribute {

    public override void OnActionExecuted(ActionExecutedContext filterContext) {

        var response = filterContext.HttpContext.Response;

        //Temp fix. I am not sure what causes this but ContentType is coming as text/html
        if (filterContext.HttpContext.Request.RawUrl != "/sitemap.xml") {

            if (response.ContentType == "text/html" && response.Filter != null) {
                response.Filter = new HelperClass(response.Filter);
            }
        }
    }

    private class HelperClass : Stream {

        private System.IO.Stream Base;

        public HelperClass(System.IO.Stream ResponseStream) {

            if (ResponseStream == null)
                throw new ArgumentNullException("ResponseStream");
            this.Base = ResponseStream;
        }

        StringBuilder s = new StringBuilder();

        public override void Write(byte[] buffer, int offset, int count) {

            string HTML = Encoding.UTF8.GetString(buffer, offset, count);

            //Thanks to Qtax
            //https://stackoverflow.com/questions/8762993/remove-white-space-from-entire-html-but-inside-pre-with-regular-expressions
            Regex reg = new Regex(@"(?<=\s)\s+(?![^<>]*</pre>)");
            HTML = reg.Replace(HTML, string.Empty);

            buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
            this.Base.Write(buffer, 0, buffer.Length);
        }

        #region Other Members

        public override int Read(byte[] buffer, int offset, int count) {

            throw new NotSupportedException();
        }

        public override bool CanRead{ get { return false; } }

        public override bool CanSeek{ get { return false; } }

        public override bool CanWrite{ get { return true; } }

        public override long Length{ get { throw new NotSupportedException(); } }

        public override long Position {

            get { throw new NotSupportedException(); }
            set { throw new NotSupportedException(); }
        }

        public override void Flush() {

            Base.Flush();
        }

        public override long Seek(long offset, SeekOrigin origin) {

            throw new NotSupportedException();
        }

        public override void SetLength(long value) {

            throw new NotSupportedException();
        }

        #endregion
    }

}
Run Code Online (Sandbox Code Playgroud)