30 votes

Supprimer des espaces supplémentaires du HTML généré dans MVC

J'ai une application MVC en vue de la production d'une grande table HTML de valeurs (>20 MO).

Je suis de la compression de la vue dans le contrôleur à l'aide d'un filtre de compression

 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);
         }
     }
 }

Est-il un moyen de supprimer également la (très grande) montant de la redondance des espaces générés dans la vue avant que je ne le compresser le filtre (pour réduire la compression de la charge de travail et la taille)?

EDIT: J'ai eu de travail à l'aide de la WhiteSpaceFilter technique proposée par Womp ci-dessous.

Pour l'intérêt ici est les résultats, comme l'a analysé Firebug:

1) Pas de Compression, pas d'espace bande - 21MB, 2.59 minutes
2) Avec la compression GZIP, pas d'espace bande - 2MO, 17.59 s
3) Avec la compression GZIP, les espaces bande - 558kB, 12.77 s

Donc certainement la peine.

20voto

womp Points 71924

Ce gars a écrit un petit compacteur d'espace blanc qui exécute simplement une copie de bloc rapide de vos octets via une expression régulière pour éliminer les taches d'espace. Il l'a écrit en tant que module http, mais vous pouvez en retirer les 7 lignes de code et le replacer dans votre fonction.

6voto

tugberk Points 16203

@womp a déjà suggéré une bonne façon de le faire, mais ce module est assez obsolète. J'utilise cela, mais il s'avère que ce n'est pas un moyen optimal. Voici la question que j'ai posée:

Supprimez les espaces blancs de l'ensemble du code HTML mais à l'intérieur du pré avec des expressions régulières

Voici comment je le fais:

 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
            //http://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
    }

}
 

4voto

Eric J. Points 73338

On peut supprimer l'espace au moment de la compilation , par l'extension de Rasoir. Qui élimine les (très significative par mes mesures) d'exécution frappé de supprimer l'espace blanc du code HTML généré. Le hit est aussi grand que 88ms sur un haut de gamme i7 coupe d'un 100KB document à l'aide de RegEx base de code trouvé sur un Débordement de Pile.

Le texte qui suit fournit une mise en œuvre d'une compilation solution pour MVC MVC 3 et 4:

Meleze.Web

La solution est décrite à

http://cestdumeleze.net/blog/2011/minifying-the-html-with-asp-net-mvc-and-razor/

(mais l'utilisation de la GitHub le code ou NuGet DLL, comme le code dans le billet de blog couvre seulement MVC 3).

2voto

Tom Anderson Points 7228

Je dirais que si votre vue génère plus de 20 Mo de données, vous voudrez peut-être étudier différentes façons d'afficher les données, peut-être la pagination?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X