Click here to Skip to main content
Click here to Skip to main content

Reducing the size of ASP.NET pages

By , 23 Nov 2009
 

Introduction

We all know when a page is requested, ASP.NET processes the page, its server controls, and finally sends the HTML to the client-side for the browser to render it. The time taken to download the HTML at the client side depends mainly on the final size of the page. If your page is data rich, it would take a lot of time to fetch it. So here I am presenting a technique to reduce the size of ASP.NET web pages.

Background

When you see a page's HTML source by clicking “View Source” in the browser, you could see that there are a lot of white space on the left side of each line on the HTML. This is actually a waste. Try saving the HTML page to your desktop and notice its size. Then delete all the spaces on the left side and then check its size. You could see that the size of the page reduces considerably, sometimes more than 50%!! (watch the View Source of Orkut in a browser).

Using the code

Here is a technique to achieve the same.

  1. Create a class in App_Code that derives from the System.Web.UI.Page class.
  2. public class MyPageBase : System.Web.UI.Page
    {
    }
  3. Replace System.Web.UI.Page in all your web pages (.aspx.cs) with MyPageBase. This means that now all your web pages are deriving from MyPageBase.
  4. Override the Render function in this class:
  5. public class MyPageBase : System.Web.UI.Page
    {
        protected override void Render(HtmlTextWriter writer)
        {
        }
    }
  6. Place the code below inside the function, and also write a support function as shown below:
  7. public class MyPageBase : System.Web.UI.Page
    {
        protected override void Render(HtmlTextWriter writer)
        {
                base.Render(htmlwriter);
                string html = htmlwriter.InnerWriter.ToString().Trim();
    
                if (ConfigurationManager.AppSettings["OptimizeHtmlOutput"] != "0")
                {
                    bool isAsync = !html.StartsWith("<");
    
                    if (!isAsync)
                    {
                        StringBuilder sb = MyPageBase._TrimHtml(html);
                        writer.Write(sb.ToString());
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
    
                        int startIx = 0;
                        while (true)
                        {
                            int x = html.IndexOf("|updatePanel|", startIx);
    
                            if (x > -1)
                            {
                                int xS = html.LastIndexOf("\r\n", x);
                                xS = (xS < 0 ? 0 : xS);
                                int xE = html.IndexOf("\r\n", x) + 2;
    
                                string header = html.Substring(xS, xE - xS);
                                header = header.Trim().TrimStart('|', ' ');
    
                                string sLen = header.Substring(0, header.IndexOf('|'));
                                int cLen = int.Parse(sLen);
    
                                string content = html.Substring(xE - 2, cLen);
                                content = MyPageBase._TrimHtml(content).ToString().Trim();
    
                                startIx = xE - 2 + cLen;
    
                                cLen = content.Length + 4;
                                header = (xS > 0 ? "|" : string.Empty) + 
                                          cLen.ToString() + 
                                          header.Substring(header.IndexOf('|'));
    
                                sb.AppendLine(header);
                                sb.AppendLine(content);
                            }
                            else
                            {
                                string stateData = html.Substring(startIx);
                                sb.Append(stateData.Trim());
    
                                writer.Write(sb.ToString());
                                break;
                            }
                        }
                    }
                }
                else
                {
                    writer.Write(html);
                }
            }
        }
    
        private static StringBuilder _TrimHtml(string source)
        {
            StringBuilder sb = new StringBuilder();
    
            source = source.Trim();
            using (StringReader sr = new StringReader(source))
            {
                string data = string.Empty;
                while (data != null)
                {
                    data = sr.ReadLine();
                    if (data != null)
                    {
                        data = data.TrimStart(' ', '\t');
                        if (data != string.Empty) sb.AppendLine(data);
                    }
                }
            }
    
            return sb;
        }
    } 

Notes

  1. Notice the usage of ConfigurationManager.AppSettings["OptimizeHtmlOutput"] != "0". You can define a key in the appsettings section of the web.config file to enable or disable this feature. Any value other than “0” will enable optimization.
  2. This code works well in AJAX based applications as well. Compare the size difference and performance by changing the flag. This is very beneficial especially in pages which contain a huge amount of data.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Aj 2010
Software Developer (Senior)
India India
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 1memberstolbovoy1 Dec '09 - 5:10 
GeneralRe: My vote of 1, My Vote of 1 to your CommentmemberKronass5 Jan '10 - 8:15 
GeneralDid you check the differencememberAnurag Gandhi30 Nov '09 - 22:42 
GeneralMy vote of 1memberJacobs7630 Nov '09 - 21:49 
GeneralRe: My vote of 1memberAj Ind30 Nov '09 - 22:07 
GeneralWill corrupt <pre> text</pre>member~Anders30 Nov '09 - 21:15 
GeneralRe: Will corrupt textmemberAj Ind30 Nov '09 - 22:02 
GeneralBetter ways to do this...memberRick Hansen30 Nov '09 - 10:23 
GeneralRe: Better ways to do this...memberAj Ind30 Nov '09 - 22:01 
GeneralHttpResponse Filtermemberwebgruve30 Nov '09 - 10:23 
GeneralRe: HttpResponse FiltermemberAj Ind30 Nov '09 - 21:58 
GeneralMy vote of 2memberRick Hansen30 Nov '09 - 10:05 
GeneralRe: My vote of 2memberAj Ind30 Nov '09 - 21:46 
GeneralMy vote of 1membervissuch24 Nov '09 - 1:53 
QuestionAppendLine vs Appendmemberromgun23 Nov '09 - 21:33 
AnswerRe: AppendLine vs AppendmemberAj Ind23 Nov '09 - 21:47 
GeneralSuggest for modify your articlemembernicholas_pei23 Nov '09 - 14:07 
GeneralRe: Suggest for modify your articlememberAj Ind23 Nov '09 - 16:14 
GeneralBug fixed!memberAj Ind23 Nov '09 - 6:02 
GeneralGZIP is the way to go .membervissuch23 Nov '09 - 5:50 
AnswerRe: GZIP is the way to go .memberAndre Luiz V Sanches23 Nov '09 - 8:01 
GeneralRe: GZIP is the way to go .membervissuch23 Nov '09 - 11:25 
Agreed. Smile | :)
 
Just to make this discussion more complete, in the IIS there are levels for gzip from 1-10. I think if you really do not want batter your cpu you can set it to low. For most people 8-9 kind of works optimally, but may be 2 or 3 will be good for the CPU's your are using.
 
There is another idea where like in this article your are sending the stripped version of your HTML page you can send the gzipped version, but the page it self gzipping. I think this can take care of the page output caching.
 
Anyway this are some of the options I am providing over here.
 
As with everything else, this might not be the solution for everyone.
GeneralDont work!!memberraphaelm2223 Nov '09 - 5:15 
GeneralRe: Dont work!!memberAj Ind23 Nov '09 - 6:03 
GeneralRe: Dont work!!memberAj Ind23 Nov '09 - 6:07 
GeneralRe: Dont work!!memberraphaelm2223 Nov '09 - 6:09 
GeneralRe: Dont work!!memberAj Ind23 Nov '09 - 16:15 
GeneralRe: Dont work!!memberArvind Rajpurohit3 Jan '11 - 20:29 
GeneralAsync checking prone to failurememberSteven Berkovitz23 Nov '09 - 5:05 
GeneralRe: Async checking prone to failurememberAj Ind23 Nov '09 - 5:50 
QuestionWhat's "Advanced" about this?mvpRajesh R Subramanian23 Nov '09 - 1:24 
AnswerRe: What's "Advanced" about this?memberXmen W.K.23 Nov '09 - 1:39 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 23 Nov 2009
Article Copyright 2009 by Aj 2010
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid