Click here to Skip to main content
15,860,943 members
Articles / Web Development / ASP.NET

Reducing the size of ASP.NET pages

Rate me:
Please Sign up or sign in to vote.
2.95/5 (12 votes)
23 Nov 2009CPOL2 min read 58.1K   29   32
A technique to reduce the size of ASP.NET pages.

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. C#
    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. C#
    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. C#
    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)


Written By
Software Developer (Senior)
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 1 Pin
Viktor Stolbovoy1-Dec-09 5:10
Viktor Stolbovoy1-Dec-09 5:10 
GeneralRe: My vote of 1, My Vote of 1 to your Comment Pin
ahmed-itani5-Jan-10 8:15
professionalahmed-itani5-Jan-10 8:15 
What he provided is not an alternative solution to compression, it is how to reduce the size of the page what ever with compression or not, it is always better to minimize the size of the page as much as possible even if you are using the compression specially if wasted spaces like Tags spacing
GeneralDid you check the difference Pin
Anurag Gandhi30-Nov-09 22:42
professionalAnurag Gandhi30-Nov-09 22:42 
GeneralMy vote of 1 Pin
Jacobs7630-Nov-09 21:49
Jacobs7630-Nov-09 21:49 
GeneralRe: My vote of 1 Pin
Aj 201030-Nov-09 22:07
Aj 201030-Nov-09 22:07 
GeneralWill corrupt <pre> text</pre> Pin
~Anders30-Nov-09 21:15
~Anders30-Nov-09 21:15 
GeneralRe: Will corrupt text Pin
Aj 201030-Nov-09 22:02
Aj 201030-Nov-09 22:02 
GeneralBetter ways to do this... Pin
Rick Hansen30-Nov-09 10:23
Rick Hansen30-Nov-09 10:23 
GeneralRe: Better ways to do this... Pin
Aj 201030-Nov-09 22:01
Aj 201030-Nov-09 22:01 
GeneralHttpResponse Filter Pin
webgruve30-Nov-09 10:23
webgruve30-Nov-09 10:23 
GeneralRe: HttpResponse Filter Pin
Aj 201030-Nov-09 21:58
Aj 201030-Nov-09 21:58 
GeneralMy vote of 2 Pin
Rick Hansen30-Nov-09 10:05
Rick Hansen30-Nov-09 10:05 
GeneralRe: My vote of 2 Pin
Aj 201030-Nov-09 21:46
Aj 201030-Nov-09 21:46 
GeneralMy vote of 1 Pin
vissuch24-Nov-09 1:53
vissuch24-Nov-09 1:53 
QuestionAppendLine vs Append Pin
romgun23-Nov-09 21:33
romgun23-Nov-09 21:33 
AnswerRe: AppendLine vs Append Pin
Aj 201023-Nov-09 21:47
Aj 201023-Nov-09 21:47 
GeneralSuggest for modify your article Pin
nicholas_pei23-Nov-09 14:07
nicholas_pei23-Nov-09 14:07 
GeneralRe: Suggest for modify your article Pin
Aj 201023-Nov-09 16:14
Aj 201023-Nov-09 16:14 
GeneralBug fixed! Pin
Aj 201023-Nov-09 6:02
Aj 201023-Nov-09 6:02 
GeneralGZIP is the way to go . Pin
vissuch23-Nov-09 5:50
vissuch23-Nov-09 5:50 
AnswerRe: GZIP is the way to go . Pin
Andre Sanches (alvs)23-Nov-09 8:01
Andre Sanches (alvs)23-Nov-09 8:01 
GeneralRe: GZIP is the way to go . Pin
vissuch23-Nov-09 11:25
vissuch23-Nov-09 11:25 
GeneralDont work!! Pin
raphaelm2223-Nov-09 5:15
raphaelm2223-Nov-09 5:15 
GeneralRe: Dont work!! Pin
Aj 201023-Nov-09 6:03
Aj 201023-Nov-09 6:03 
GeneralRe: Dont work!! Pin
Aj 201023-Nov-09 6:07
Aj 201023-Nov-09 6:07 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.