<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Omar AL Zabir blog on ASP.NET Ajax and .NET 3.5 : asp.net performance</title><link>http://msmvps.com/blogs/omar/archive/tags/asp.net+performance/default.aspx</link><description>Tags: asp.net performance</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Prevent Denial of Service (DOS) attacks in your web application</title><link>http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx</link><pubDate>Sat, 24 Mar 2007 13:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:707029</guid><dc:creator>omar</dc:creator><slash:comments>43</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=707029</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx#comments</comments><description>&lt;p&gt;Web services are the most attractive target for hackers because
even a pre-school hacker can bring down a server by repeatedly
calling a web service which does expensive work. Ajax Start Pages
like &lt;a href="http://www.pageflakes.com/"&gt;Pageflakes&lt;/a&gt; are the best
target for such DOS attack because if you just visit the homepage
repeatedly without preserving cookie, every hit is producing a
brand new user, new page setup, new widgets and what not. The first
visit experience is the most expensive one. Nonetheless, it&amp;rsquo;s
the easiest one to exploit and bring down the site. You can try
this yourself. Just write a simple code like this:&lt;/p&gt;
&lt;div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1: &lt;/span&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt;( i&lt;span class="kwrd"&gt;nt&lt;/span&gt; i = 0; i &amp;lt; 100000; i ++ )&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;    WebClient client = n&lt;span class="kwrd"&gt;ew&lt;/span&gt; WebClient();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;    client.DownloadString(&amp;quot;&lt;span class="str"&gt;http://www.pageflakes.com/default.aspx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In your great surprise, you will notice that, after a couple of
call, you don&amp;#39;t get valid response. It&amp;rsquo;s not that you have
succeeded in bringing down the server. It&amp;rsquo;s that your
requests are being rejected. You are happy that you no longer get
any service, thus you achieve Denial of Service (for yourself). I
am happy to Deny You of Service (DYOS).&lt;/p&gt;
&lt;p&gt;The trick I have in my sleeve is an inexpensive way to remember
how many requests are coming from a particular IP. When the number
of request exceeds the threshold, deny further request for some
duartion. The idea is to remember caller&amp;rsquo;s IP in Asp.net
Cache and maintain a count of request per IP. When the count
exceeds a predefined limit, reject further request for some
specific duration like 10 mins. After 10 mins, again allow requests
from that IP.&lt;/p&gt;
&lt;p&gt;I have a class named ActionValidator which maintains a count of
specific actions like First Visit, Revisit, Asynchrnous postbacks,
Add New widget, Add New Page etc. It checks whether the count for
such specific action for a specific IP exceeds the threshold value
or not.&lt;/p&gt;
&lt;div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1: p&lt;/span&gt;&lt;span class="kwrd"&gt;ublic s&lt;/span&gt;&lt;span class="kwrd"&gt;tatic&lt;/span&gt; c&lt;span class="kwrd"&gt;lass&lt;/span&gt; ActionValidator&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;br /&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;      p&lt;span class="kwrd"&gt;rivate&lt;/span&gt; c&lt;span class="kwrd"&gt;onst&lt;/span&gt; i&lt;span class="kwrd"&gt;nt&lt;/span&gt; DURATION = 10; /&lt;span class="rem"&gt;/ 10 min period&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;     p&lt;span class="kwrd"&gt;ublic&lt;/span&gt; e&lt;span class="kwrd"&gt;num&lt;/span&gt; ActionTypeEnum&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;         FirstVisit = 100, /&lt;span class="rem"&gt;/ The most expensive one, choose the valu wisely. &lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;         ReVisit = 1000, &lt;span class="rem"&gt;// Welcome to revisit as many times as use likes&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;         Postback = 5000,   &lt;span class="rem"&gt;// Not must of a problem for us&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;         AddNewWidget = 100, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;         AddNewPage = 100,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The enumeration contains the type of actions to check for and
their threshold value for a specific duration &amp;ndash; 10 mins.&lt;/p&gt;
&lt;p&gt;A static method named &lt;em&gt;IsValid&lt;/em&gt; does the check. It returns true if the request
limit is not passed, false if the request needs to be denied. Once
you get false, you can call &lt;em&gt;Request.End()&lt;/em&gt; and prevent Asp.net from proceeding further.
You can also switch to a page which shows &amp;ldquo;Congratulations!
You have succeeded in Denial of Service Attack.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; 
&lt;span class="kwrd"&gt;public &lt;/span&gt;&lt;span class="kwrd"&gt;static &lt;/span&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValid( ActionTypeEnum actionType )&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt; HttpContext context  = HttpContext.Current;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt; 
&lt;span class="kwrd"&gt;if&lt;/span&gt;( context.Request.Browser.Crawler ) &lt;span class="kwrd"&gt;return &lt;/span&gt;&lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6: &lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; key = actionType.ToString()  + context.Request.UserHostAddress;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt; HitInfo hit  = (HitInfo)(context.Cache[key] ?? &lt;span class="kwrd"&gt;new&lt;/span&gt; HitInfo());&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10: &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;( hit.Hits &amp;gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)actionType ) &lt;span class="kwrd"&gt;return &lt;/span&gt;&lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11: &lt;/span&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt; hit.Hits ++;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13: &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;( hit.Hits == 1 )&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;     context.Cache.Add(key, hit, &lt;span class="kwrd"&gt;null&lt;/span&gt;, DateTime.Now.AddMinutes(DURATION), &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;       System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17: &lt;/span&gt;&lt;span class="kwrd"&gt;return &lt;/span&gt;&lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The cache key is built with a combination of action type and
client IP address. First it checks if there&amp;rsquo;s any entry for
the action and the client IP in Cache or not. If not, start the
count and store remember the count for the IP in cache for the
specific duration. The absolute expiration on cache item ensures
after the duration, the cache item will be cleared and the count
will restart. When there&amp;rsquo;s already an entry in the cache, get
the last hit count, and check if the limit is exceeded or not. If
not exceeded, increase the counter. There is no need to store the
updated value in the cache again by doing: Cache[url]=hit; because
the hit object is by reference and changing it means it gets
changed in the cache as well. In fact, if you do put it again in
the cache, the cache expiration counter will restart and fail the
logic of restarting count after specific duration.&lt;/p&gt;
&lt;p&gt;The usage is very simple:&lt;/p&gt;
&lt;div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; 
&lt;span class="kwrd"&gt;protected &lt;/span&gt;&lt;span class="kwrd"&gt;override &lt;/span&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; OnInit(EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;   &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnInit(e);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;   &lt;span class="rem"&gt;// Check if revisit is valid or not&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;   &lt;span class="kwrd"&gt;if&lt;/span&gt;(  &lt;span class="kwrd"&gt;!base&lt;/span&gt;.IsPostBack ) &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;   {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     &lt;span class="rem"&gt;// Block cookie less visit attempts&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     &lt;span class="kwrd"&gt;if&lt;/span&gt;( Profile.IsFirstVisit )&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.FirstVisit) Response.End();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt;( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.ReVisit) ) Response.End();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt;   }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt;  &lt;span class="kwrd"&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:&lt;/span&gt;   {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:&lt;/span&gt;    &lt;span class="rem"&gt;// Limit number of postbacks&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:&lt;/span&gt;     &lt;span class="kwrd"&gt;if&lt;/span&gt;( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback)  Response.End();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:&lt;/span&gt;   }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  23:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here I am checking specific scenario like First Visit, re-visit,
postbacks etc.&lt;/p&gt;
&lt;p&gt;Of course you can put in some Cisco firewall and prevent DOS
attack. You will get guaranty from your hosting provider that their
entire network is immune to DOS and DDOS (Distributed DOS) attacks.
What they guaranty is network level attack like TCP SYN attacks or
malformed packet floods etc. There is no way they can analyze the
packet and find out a particular IP is trying to load the site too
many times without supporting cookie or trying to add too many
widgets. These are called application level DOS attack which
hardware cannot prevent. It must be implemented in your own
code.&lt;/p&gt;
&lt;p&gt;There are very few websites out their which take such precaution
for application level DOS attacks. Thus it&amp;rsquo;s quite easy to
make servers go mad by writing a simple loop and hitting expensive
pages or web services continuously from your home broadband
connection. I hope this small but effective&amp;nbsp;class will help
you implement DOS attack in your own web applications.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the code of the full ActionValidator class:&lt;/p&gt;
&lt;p&gt;// Copyright (c) Omar AL Zabir. All rights reserved.&lt;br /&gt;// For continued development and updates, visit http://msmvps.com/omar&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Summary description for ActionValidator&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;namespace Dropthings.Web.Util&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;   public static class ActionValidator&lt;br /&gt;&amp;nbsp;   {&lt;br /&gt;&amp;nbsp;       private const int DURATION = 10; // 10 min period&lt;br /&gt;&amp;nbsp;   &amp;nbsp;&lt;br /&gt;&amp;nbsp;       /*&lt;br /&gt;&amp;nbsp;        * Type of actions and their maximum value per period&lt;br /&gt;&amp;nbsp;        * &lt;br /&gt;&amp;nbsp;        */&lt;br /&gt;&amp;nbsp;       public enum ActionTypeEnum&lt;br /&gt;&amp;nbsp;       {&lt;br /&gt;&amp;nbsp;           None = 0,&lt;br /&gt;&amp;nbsp;           FirstVisit = 100, // The most expensive one, choose the value wisely. &lt;br /&gt;&amp;nbsp;           Revisit = 1000,  // Welcome to revisit as many times as user likes&lt;br /&gt;&amp;nbsp;           Postback = 5000,    // Not must of a problem for us&lt;br /&gt;&amp;nbsp;           AddNewWidget = 100, &lt;br /&gt;&amp;nbsp;           AddNewPage = 100,&lt;br /&gt;&amp;nbsp;       }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;       private class HitInfo&lt;br /&gt;&amp;nbsp;       {&lt;br /&gt;&amp;nbsp;           public int Hits;&lt;br /&gt;&amp;nbsp;           private DateTime _ExpiresAt = DateTime.Now.AddMinutes(DURATION);&lt;br /&gt;&amp;nbsp;           public DateTime ExpiresAt { get { return _ExpiresAt; } set { _ExpiresAt = value; } }&lt;br /&gt;&amp;nbsp;       }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;       public static bool IsValid( ActionTypeEnum actionType )&lt;br /&gt;&amp;nbsp;       {&lt;br /&gt;&amp;nbsp;           HttpContext context = HttpContext.Current;&lt;br /&gt;&amp;nbsp;           if( context.Request.Browser.Crawler ) return false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;           string key = actionType.ToString() + context.Request.UserHostAddress;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;           HitInfo hit = (HitInfo)(context.Cache[key] ?? new HitInfo());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;           if( hit.Hits &amp;gt; (int)actionType ) return false;&lt;br /&gt;&amp;nbsp;           else hit.Hits ++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;           if( hit.Hits == 1 )&lt;br /&gt;&amp;nbsp;               context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), &lt;br /&gt;&amp;nbsp;                   System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);&lt;br /&gt;&amp;nbsp;          &amp;nbsp;&lt;br /&gt;&amp;nbsp;           return true;&lt;br /&gt;&amp;nbsp;       }&lt;br /&gt;&amp;nbsp;   }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=707029" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+performance/default.aspx">asp.net performance</category></item><item><title>Things you must do for ASP.NET 2.0 Membership Provider before going live</title><link>http://msmvps.com/blogs/omar/archive/2006/08/27/things-you-must-do-for-asp-net-2-0-membership-provider-before-going-live.aspx</link><pubDate>Sun, 27 Aug 2006 09:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:110064</guid><dc:creator>omar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=110064</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/27/things-you-must-do-for-asp-net-2-0-membership-provider-before-going-live.aspx#comments</comments><description>&lt;p&gt;Some tweakings you should do on your web.config if you are using
ASP.NET 2.0 Membership Provider before you go live on your
production server:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add &amp;quot;applicationname&amp;quot; attribute in Profile Provider. IF you do
not add a specific name here, Profile provider will use a GUID. So,
on your local machine you will have one GUID and on production
server you will have another GUID. If you copy your local DB to
production server, you won&amp;#39;t be able to reuse the records available
in your local DB and ASP.NET will create a new application on
production. Here&amp;#39;s where you need to add it:&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;li style="list-style:none;display:inline;"&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:1b353320-cc1f-4d2a-895c-101987790106" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;

&lt;div&gt;

&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;profile&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;enabled&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;clear&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;add&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;...&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;System.Web.Profile.SqlProfileProvider&amp;quot;&lt;/span&gt;

&lt;span style="color:#FF0000;"&gt;connectionStringName&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;...&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;applicationName&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;YourApplicationName&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;description&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;...&amp;quot;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;
&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Profile provider will automatically save the profile whenever a
page request completes. So, this might result in unnecessary UPDATE
on your DB which has significant performance penalty. So, turn off
automatic save and do it explicitly from your code using
Profile.Save();
&lt;br /&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:35cb99dd-a0db-4d3e-880b-d20350da99c7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;

&lt;div&gt;

&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;profile&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;enabled&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;automaticSaveEnabled&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Role Manager always queries database in order to get the user
roles. This has significant performance penalty. You can avoid this
by letting Role Manager cache role information on cookie. But this
will work for users who do not have a lot of roles assigned to them
which exceeds the 2 KB limit of Cookie. But it&amp;#39;s not a common
scenario. So, you can safely store role info on cookie and save one
DB rountrip on every request to .aspx and .asmx.
&lt;br /&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:ca24a16d-e4a0-4a54-a327-90b30b0d7737" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;

&lt;div&gt;

&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;roleManager&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;enabled&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;cacheRolesInCookie&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; 
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;See my 
&lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/17/107967.aspx"&gt;
previous post&lt;/a&gt; on optimizing two important SPs used by Profile
Provider.&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="http://msmvps.com/aggbug.aspx?PostID=110064" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+performance/default.aspx">asp.net performance</category></item><item><title>Optimize ASP.NET 2.0 Profile Provider before you go live</title><link>http://msmvps.com/blogs/omar/archive/2006/08/17/optimize-asp-net-2-0-profile-provider-before-you-go-live.aspx</link><pubDate>Thu, 17 Aug 2006 17:41:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:107967</guid><dc:creator>omar</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=107967</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/17/optimize-asp-net-2-0-profile-provider-before-you-go-live.aspx#comments</comments><description>&lt;p&gt;Do you know there are two important stored procedures in ASP.NET
2.0 Profile Provider that you can optimize significantly? If you
use them without doing the necessary optimization, your servers
will sink taking your business down with you during heavy load.
Here&amp;#39;re a story:&lt;/p&gt;
&lt;p&gt;During March, 
&lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt; was shown on MIX
2006. We were having a glamorous time back then. We were right on 
&lt;a href="http://atlas.asp.net/default.aspx?tabid=47&amp;amp;subtabid=472"&gt;
Showcase of Atlas web site&lt;/a&gt;. The first company, not the second
or third. Number of visits per day were rising sky high. One day we
noticed, the server was no more. We restarted the server, brought
it back, again it died within an hour. After doing a lot of
postmortem analysis on the remaining of server&amp;#39;s body parts, we
found that it was having 100% CPU and super high IO usage. The hard
drives were over heated and turned themselves off in order to save
themselves. This was quite surprising to us because we were very
intelligent back then and we profiled every single web service
function. So, we went through hundreds of megabytes of logs hoping
to find which webservice function was taking the time. We suspected
one. It was the first function that loads a user&amp;#39;s page setup. We
broke it up into smaller parts in order to see which part is taking
most of the time.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:lightgrey 1px solid;PADDING-RIGHT:10px;BORDER-TOP:lightgrey 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:lightgrey 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:lightgrey 1px solid;FONT-FAMILY:courier new;"&gt;

&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;private&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;GetPageflake(&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;string&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
source, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;string&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
pageID, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;string&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
userUniqueName&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    {
&lt;br /&gt;      if( Profile.IsAnonymous ) {
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
     &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;using&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;new&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:teal;PADDING-TOP:0px;"&gt;TimedLog&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(Profile.UserName,&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:maroon;PADDING-TOP:0px;"&gt;&amp;quot;GetPageflake&amp;quot;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;))&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
      {
&lt;br /&gt;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You see, the entire function body is timed. If you want to learn
how this timing works, wait until I make a post on it. We also
timed smaller parts which we suspected were taking the most
resource. But we could find not a single place in our code which
was taking any significant time. Our codebase is always super
optimized (after all, you know who is reviewing it, me).&lt;/p&gt;
&lt;p&gt;Meanwhile, users were shouting, management was screaming,
support staff was complaining on the phone. Developers were
fainting one by one. Remaining ones were furiously sweating and
blood vessels on their forehead were coming out etc. Nothing
special, just a typical situation we have couple of times every
month.&lt;/p&gt;
&lt;p&gt;Now you must be shouting, &amp;quot;You could have used SQL Profiler, you
idiot!&amp;quot; We were using SQL Server workgroup edition.&amp;nbsp;It does
not have SQL Profiler. So, we had to hack our way through to get it
running on a server somehow. Don&amp;#39;t ask how. After running
the&amp;nbsp;SQL Profiler, boy, were we surprised! The name of the
honorable SP which were giving us so much pleasure was&amp;nbsp;none
but the famous and the most pretigious one, which we all know by
name due to its incredible contribution to the development
of&amp;nbsp;human&amp;nbsp;civilization. Please&amp;nbsp;welcome, the
great&amp;nbsp;stored procedure &amp;quot;dbo.aspnet_Profile_GetProfiles&amp;quot;!&lt;/p&gt;
&lt;p&gt;We used (and still use)&amp;nbsp;Profile provider extensively.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the SP:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:lightgrey 1px solid;PADDING-RIGHT:10px;BORDER-TOP:lightgrey 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:lightgrey 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:lightgrey 1px solid;FONT-FAMILY:courier new;"&gt;

&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
CREATE PROCEDURE
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;[dbo].[aspnet_Profile_GetProfiles]&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @ApplicationName   
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;nvarchar&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(256),&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @ProfileAuthOptions   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;int&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @PageIndex   
                      &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                int&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @PageSize   
                       &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                int&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @UserNameToMatch   
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;nvarchar&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(256)
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @InactiveSinceDate   
              &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;datetime
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
  
                    = &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
AS&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
BEGIN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= ApplicationId
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;aspnet_Applications
                        
&lt;br /&gt;                    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationName)
                            = LoweredApplicationName&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IF
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;RETURN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:green;PADDING-TOP:0px;"&gt;--
Set the page bounds&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@PageLowerBound
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;int&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@PageUpperBound
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;int&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@TotalRecords
  &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;int&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SET
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@PageLowerBound
= @PageSize
                    * @PageIndex&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SET
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@PageUpperBound
= @PageSize
                    - 1 + @PageLowerBound&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:green;PADDING-TOP:0px;"&gt;--
Create a temp table TO store the select results&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;CREATE
TABLE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;#PageIndexForUsers&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    (&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
            IndexId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;int
IDENTITY &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(0,
1) &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NOT
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
            UserId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    )&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:green;PADDING-TOP:0px;"&gt;--
Insert into our temp table&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;INSERT
INTO &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;#PageIndexForUsers
                    (UserId)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;u.UserId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
  dbo.aspnet_Users
                u, dbo.aspnet_Profile p&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
 ApplicationId = @ApplicationId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;u.UserId
                    = p.UserId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@InactiveSinceDate
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL OR &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;LastActivityDate
                        &amp;lt;= @InactiveSinceDate)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(
  
                    (@ProfileAuthOptions = 2)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                       &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                OR &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ProfileAuthOptions
= 0 &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        AND &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;IsAnonymous
= 1)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                       &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                OR &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ProfileAuthOptions
= 1 &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        AND &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;IsAnonymous
= 0)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                    )&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserNameToMatch
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL OR &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;LoweredUserName
                    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;LIKE
LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserNameToMatch))&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;ORDER
BY &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;UserName&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;u.UserName,
u.IsAnonymous, u.LastActivityDate,
                    p.LastUpdatedDate,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyNames)
                    + &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyValuesString)
&lt;br /&gt;                            + &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyValuesBinary)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
  dbo.aspnet_Users
                    u, dbo.aspnet_Profile p, #PageIndexForUsers
i&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
 u.UserId = p.UserId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;p.UserId
= i.UserId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;AND
                                
&lt;br /&gt;                            &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;i.IndexId
&amp;gt;= @PageLowerBound &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                                    AND &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;i.IndexId
&amp;lt;= @PageUpperBound&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DROP
TABLE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;#PageIndexForUsers&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
END &lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;First it&amp;nbsp;looks up for ApplicationID.&lt;/p&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                    uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= ApplicationId
            &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;aspnet_Applications
                    
&lt;br /&gt;                &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationName)
                        = LoweredApplicationName&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IF
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;RETURN&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Then it creates a temporary table (why not table data type?) in
order to store profiles of users.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; 
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:green;PADDING-TOP:0px;"&gt;
-- Create a temp table TO store the select results&lt;/span&gt;&lt;/p&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;CREATE
TABLE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;#PageIndexForUsers&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    (&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        IndexId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        int IDENTITY &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(0,
1) &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NOT
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        UserId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    )&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:green;PADDING-TOP:0px;"&gt;--
Insert into
        our temp table&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;INSERT
INTO &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;#PageIndexForUsers
(UserId)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;If it gets called very frequently, there will be too high IO due
to the temporary table creation. It also runs through 2 very big
tables - aspnet_Users and aspnet_Profile. The SP is written in such
a way that if one user has multiple profiles, it will return all
profiles of the user. But normally we store one profile per user.
So, there&amp;#39;s no need for creating a temporary table. Moreover,
there&amp;#39;s no need for doing 
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
LIKE LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserNameToMatch).
It is always called with a full user name which we can match
directly using the equal operator.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
So, we opened up the&amp;nbsp;stored proc and did a open heart bypass
surgery like this:&lt;/span&gt;
&lt;/p&gt;
&lt;div style="BORDER-RIGHT:lightgrey 1px solid;PADDING-RIGHT:10px;BORDER-TOP:lightgrey 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:lightgrey 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:lightgrey 1px solid;FONT-FAMILY:Courier New;"&gt;

&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
IF &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@UserNameToMatch
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NOT NULL &lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;BEGIN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;u.UserName,
u.IsAnonymous, u.LastActivityDate, p.LastUpdatedDate,&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
                    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyNames)
                    + &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyValuesString)
+ &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DATALENGTH&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(p.PropertyValuesBinary)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
  dbo.aspnet_Users u&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;INNER
JOIN &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;dbo.aspnet_Profile
p &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;ON
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;u.UserId
= p.UserId
                &lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
            u.LoweredUserName = &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserNameToMatch)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@@ROWCOUNT&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
   
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;ELSE&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;BEGIN

&lt;span style="COLOR:green;"&gt;-- Do the original bad
things&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It ran fine locally. Now it was time to run it on the server.
This is an important SP which is used by the ASP.NET 2.0 Profile
Provider, heart of ASP.NET framework. If we do something wrong
here, we might not be able to see the problem immediately, but may
be after one month we will realize users profile is mixed up and
there&amp;#39;s no way to get it back. So, it was a pretty hard decision to
run this on a live production server directly without doing enough
test. We did not have time to do enough test anyway. We are already
down. So, we all gathered, said our prayer and hit the &amp;quot;Execute&amp;quot;
button on SQL Server Management Studio.&lt;/p&gt;
&lt;p&gt;The SP ran fine. On the server we noticed from 100% CPU usage it
came down to 30% CPU usage. IO usage also came down to 40%.&lt;/p&gt;
&lt;p&gt;We went live again.&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s another SP which gets called on every
page load and webservice call on our site because we use Profile
provider extensively.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:lightgrey 1px solid;PADDING-RIGHT:10px;BORDER-TOP:lightgrey 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:lightgrey 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:lightgrey 1px solid;FONT-FAMILY:Courier New;"&gt;

&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
CREATE PROCEDURE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;[dbo].[aspnet_Profile_GetProperties]&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @ApplicationName      &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;nvarchar&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(256),&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @UserName           
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;nvarchar&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(256),&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    @CurrentTimeUtc       &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;datetime&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
AS&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
BEGIN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@ApplicationId
= ApplicationId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                FROM &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;dbo.aspnet_Applications
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        WHERE LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationName)
= LoweredApplicationName&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IF
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@ApplicationId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        RETURN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;DECLARE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@UserId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;uniqueidentifier&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@UserId
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;NULL&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;@UserId
= UserId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
 dbo.aspnet_Users&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;ApplicationId
= @ApplicationId &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                AND &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;LoweredUserName
= &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        LOWER&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserName)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IF
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@UserId
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IS
NULL&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        RETURN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;SELECT
TOP &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;1
PropertyNames, PropertyValuesString, PropertyValuesBinary&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;FROM
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
       dbo.aspnet_Profile&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;WHERE
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
      UserId = @UserId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;IF
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;(@@ROWCOUNT
&amp;gt; 0)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;BEGIN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        UPDATE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;dbo.aspnet_Users&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        SET &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
  LastActivityDate=@CurrentTimeUtc&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
        &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
        WHERE &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;UserId
= @UserId&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
    &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
END&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When you run the SP, see the statistics:
&lt;/p&gt;
&lt;div style="BORDER-RIGHT:lightgrey 1px solid;PADDING-RIGHT:10px;BORDER-TOP:lightgrey 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:lightgrey 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:lightgrey 1px solid;FONT-FAMILY:Courier New;"&gt;

&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
Table &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:maroon;PADDING-TOP:0px;"&gt;&amp;#39;aspnet_Applications&amp;#39;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;.
Scan &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;count
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;1,
logical reads 2, physical reads 0, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads 0, lob logical reads 0, lob physical
                            reads 0, lob &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads
                                    0.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
Table &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:maroon;PADDING-TOP:0px;"&gt;&amp;#39;aspnet_Users&amp;#39;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;.
Scan &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;count
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;1,
logical reads 4, physical reads 0, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads 0, lob logical reads 0, lob physical
                            reads 0, lob &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads
                                    0.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
Table &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:maroon;PADDING-TOP:0px;"&gt;&amp;#39;aspnet_Profile&amp;#39;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;.
Scan &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;count
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;0,
logical reads 3, physical reads 0, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads 0, lob logical reads 0, lob physical
                            reads 0, lob &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads
                                    0.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
Table &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:maroon;PADDING-TOP:0px;"&gt;&amp;#39;aspnet_Users&amp;#39;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;.
Scan &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;count
&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;0,
logical reads 27, physical reads 0, &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;
                        read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads 0, lob logical reads 0, lob physical
                            reads 0, lob &lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;COLOR:blue;PADDING-TOP:0px;"&gt;read&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;-ahead
reads
                                    0.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
 
&lt;/pre&gt;
&lt;pre style="MARGIN:0px;LINE-HEIGHT:90%;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
(1 row(s) affected)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This&amp;nbsp;stored proc&amp;nbsp;is called whenever you access some
property on Profile object.&lt;/p&gt;
&lt;p&gt;First it does a SELECT on aspnet_application to find out the
application ID from application name. You can easily replace this
with a hard coded application ID inside the SP and save some
effort. Normally we run only one application on our production
server. So, there&amp;#39;s no need to lookup application ID on every
single call.&lt;/p&gt;
&lt;p&gt;From client statistics, you can see how expensive it is:&lt;/p&gt;
&lt;img src="http://omar.mvps.org/pics/Client%20statistics.png" alt="" /&gt;&amp;nbsp;
&lt;p&gt;Then look at the last block where aspnet_users table is updated
with LastActivityDate. This is the most expensive one.&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://omar.mvps.org/pics/Update%20cost.png" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;This is done in order to ensure Profile provider remembers when
was the last time a user&amp;#39;s profile was accessed. We do not need to
do this on every single page load and web service call. May be we
can do it when user first logs in and logs out. In our case, a lot
of web service is called while user is on the page. There&amp;#39;s only
one page anyway. So, we can easily remove this in order to save a
costly update on the giant aspnet_users table on every single web
service call.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=107967" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+performance/default.aspx">asp.net performance</category></item><item><title>Client side Page Fragment Output cache, reduce page download time significantly</title><link>http://msmvps.com/blogs/omar/archive/2006/08/10/client-side-page-fragment-output-cache-reduce-page-download-time-significantly.aspx</link><pubDate>Thu, 10 Aug 2006 06:34:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:107254</guid><dc:creator>omar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=107254</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/10/client-side-page-fragment-output-cache-reduce-page-download-time-significantly.aspx#comments</comments><description>&lt;p&gt;When you have a page full of lots of HTML, it will be best if
the whole page can be cached on the browser. You can do this using
HTTP Response caching header either by injecting them manually or
by using @OutputCache tag directive on ASPX pages.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;PADDING-RIGHT:10px;BORDER-TOP:black 1px solid;PADDING-LEFT:10px;FONT-SIZE:10pt;BACKGROUND:white;PADDING-BOTTOM:10px;BORDER-LEFT:black 1px solid;COLOR:black;PADDING-TOP:10px;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&amp;lt;%&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:blue;"&gt;@&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:maroon;"&gt;
OutputCache&lt;/span&gt; 
&lt;span style="margin:0px;padding:0px;color:red;"&gt;
Location&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:blue;"&gt;=&amp;quot;Client&amp;quot;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:red;"&gt;
Duration&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:blue;"&gt;=&amp;quot;86400&amp;quot;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:red;"&gt;
VaryByParam&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:blue;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:red;"&gt;
VaryByHeader&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;color:blue;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;
&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
%&amp;gt;&lt;/span&gt;&lt;/div&gt;


&lt;p&gt;But if part of the page is dynamic and part of the page is
static (like header, left side menu, foother, right side menu,
bottom part) etc where static parts of the page occupy a
significant amount of html, then if you could cache those parts on
the browser, you could save a lot of bytes that gets downloaded
every time the page downloads. On most of the websites, you will
find the header, navigation menu, footer, bottom part,
advertisements are mostly static and thus easily cacheable. If the
whole page size is say 50KB, at least 20KB is static and 30KB might
be dynamic. If you can use client side caching of page fragments
(not ASP.NET&amp;rsquo;s server side page output cache), you can save
40% download time easily.&lt;/p&gt;
&lt;p&gt;ASP.NET offers you page fragment caching using @Outputcache
which is good, but that caching is on server side. It cache the
output of user controls and serves them from server side cache. You
cannot eliminate the download of those costly bytes. It just saves
some CPU process. Nothing much for users in it.&lt;/p&gt;
&lt;p&gt;The only way to cache part of page is by allowing browser to
download those parts separately and making those parts cacheable
just like images/CSS/javascripts get cached. So, we need to
download page fragments separately and make them cached on the
browser&amp;rsquo;s cache. IFRAME is an easy way to do this but IFRAME
makes the page heavy and thus not follow CSS of the page. There are
many reasons why IFRAME can&amp;rsquo;t work. So, we have a better way,
&lt;b&gt;we will use Javascript to render content of the page and
javascript will get cached on the browser&amp;rsquo;s
cache&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;So, here&amp;#39;s the idea:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;We will split the whole page into multiple parts&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;We will generate page content using Javascript. Each cacheable
part comes from javascript and javascript renders the HTML of
it.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The parts which are cachable gets cached by the browser and
thus never downloaded again (until you want them to be). But those
parts which are non-cachable and highly dynamic, does not get
cached by browser.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, let&amp;#39;s think of a page setup like this:&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;table style="BORDER-COLLAPSE:collapse;"&gt;





&lt;tr&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:#a3a3a3 1pt solid;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:#a3a3a3 1pt solid;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;p&gt;Logo&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:#a3a3a3 1pt solid;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:medium none;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;p&gt;Header&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:medium none;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:#a3a3a3 1pt solid;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;p&gt;Left navigation Menu&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:medium none;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:medium none;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;p&gt;Dynamic part of the page&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:medium none;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:#a3a3a3 1pt solid;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;p&gt;Footer&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT:#a3a3a3 1pt solid;PADDING-RIGHT:5px;BORDER-TOP:medium none;PADDING-LEFT:5px;PADDING-BOTTOM:5px;BORDER-LEFT:medium none;PADDING-TOP:5px;BORDER-BOTTOM:#a3a3a3 1pt solid;"&gt;
&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Here only one part is dynamic and the rest is fully cacheable.
So, the Default.aspx which renders this whole page looks like
this:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;@&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;Page&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;Language&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;VB&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;@&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;OutputCache&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;NoStore&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;Location&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;None&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;DOCTYPE&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;html&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;PUBLIC&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;quot;-//W3C//DTDXHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;html&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;head&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;runat&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;title&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;MyBig Fat Page&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;title&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;head&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;body&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;form&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;id&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;runat&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;table&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;width&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;border&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;1&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;   &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;Somelogo here&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;id&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Script1&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;src&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Header.aspx&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;type&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;       &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;id&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;LeftMenu&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;src&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;LeftMenu.aspx&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;type&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;bgcolor&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;lightgrey&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;div&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;This is the dynamic part which gets changed on every load. Checkout the time when&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;it was generated: &lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;DateTime.Now &lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;BACKGROUND:yellow;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;div&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;       &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;colspan&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;id&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Footer&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;src&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Footer.aspx&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;type&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;td&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;tr&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;table&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;form&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;body&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;html&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The page looks like this:&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://msmvps.com/photos/omar/picture107255.aspx" target="_blank"&gt;
&lt;img src="http://msmvps.com/photos/omar/images/107255/original.aspx" border="0" alt="" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;You see, the cached parts are 30 mins older. Browser has not
downloaded those parts at all and thus saved a significant amount
of data transfer. The only part that was downloaded was the dynamic
part.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://msmvps.com/photos/omar/picture107256.aspx" target="_blank"&gt;
&lt;img src="http://msmvps.com/photos/omar/images/107256/original.aspx" border="0" alt="" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;When you load the page first time, all 4 files are downloaded.
But the last 3 files get cached and never downloaded until
browser&amp;rsquo;s cache expires. So, on second visit, only one file
downloaded and thus saves a significant amount of data
transfer.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at one of the files Header.aspx which gets
cached. Nothing fancy here, it&amp;rsquo;s a regular ASPX page:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The interesting thing here is the &amp;ldquo;ContentType&amp;rdquo;
which I have set to &amp;ldquo;text/html/javascript&amp;rdquo;. This is not
something built-in, I have introduced this type.&lt;/p&gt;
&lt;p&gt;When you put an ASPX inside a Script tag, it surely does not
work because 
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;script&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;
id&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Script1&amp;quot;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;
src&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;Header.aspx&amp;quot;&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;
type&lt;/span&gt;
&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;
expects javascript output, not html output. If html output is
provided, browsers simply ignores it. So, we need to convert the
output of Header.aspx into Javascript which when downloaded and
executed by the browser, emits the original html that was generated
when ASP.NET executed the page.&lt;/p&gt;
&lt;p&gt;We use HTTP Module to intercept all .aspx calls and when the
page is about to be written to the output, we check if the content
type is &amp;ldquo;text/html/javascript&amp;rdquo;. If it is, this is our
cue to convert the page output to javascript representation.&lt;/p&gt;
&lt;p&gt;If you want to know details about HTTP Module and how to use
Response Filter to modify page output, please read this wonderful
article:&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.aspnetresources.com/articles/HttpFilters.aspx"&gt;http://www.aspnetresources.com/articles/HttpFilters.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It really explains all the things. I would recommend you read
this article first and then continue with the rest.&lt;/p&gt;
&lt;p&gt;We have made a response filter named Html2JSPageFilter.js
(available in the code download), which overrides the Write method
of Stream and converts the entire HTML of the page to javascript
representation:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;public&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;override&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;void&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;Write(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;byte&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;[]buffer, &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;int&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;offset, &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;int&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;count)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;strBuffer = System.Text.&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;UTF8Encoding&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.UTF8.GetString(buffer, offset, count);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//---------------------------------&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//Wait for the closing &amp;lt;/html&amp;gt; tag&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//---------------------------------&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;Regex&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;eof = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;new&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;Regex&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;RegexOptions&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.IgnoreCase);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;if&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(!eof.IsMatch (strBuffer))&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            responseHtml.Append (strBuffer);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            responseHtml.Append (strBuffer);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt; finalHtml = responseHtml.ToString ();&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//extract only the content inside the form tag tag ASP.NET generatesin all .aspx&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;int&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;formTagStart = finalHtml.IndexOf(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;lt;form&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;int&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;formTagStartEnd = finalHtml.IndexOf(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,formTagStart);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;int&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;formTagEnd = finalHtml.LastIndexOf(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;lt;/form&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;pageContentInsideFormTag = finalHtml.Substring(formTagStartEnd + 1,formTagEnd - formTagStartEnd - 1);&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;First we get the entire page output, then we get only what is
inside the &amp;lt;form&amp;gt; tag that ASP.NET generates for all .aspx
pages.&lt;/p&gt;
&lt;p&gt;Next step is to remove the viewstate hidden field because this
will conflict with the view state on the default.aspx.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//Remove the __VIEWSTATE tag because page fragments don&amp;#39;t needviewstate&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//Note this will make all ASP.NET controls in the page fragments gomad which &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//needs viewstate to do their work.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;Regex&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;re = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;new&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;Regex&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;(&amp;lt;input.*?__VIEWSTATE.*?/&amp;gt;)&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;RegexOptions&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.IgnoreCase);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            pageContentInsideFormTag =re.Replace(pageContentInsideFormTag, &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.Empty);&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now we convert the entire html output to javascript string
format:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:gray;"&gt;///&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;Convert the HTML to javascript string representation&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;javascript2Html = &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                pageContentInsideFormTag.Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;\r&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;   &amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;\\\\&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;                .Replace(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;,&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;\\&amp;#39;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Final touch is to put that javascript string inside a
&amp;ldquo;document.write(&amp;lsquo;...&amp;rsquo;);&amp;rdquo; call. When you
call document.write to emit html, it gets part of the page
html:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:green;"&gt;//Generate the document.write(&amp;#39;...&amp;#39;) which adds the content in thedocument&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;            &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;string&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;pageOutput = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;document.write(&amp;#39;&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;+ javascript2Html + &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;&amp;#39;);&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This is basically the trick. Use a Response filter to get the
.aspx output, and then convert it to Javascript representation.&lt;/p&gt;
&lt;p&gt;For convenience, I have used a HttpModule to hook into ASP.NET
pipeline and wait for .aspx files which try to emit content type of
&amp;ldquo;text/html/javascript&amp;rdquo;. Again this content type is
nothing special, you could use &amp;ldquo;text/Omar Al
Zabir&amp;rdquo;.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;void&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;IHttpModule&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.Init(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;HttpApplication&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;context)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;        context.ReleaseRequestState += &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;new&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;EventHandler&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(InstallResponseFilter);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;private&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;void&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;InstallResponseFilter(&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;object&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;sender, &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;EventArgs&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;e) &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;     &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;HttpResponse&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;response = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;HttpContext&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;.Current.Response;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt; &lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;     &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;if&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(response.ContentType == &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;text/html/javascript&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;     {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;         response.ContentType = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;         response.Filter = &lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;new&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:teal;"&gt;Html2JSPageFilter&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;(response.Filter);&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;     }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;    }&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And finally in web.config, we have to register the HttpModule so
that it gets called:&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="font-size:10px;font-family:Courier New;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;httpModules&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;add&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;name&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;Html2JSModule&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:red;"&gt;type&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;=&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;Html2JavascriptModule&lt;/span&gt;&lt;span style="PADDING-RIGHT:0px;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;PADDING-TOP:0px;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="PADDING-BOTTOM:0px;MARGIN:0px;LINE-HEIGHT:90%;"&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:maroon;"&gt;httpModules&lt;/span&gt;&lt;span style="margin:0px;padding:0px;line-height:90%;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The entire source code is available in this URL:&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://msmvps.com/files/65/omar/entry107253.aspx"&gt;Download Source code of:
Client side Page Fragment Output cache, reduce page download time
significantly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Enjoy. Use this approach in your aspx and html files and save
significant amount of download time on users end. Although it
slightly increases first time visit download time (200+ms for each
script tag), but it makes second time visit a breeze. See the
performance difference yourself. First visit 
&lt;a href="http://www.pageflakes.com"&gt;www.pageflakes.com&lt;/a&gt;. Then
close your browser, open it again and enter 
&lt;a href="http://www.pageflakes.com"&gt;www.pageflakes.com&lt;/a&gt;. See how
fast it loads. If you use a HTTP debugger to monitor how much data
is transferred, you will see it&amp;#39;s only 200 bytes!&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=107254" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+performance/default.aspx">asp.net performance</category></item></channel></rss>