<?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 : production</title><link>http://msmvps.com/blogs/omar/archive/tags/production/default.aspx</link><description>Tags: production</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>99.99% available ASP.NET and SQL Server SaaS Production Architecture</title><link>http://msmvps.com/blogs/omar/archive/2008/12/10/99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx</link><pubDate>Wed, 10 Dec 2008 08:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1656383</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=1656383</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/12/10/99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx#comments</comments><description>&lt;p&gt;You have a hot ASP.NET+SQL Server product, growing at thousand users per day and you have hit the limit of your own garage hosting capability. Now that you have enough VC money in your pocket, you are planning to go out and host on some real hosting facility, maybe a colocation or managed hosting. So, you are thinking, how to design a physical architecture that will ensure performance, scalability, security and availability of your product? How can you achieve four-nine (99.99%) availability? How do you securely let your development team connect to production servers? How do you choose the right hardware for web and database server? Should you use Storage Area Network (SAN) or just local disks on RAID? How do you securely connect your office computers to production environment?&lt;/p&gt;
&lt;p&gt;Here I will answer all these queries. Let me first show you a diagram that I made for &lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt; where we ensured we get four-nine availability. Since Pageflakes is a &lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;Level 3 SaaS&lt;/a&gt;, it&amp;rsquo;s absolutely important that we build a high performance, highly available product that can be used from anywhere in the world 24/7 and end-user gets quick access to their content with complete personalization and customization of content and can share it with others and to the world. So, you can take this production architecture as a very good candidate for Level 3 SaaS: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/Hosting_5F00_environment_5F00_7C36AD9E.png"&gt;&lt;img title="Hosting_environment" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="Hosting_environment" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/Hosting_5F00_environment_5F00_thumb_5F00_45D55FC2.png" border="0" height="832" width="600" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a CodeProject article that explains all the ideas:&lt;/p&gt;
&lt;p&gt;&lt;a title="99.99% available ASP.NET and SQL Server SaaS Production Architecture" href="http://www.codeproject.com/KB/aspnet/ProdArch.aspx" target="_blank"&gt;99.99% available ASP.NET and SQL Server SaaS Production Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hope you like it. Appreciate your vote.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:25404c3d-2014-4892-a108-bf1cfc5d1ff8" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f12%2f10%2f99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f12%2f10%2f99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1656383" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/architecture/default.aspx">architecture</category></item><item><title>ASP.NET website Continuous Integration+Deployment using CruiseControl.NET, Subversion, MSBuild and Robocopy</title><link>http://msmvps.com/blogs/omar/archive/2008/10/06/asp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx</link><pubDate>Mon, 06 Oct 2008 06:59:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649873</guid><dc:creator>omar</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1649873</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/06/asp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx#comments</comments><description>&lt;p&gt;You can setup continuous integration and automated deployment for your web application using CruiseControl.NET, Subversion, MSBuild and Robocopy. I will show you how you can automatically build the entire solution, email build report to developers and QA, deploy latest code in IIS all using CruiseControl.NET every N minutes. &lt;/p&gt;
&lt;p&gt;First get the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msmvps.com/controlpanel/blogs/posteditor.aspx/subversion.tigris.org"&gt;Subversion&lt;/a&gt; (install the command line tools and add the Subversion bin path to PATH environment variable)  &lt;/li&gt;
&lt;li&gt;Robocopy (Windows Vista/2008 has it built-in, here&amp;#39;s the link for &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd"&gt;Windows 2003&lt;/a&gt;)  &lt;/li&gt;
&lt;li&gt;Install .NET Framework. You need it for MSBuild. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will learn how I have configured Continuous Integration and Deployment for my open source AJAX Portal project &lt;a href="http://www.Dropthings.com"&gt;www.Dropthings.com&lt;/a&gt;. The code is hosted at CodePlex. When some developer makes a commit, CruiseControl downloads the latest code, builds the entire solution, emails build report and then deploys the latest web site to IIS 6.0.&lt;/p&gt;
&lt;p&gt;After installing CruiseControl.NET, go to &lt;span style="text-decoration:underline;"&gt;Programs -&amp;gt; Cruise Control -&amp;gt; CruiseControl.NET Config&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Now keep copying and pasting the following XML blocks and make sure you understand each block and make necessary changes:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:94.58%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;height:301px;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;cruisecontrol&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Dropthings&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;queue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;DropthingsQueue&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;queuePriority&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        Path to the trunk folder where the full solution starts from. This is where&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        subversion checkout and incremental update is performed &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;        --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;d:\cc\dropthings\code\trunk\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- Some path where CCNet writes its logs and stuffs. It can be outside the log folder --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;d:\cc\dropthings\artifact\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;category&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;category&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!-- CCNet installs a web dashboard. Enter the URL of that dashboard here --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;webURL&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost/ccnet/&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;webURL&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;60&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;labeller&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;defaultlabeller&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;0.1.&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;incrementOnFailure&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;incrementOnFailure&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;labelFormat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;000&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;labelFormat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;labeller&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;state&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;state&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;directory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;State&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First change the working directory. It needs to be the path of the folder where you will have the solution downloaded. I generally create folder structure like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D:\CC - Root for all CC.NET enabled projects 
&lt;ul&gt;
&lt;li&gt;\ProjectName - Root project folder 
&lt;ul&gt;
&lt;li&gt;\Code - Code folder where code is downloaded from subversion &lt;/li&gt;
&lt;li&gt;\Artifact - CC.NET generates a lot of stuff. All goes here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Next comes the Subversion integration block:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;sourcecontrol&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;svn&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;&amp;lt;!-- Subversion trunk repository to keep checking for latest code --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;trunkUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost:8081/tfs02.codeplex.com/dropthings/trunk&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;trunkUrl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;username&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;***** SUBVERSION USER NAME *****&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;username&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;password&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;***** SUBVERSION PATH *****&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;password&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;sourcecontrol&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here specify the subversion location where you want to download code to the working folder. You should download the entire solution because you will be building the entire solution using MSBuild soon.&lt;/p&gt;
&lt;p&gt;I left &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt; empty. This means whatever is specified earlier in the &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt; is used. Otherwise you can put some relative folder path here or any absolute folder.&lt;/p&gt;
&lt;p&gt;Now we start building the tasks that CC.NET executes - Build, Email, and Deploy.&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;tasks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactcleanup&lt;/span&gt;   &lt;span style="color:#ff0000;"&gt;cleanUpMethod&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;KeepLastXBuilds&amp;quot;&lt;/span&gt;   &lt;span style="color:#ff0000;"&gt;cleanUpValue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationWriter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filename&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;mods.xml&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filename&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationWriter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;&amp;lt;!-- MSBuild task to build a .msbuild file that basically builds a .sln file --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;msbuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;C:\windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;workingDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectFile&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings.msbuild&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectFile&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Build&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;timeout&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;300&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;timeout&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;logger&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;logger&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;msbuild&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This block first says, keep artifacts for last 5 build and remove olders. Artifacts are like build reports, logs etc. You can increase the value for longer history.&lt;/p&gt;
&lt;p&gt;Then the most important &lt;span style="text-decoration:underline;"&gt;&amp;lt;msbuild&amp;gt;&lt;/span&gt; task. The executable path is to the MSBuild.exe. I am using .NET 3.5 Framework 64bit edition. You might have .NET 2.0 and 32bit version. So, set the right path here for the MSbuild.exe.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&amp;lt;projectFile&amp;gt;&lt;/span&gt; maps to a MSBuild file. It&amp;#39;s a skeleton MSBuild file which basically says build this Visual Studio solution file. Here&amp;#39;s how the msbuild file looks like:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Build&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Rebuild entire solution --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MSBuild&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Projects&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Dropthings.sln&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Targets&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Rebuild&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;span style="text-decoration:underline;"&gt;Dropthings.msbuild&lt;/span&gt; and &lt;span style="text-decoration:underline;"&gt;Dropthings.sln&lt;/span&gt; file exists in the same trunk folder. This file says - build Dropthings.sln and do a rebuild.&lt;/p&gt;
&lt;p&gt;Now you got the build done. Next is to deploy it. You will be using robocopy to copy files from the code folder to a destination folder which is mapped in IIS to a website. Robocopy will do a synchronization of the directories. It will add new files, overwrite old files and removes files from destination folder which no longer exists in the source folder. &lt;/p&gt;
&lt;p&gt;Before you can deploy, you need to stop the website or restart IIS. Otherwise some files may be in use and you will not be able to delete or overwrite the files. Here&amp;#39;s how to stop IIS using the &lt;span style="text-decoration:underline;"&gt;iisreset&lt;/span&gt; command line tool:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;Stop IIS before copying over the latest web project files so that there&amp;#39;s no write lock and IIS does not&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;start restarting the site half way through&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisreset&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/stop&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you do not want to stop the entire IIS, instead just stop a website and recycle an application pool, you can use the iisweb.vbs script for stopping a website and iisapp.vbs script for recycling application pool. Here&amp;#39;s an example:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisweb&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/stop &amp;quot;Dropthings&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisapp&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; /a &amp;quot;Dropthings&amp;quot; /r&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You need to first register &lt;span style="text-decoration:underline;"&gt;cscript&lt;/span&gt; as the default script runtime. In order to do this, go to command line and enter iisweb. It will tell you that it cannot use wscript to run this script and it needs to make cscript default. Let it make cscript as default.&lt;/p&gt;
&lt;p&gt;Now the time to do the deployment of latest web site files. The following task launches robocopy to do the deployment:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;Sync the web project folder with the deployment folder. The deployment folder is where IIS&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;is mapped to serve the site. The deployment folder is at the buildArgs node. The robocopy &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;utility does an exact sync, adding new files, updating old files, deleting files that no longer&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;exist.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!--&amp;lt;executable&amp;gt;C:\Program Files (x86)\Windows Resource Kits\Tools\robocopy.exe&amp;lt;/executable&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;robocopy.exe&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Dropthings\&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseDirectory&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;.\ d:\cc\Dropthings\Deploy *.* /E /XA:H /PURGE /XO /XD &amp;quot;.svn&amp;quot; /NDL /NC /NS /NP&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildTimeoutSeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;60&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildTimeoutSeconds&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;successExitCodes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1,0&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;successExitCodes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First you need to correct the robocopy.exe path. For Windows Vista/Windows 2008, keep it as it is. For Windows 2003, you need to specify the full path. You also need to remove the (x86) from the path if you have 32bit OS.&lt;/p&gt;
&lt;p&gt;Next is the &lt;span style="text-decoration:underline;"&gt;&amp;lt;baseDirectory&amp;gt;.&lt;/span&gt; This is relative to the working directory. It&amp;#39;s the path of the website folder. Dropthings website folder is located under the Dropthings folder under trunk. So, I have specified Dropthings\ as the subfolder where the website files are located. You need to specify your project&amp;#39;s website folder&amp;#39;s relative path here form the &lt;span style="text-decoration:underline;"&gt;&amp;lt;workingDirectory&amp;gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Next change the path in the &lt;span style="text-decoration:underline;"&gt;&amp;lt;buildArgs&amp;gt;&lt;/span&gt; node. First one is the source &amp;quot;.\&amp;quot; which you keep as it is. It means copy files from the &lt;span style="text-decoration:underline;"&gt;baseDirectory&lt;/span&gt;. Next is the absolute path to the deployment folder where the web site is mapped in IIS. You can use both relative or absolute path here. While using relative path, just keep in mind the robocopy is running from the &amp;lt;workingDirectory&amp;gt;\&amp;lt;baseDirectory&amp;gt; folder.&lt;/p&gt;
&lt;p&gt;After the path keep the *.* and the remaining flags intact. The flags mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy all subdirectories /E&lt;/li&gt;
&lt;li&gt;Copy hidded files /XA:H&lt;/li&gt;
&lt;li&gt;Do not copy old files /XO&lt;/li&gt;
&lt;li&gt;Exclude .svn directory while copying files /XD &amp;quot;.svn&amp;quot;&lt;/li&gt;
&lt;li&gt;Do not show list of files and directories being copie /NDL, /NC, /NP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the deployment, you need to turn IIS back on or start the website that you stopped:&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- Turn IIS back on --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;iisreset&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;executable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;/start&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;buildArgs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;exec&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;exec&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;    &amp;lt;executable&amp;gt;iisweb&amp;lt;/executable&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;    &amp;lt;buildArgs&amp;gt;/start &amp;quot;Dropthings&amp;quot;&amp;lt;/buildArgs&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;lt;/exec&amp;gt;            &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now we got the build and deployment done. Next is to email a nice report to developers and QA. If build succeeds, email both developers and QA so that they can check out the latest build. But if build fails, email only developers.&lt;/p&gt;
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;publishers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;rss&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;xmllogger&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;statistics&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Email build report to development and QA team --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;email&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;from&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;admin@yourcompany.com&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailhost&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;localhost&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailport&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;25&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;includeDetails&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;TRUE&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;           &lt;span style="color:#ff0000;"&gt;mailhostUsername&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mailhostPassword&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;useSSL&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;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;users&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev1@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev2@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Developer3&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;dev3@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa1@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa2@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;QA3&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;group&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa3@yourcompany.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;                    &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;users&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;groups&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;group&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;devs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;notification&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Always&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;group&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;notification&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Success&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;groups&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;converters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#008000;"&gt;&amp;lt;!--&amp;lt;regexConverter find=&amp;quot;$&amp;quot; replace=&amp;quot;@dropthings.com&amp;quot; /&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;converters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modifierNotificationTypes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;NotificationType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Always&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;NotificationType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modifierNotificationTypes&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;email&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modificationHistory&lt;/span&gt;  &lt;span style="color:#ff0000;"&gt;onlyLogWhenChangesFound&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;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;publishers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First you need to change the &lt;span style="text-decoration:underline;"&gt;&amp;lt;email&amp;gt;&lt;/span&gt; tab where you specify the from address, mail server name, and optionally a user account for the email address that you need to use to send out emails.&lt;/p&gt;
&lt;p&gt;Then edit the &lt;span style="text-decoration:underline;"&gt;&amp;lt;users&amp;gt;&lt;/span&gt; node and put your developers and QA.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s it! You got the configuration file done. Next step is to launch the CruiseControl.NET from Programs -&amp;gt; CruiseControl.NET -&amp;gt; CruiseControl.NET. It will launch a process that will execute the tasks according to the configuration. On Windows Vista, you will have to run it with Administrative privilege.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s also a Windows Service that gets installed. It&amp;#39;s named CruiseControl.NET. You can start the service as well on a server and go to sleep. It will do continuous integration and automated deployment for you.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s also a web based Dashboard that you can use to force a build or stop a build or see detail build reports.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.SetupASP.NETwebs.NETSubversionandMSBuild_5F00_D35/image_5F00_2.png"&gt;&lt;img border="0" width="604" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.SetupASP.NETwebs.NETSubversionandMSBuild_5F00_D35/image_5F00_thumb.png" alt="image" height="272" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;You can create multiple projects. You can have one project to build trunk code only, but do no deployment. Then you can create another project to build, deploy some branch that&amp;#39;s ready for production. You can create another project to build and deploy on QA server and so on. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/ccnet.zip"&gt;Here&amp;#39;s the full configuration file&lt;/a&gt; that you can use as your baseline.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:f699e682-0ab4-4a9d-97ad-c7aa1944438d" class="wlWriterSmartContent"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="http://digg.com/tools/diggthis.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f06%2fasp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f06%2fasp-net-website-continuous-integration-deployment-using-cruisecontrol-net-subversion-msbuild-and-robocopy.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649873" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/misc/default.aspx">misc</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item><item><title>Best practices for creating websites in IIS 6.0</title><link>http://msmvps.com/blogs/omar/archive/2008/10/04/best-practices-for-creating-websites-in-iis-6-0.aspx</link><pubDate>Sat, 04 Oct 2008 10:05:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649697</guid><dc:creator>omar</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1649697</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/10/04/best-practices-for-creating-websites-in-iis-6-0.aspx#comments</comments><description>&lt;p&gt;Every time I create an IIS website, I do some steps, which I consider as best practice for creating any IIS website for better performance, maintainability, and scalability. Here&amp;#39; re the things I do:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Create a separate application pool for each web application&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I always create separate app pool for each web app because I can select different schedule for app pool recycle. Some heavy traffic websites have long recycle schedule where low traffic websites have short recycle schedule to save memory. Moreover, I can choose different number of processes served by the app pool. Applications that are made for web garden mode can benefit from multiple process where applications that use in-process session, in memory cache needs to have single process serving the app pool. Hosting all my application under the &lt;u&gt;DefaultAppPool&lt;/u&gt; does not give me the flexibility to control these per site.&lt;/p&gt; &lt;p&gt;The more app pool you create, the more ASP.NET threads you make available to your application. Each &lt;u&gt;w3wp.exe&lt;/u&gt; has it&amp;#39;s own thread pool. So, if some application is congesting particular &lt;u&gt;w3wp.exe&lt;/u&gt; process, other applications can run happily on their separate &lt;u&gt;w3wp.exe&lt;/u&gt; instance, running under separate app pool. Each app pool hosts its own &lt;u&gt;w3wp.exe&lt;/u&gt; instance.&lt;/p&gt; &lt;p&gt;So, my rule of thumb: Always create new app pool for new web applications and name the app pool based on the site&amp;#39;s domain name or some internal name that makes sense. For example, if you are creating a new website alzabir.com, name the app pool alzabir.com to easily identify it.&lt;/p&gt; &lt;p&gt;Another best practice: Disable the &lt;u&gt;DefaultAppPool&lt;/u&gt; so that you don&amp;#39;t mistakenly keep adding sites to &lt;u&gt;DefaultAppPool&lt;/u&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="340" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_1.png" width="664" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;First you create a new application pool. Then you create a new Website or Virtual Directory, go to Properties -&amp;gt; Home Directory tab -&amp;gt; Select the new app pool.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="501" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_2.png" width="620" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Customize Website properties for performance, scalability and maintainability&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;First you map the right host headers to your website. In order to do this, go to WebSite tab and click on &amp;quot;Advanced&amp;quot; button. Add mapping for both domain.com and &lt;a href="http://www.domain.com"&gt;www.domain.com&lt;/a&gt;. Most of the time, people forget to map the domain.com. Thus many visitors skip typing the www prefix and get no page served.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="493" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_4.png" width="648" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Next turn on some log entries:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_12.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="458" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_5.png" width="605" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;These are very handy for analysis. If you want to measure your bandwidth consumption for specific sites, you need the Bytes Sent. If you want to measure the execution time of different pages and find out the slow running pages, you need Time Taken. If you want to measure unique and returning visitors, you need the Cookie. If you need to know who is sending you most traffic - search engines or some websites, you need the Referer. Once these entries are turned on, you can use variety of Log Analysis tools to do the analysis. For example, &lt;a title="s" href="http://awstats.sourceforge.net/"&gt;open source AWStats&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;But if you are using Google Analytics or something else, you should have these turned off, especially the Cookie and Referer because they take quite some space on the log. If you are using ASP.NET Forms Authentication, the gigantic cookie coming with every request will produce gigabytes of logs per week if you have a medium traffic website.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_14.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="269" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_6.png" width="473" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is kinda no brainer. I add Default.aspx as the default content page so that, when visitors hit the site without any .aspx page name, e.g. alzabir.com, they get the default.aspx served.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_16.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="461" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_7.png" width="475" border="0" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Things I do here:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Turn on Content Expiration. This makes static files remain in browser cache for 30 days and browser serves the files from its own cache instead of hitting the server. As a result, when your users revisit, they don&amp;#39;t download all the static files like images, javascripts, css files again and again. This one setting significantly improves your site&amp;#39;s performance.  &lt;li&gt;Remove the &lt;u&gt;X-Powered-By: ASP.NET&lt;/u&gt; header. You really don&amp;#39;t need it unless you want to attach Visual Studio Remote Debugger to your IIS. Otherwise, it&amp;#39;s just sending 21 bytes on every response.  &lt;li&gt;Add &amp;quot;From&amp;quot; header and set the server name. I do this on each webserver and specify different names on each box. It&amp;#39;s handy to see from which servers requests are being served. When you are trying to troubleshoot load balancing issues, it comes handy to see if a particular server is sending requests. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_18.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="465" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_8.png" width="538" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I set the 404 handler to some ASPX so that I can show some custom error message. There&amp;#39;s a 404.aspx which shows some nice friendly message and suggests some other pages that user can visit. However, another reason to use this custom mapping is to serve extensionless URL from IIS. &lt;a href="http://msmvps.com/blogs/omar/archive/2007/04/29/serve-extensionless-url-from-asp-net-without-using-isapi-module-or-iis-6-wildcard-mapping.aspx"&gt;Read this blog post for details&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_20.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="459" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar.BestpracticesforcreatingwebsitesinIIS6.0_5F00_CC6A/image_5F00_thumb_5F00_9.png" width="471" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Make sure to set ASP.NET 2.0 for your ASP.NET 2.0, 3.0 and 3.5 websites.&lt;/p&gt; &lt;p&gt;Finally, you must, I repeat you &amp;quot;MUST&amp;quot; &lt;a href="http://msmvps.com/blogs/omar/archive/2006/08/10/iis-6-compression-quickest-and-effective-way-to-do-it-for-asp-net-compression.aspx"&gt;turn on IIS 6.0 gzip compression&lt;/a&gt;. This turns on the Volkswagen V8 engine that is built into IIS to make your site screaming fast.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:c9260f79-7b63-4c02-96a4-1a4a412a5a65" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt; &lt;script type="text/javascript"&gt;&lt;/script&gt; &lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt; &lt;/div&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f04%2fbest-practices-for-creating-websites-in-iis-6-0.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f10%2f04%2fbest-practices-for-creating-websites-in-iis-6-0.aspx" border="0" /&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649697" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Deploy ASP.NET MVC on IIS 6, solve 404, compression and performance problems</title><link>http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx</link><pubDate>Mon, 30 Jun 2008 08:12:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1638845</guid><dc:creator>omar</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1638845</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx#comments</comments><description>&lt;p&gt;There are several problems with ASP.NET MVC application when deployed on IIS 6.0:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Extensionless URLs give 404 unless some URL Rewrite module is used or wildcard mapping is enabled  &lt;li&gt;IIS 6.0 built-in compression does not work for dynamic requests. As a result, ASP.NET pages are served uncompressed resulting in poor site load speed.  &lt;li&gt;Mapping wildcard extension to ASP.NET introduces the following problems:  &lt;ul&gt; &lt;li&gt;Slow performance as all static files get handled by ASP.NET and ASP.NET reads the file from file system on every call  &lt;li&gt;Expires headers doesn&amp;#39;t work for static content as IIS does not serve them anymore. Learn about benefits of expires header from &lt;a title="Making best use of cache" href="http://msmvps.com/blogs/omar/archive/2007/11/29/making-best-use-of-cache-for-high-performance-website.aspx"&gt;here&lt;/a&gt;. ASP.NET serves a fixed expires header that makes content expire in a day.  &lt;li&gt;Cache-Control header does not produce max-age properly and thus caching does not work as expected. Learn about caching best practices from &lt;a title="Making best use of Cache" href="http://msmvps.com/blogs/omar/archive/2007/11/29/making-best-use-of-cache-for-high-performance-website.aspx"&gt;here&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt; &lt;li&gt;After deploying on a domain as the root site, the homepage produces HTTP 404.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Problem 1: Visiting your website&amp;#39;s homepage gives 404 when hosted on a domain&lt;/h3&gt; &lt;p&gt;You have done the wildcard mapping, mapped .mvc extention to ASP.NET ISAPI handler, written the route mapping for Default.aspx or default.aspx (lowercase), but still when you visit your homepage after deployment, you get:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_32.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="273" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_6.png" width="430" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You will find people banging their heads on the wall here:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="http://forums.asp.net/t/1237051.aspx" href="http://forums.asp.net/t/1237051.aspx"&gt;http://forums.asp.net/t/1237051.aspx&lt;/a&gt;  &lt;li&gt;&lt;a title="http://forums.asp.net/t/1253599.aspx" href="http://forums.asp.net/t/1253599.aspx"&gt;http://forums.asp.net/t/1253599.aspx&lt;/a&gt;  &lt;li&gt;&lt;a title="http://forums.asp.net/p/1239943/2294813.aspx" href="http://forums.asp.net/p/1239943/2294813.aspx"&gt;http://forums.asp.net/p/1239943/2294813.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Solution is to capture hits going to &amp;quot;/&amp;quot; and then rewrite it to Default.aspx:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="61" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_1.png" width="600" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can apply this approach to any URL that ASP.NET MVC is not handling for you and it should handle. Just see the URL reported on the 404 error page and then rewrite it to a proper URL.&lt;/p&gt; &lt;h3&gt;Problem 2: IIS 6 compression is no longer working after wildcard mapping&lt;/h3&gt; &lt;p&gt;When you enable wildcard mapping, IIS 6 compression no longer works for extensionless URL because IIS 6 does not see any extension which is defined in IIS Metabase. You can learn about IIS 6 compression feature and how to configure it properly from &lt;a title="IIS 6 Compression - quickest and effective way to do it" href="http://msmvps.com/blogs/omar/archive/2006/08/10/iis-6-compression-quickest-and-effective-way-to-do-it-for-asp-net-compression.aspx"&gt;my earlier post&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Solution is to use an HttpModule to do the compression for dynamic requests.&lt;/p&gt; &lt;h3&gt;Problem 3: ASP.NET ISAPI does not cache Static Files &lt;/h3&gt; &lt;p&gt;When ASP.NET&amp;#39;s &lt;u&gt;DefaultHttpHandler&lt;/u&gt; serves static files, it does not cache the files in-memory or in ASP.NET cache. As a result, every hit to static file results in a File read. Below is the decompiled code in &lt;u&gt;DefaultHttpHandler&lt;/u&gt; when it handles a static file. As you see here, it makes a file read on every hit and it only set the expiration to one day in future. Moreover, it generates &lt;u&gt;ETag&lt;/u&gt; for each file based on file&amp;#39;s modified date. For best caching efficiency, we need to get rid of that &lt;u&gt;ETag&lt;/u&gt;, produce an expiry date on far future (like 30 days), and produce &lt;u&gt;Cache-Control&lt;/u&gt; header which offers better control over caching.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_12.png"&gt;&lt;img height="433" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_5.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So, we need to write a custom static file handler that will cache small files like images, Javascripts, CSS, HTML and so on in ASP.NET cache and serve the files directly from cache instead of hitting the disk. Here are the steps:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Install an &lt;u&gt;HttpModule&lt;/u&gt; that installs a Compression Stream on &lt;u&gt;Response.Filter&lt;/u&gt; so that anything written on Response gets compressed. This serves dynamic requests.  &lt;li&gt;Replace ASP.NET&amp;#39;s &lt;u&gt;DefaultHttpHandler&lt;/u&gt; that listens on *.* for static files.  &lt;li&gt;Write our own Http Handler that will deliver compressed response for static resources like Javascript, CSS, and HTML. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_6.png"&gt;&lt;img height="59" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_2.png" width="600" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here&amp;#39;s the mapping in ASP.NET&amp;#39;s web.config for the &lt;u&gt;DefaultHttpHandler&lt;/u&gt;. You will have to replace this with your own handler in order to serve static files compressed and cached. &lt;/p&gt; &lt;h3&gt;Solution 1: An Http Module to compress dynamic requests&lt;/h3&gt; &lt;p&gt;First, you need to serve compressed responses that are served by the &lt;u&gt;MvcHandler&lt;/u&gt; or ASP.NET&amp;#39;s default Page Handler. The following &lt;u&gt;HttpCompressionModule&lt;/u&gt; hooks on the &lt;u&gt;Response.Filter&lt;/u&gt; and installs a &lt;u&gt;GZipStream&lt;/u&gt; or &lt;u&gt;DeflateStream&lt;/u&gt; on it so that whatever is written on the Response stream, it gets compressed.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="393" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_3.png" width="596" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;These are formalities for a regular &lt;u&gt;HttpModule&lt;/u&gt;. The real hook is installed as below:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="436" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_4.png" width="593" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here you see we ignore requests that are handled by ASP.NET&amp;#39;s &lt;u&gt;DefaultHttpHandler&lt;/u&gt; and our own &lt;u&gt;StaticFileHandler&lt;/u&gt; that you will see in next section. After that, it checks whether the request allows content to be compressed. &lt;u&gt;Accept-Encoding&lt;/u&gt; header contains &amp;quot;gzip&amp;quot; or &amp;quot;deflate&amp;quot; or both when browser supports compressed content. So, when browser supports compressed content, a Response Filter is installed to compress the output.&lt;/p&gt; &lt;h3&gt;Solution 2: An Http Module to compress and cache static file requests&lt;/h3&gt; &lt;p&gt;Here&amp;#39;s how the handler works:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Hooks on *.* so that all unhandled requests get served by the handler  &lt;li&gt;Handles some specific files like js, css, html, graphics files. Anything else, it lets ASP.NET transmit it  &lt;li&gt;The extensions it handles itself, it caches the file content so that subsequent requests are served from cache  &lt;li&gt;It allows compression of some specific extensions like js, css, html. It does not compress graphics files or any other extension.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Let&amp;#39;s start with the handler code:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_16.png"&gt;&lt;img height="230" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_7.png" width="600" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here you will find the extensions the handler handles and the extensions it compresses. You should only put files that are text files in the COMPRESS_FILE_TYPES.&lt;/p&gt; &lt;p&gt;Now start handling each request from &lt;u&gt;BeginProcessRequest&lt;/u&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_18.png"&gt;&lt;img height="432" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_8.png" width="598" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here you decide the compression mode based on &lt;u&gt;Accept-Encoding&lt;/u&gt; header. If browser does not support compression, do not perform any compression. Then check if the file being requested falls in one of the extensions that we support. If not, let ASP.NET handle it. You will see soon how.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_20.png"&gt;&lt;img height="537" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_9.png" width="599" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Calculate the cache key based on the compression mode and the physical path of the file. This ensures that no matter what the URL requested, we have one cache entry for one physical file. Physical file path won&amp;#39;t be different for the same file. Compression mode is used in the cache key because we need to store different copy of the file&amp;#39;s content in ASP.NET cache based on Compression Mode. So, there will be one uncompressed version, a gzip compressed version and a deflate compressed version.&lt;/p&gt; &lt;p&gt;Next check if the file exits. If not, throw HTTP 404. Then create a memory stream that will hold the bytes for the file or the compressed content. Then read the file and write in the memory stream either directly or via a GZip or Deflate stream. Then cache the bytes in the memory stream and deliver to response. You will see the &lt;u&gt;ReadFileData&lt;/u&gt; and &lt;u&gt;CacheAndDeliver&lt;/u&gt; functions soon.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_22.png"&gt;&lt;img height="385" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_10.png" width="600" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This function delivers content directly from ASP.NET cache. The code is simple, read from cache and write to the response.&lt;/p&gt; &lt;p&gt;When the content is not available in cache, read the file bytes and store in a memory stream either as it is or compressed based on what compression mode you decided before:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_24.png"&gt;&lt;img height="426" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_11.png" width="598" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here bytes are read in chunk in order to avoid large amount of memory allocation. You could read the whole file in one shot and store in a byte array same as the size of the file length. But I wanted to save memory allocation. Do a performance test to figure out if reading in 8K chunk is not the best approach for you.&lt;/p&gt; &lt;p&gt;Now you have the bytes to write to the response. Next step is to cache it and then deliver it.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_26.png"&gt;&lt;img height="284" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_12.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now the two functions that you have seen several times and have been wondering what they do. Here they are:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_28.png"&gt;&lt;img height="477" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_13.png" width="599" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;u&gt;WriteResponse&lt;/u&gt; has no tricks, but &lt;u&gt;ProduceResponseHeader&lt;/u&gt; has much wisdom in it. First it turns off response buffering so that ASP.NET does not store the written bytes in any internal buffer. This saves some memory allocation. Then it produces proper cache headers to cache the file in browser and proxy for 30 days, ensures proxy revalidate the file after the expiry date and also produces the &lt;u&gt;Last-Modified&lt;/u&gt; date from the file&amp;#39;s last write time in UTC.&lt;/p&gt; &lt;h3&gt;How to use it&lt;/h3&gt; &lt;p&gt;Get the &lt;u&gt;HttpCompressionModule&lt;/u&gt; and &lt;u&gt;StaticFileHandler&lt;/u&gt; from: &lt;/p&gt; &lt;p&gt;&lt;a title="http://code.msdn.microsoft.com/fastmvc" href="http://code.msdn.microsoft.com/fastmvc"&gt;http://code.msdn.microsoft.com/fastmvc&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then install them in &lt;u&gt;web.config&lt;/u&gt;. First you install the &lt;u&gt;StaticFileHandler&lt;/u&gt; by removing the existing mapping for path=&amp;quot;*&amp;quot; and then you install the &lt;u&gt;HttpCompressionModule&lt;/u&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_30.png"&gt;&lt;img height="208" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_14.png" width="602" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That&amp;#39;s it! Enjoy a faster and more responsive ASP.NET MVC website deployed on IIS 6.0.&lt;/p&gt;&lt;span class="sbmLink"&gt;&lt;span class="sbmLink"&gt; &lt;table cellspacing="1" cellpadding="1"&gt;  &lt;tr&gt; &lt;td class="sbmText"&gt;Share this post : &lt;/td&gt; &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to del.icio.us" href="http://del.icio.us/post?url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png" border="0" alt="" /&gt;del.icio.us&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to digg" href="http://digg.com/submit?phase=2&amp;amp;url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png" border="0" alt="" /&gt;digg&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to dotnetkicks" href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg" border="0" alt="" /&gt;dotnetkicks&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to furl" href="http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;ti=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png" border="0" alt="" /&gt;furl&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to live" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png" border="0" alt="" /&gt;live&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to reddit!" href="http://reddit.com/submit?url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png" border="0" alt="" /&gt;reddit&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to spurl" href="http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png" border="0" alt="" /&gt;spurl&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to technorati!" href="http://technorati.com/faves/?add=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;title=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png" border="0" alt="" /&gt;technorati&lt;/a&gt;  &lt;td class="sbmDim"&gt;&lt;a class="sbmDim" title="Post it to yahoo!" href="http://myweb.yahoo.com/myresults/bookmarklet?u=http://msmvps.com/blogs/omar/archive/2008/06/30/deploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx&amp;amp;t=Deploy%20ASP.NET%20MVC%20on%20IIS%206,%20solve%20404,%20compression%20and%20performance%20problems" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png" border="0" alt="" /&gt;yahoo&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f06%2f30%2fdeploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f06%2f30%2fdeploy-asp-net-mvc-on-iis-6-solve-404-compression-and-performance-problems.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1638845" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+MVC/default.aspx">asp.net MVC</category></item><item><title>Reduce website download time by heavily compressing PNG and JPEG</title><link>http://msmvps.com/blogs/omar/archive/2008/04/07/reduce-website-download-time-by-heavily-compressing-png-and-jpeg.aspx</link><pubDate>Mon, 07 Apr 2008 13:17:47 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1576733</guid><dc:creator>omar</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1576733</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/04/07/reduce-website-download-time-by-heavily-compressing-png-and-jpeg.aspx#comments</comments><description>&lt;p&gt;PNG and JPEG are two most popular formats for web graphics. JPEG is used for photographs, screenshots and backgrounds where PNG is used for all other graphics need including cliparts, buttons, headers, footers, borders and so on. As a result, these two types of graphics file usually take up 80% of the total graphics used in a website. Of course, there&amp;#39;s the GIF, which is very popular. But as it supports only 256 colors, it is losing its popularity day by day. PNG seems to be a all rounder winner for all kinds of graphics need. As all browsers support PNG well enough and PNG supports alpha transparency, it&amp;#39;s surely the best format so far on the web for all purpose graphics need for websites. So, if you can optimize all PNG and JPEG on your website and compress them rigorously, you can easily shed off several seconds of load time from your website without doing any coding. Especially if your website is graphics rich like &lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt;, 30% reduction in total size of graphics throughout the website is a big performance win.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;Optimize all PNG on your website&lt;/h3&gt; &lt;p&gt;PNG has a lot of scope for optimization. Generally regular graphics tools like Photoshop, Paintshop pro, Paint.NET all generate PNG using a moderate compression. So, PNG can be compressed further by using advanced compression tools. &lt;a href="http://en.wikipedia.org/wiki/OptiPNG"&gt;OptiPNG&lt;/a&gt; is such a tool that can compress PNG and sometimes produce 50% smaller output. At Pageflakes, we have around 380 PNG which when compressed using OptiPNG, gives us 40% reduction in total size. This is a big win for us.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s what wikipedia says about OptiPNG:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;OptiPNG is an open source command line computer program that reduces the size of PNG files. The compression is lossless, meaning that the resulting image will have exactly the same appearance as the source image.  &lt;p&gt;The main purpose of OptiPNG is to reduce the size of the PNG IDAT data stream by trying various filtering and compression methods. It also performs automatic bit depth, color type and color palette reduction where possible, and can correct some data integrity errors in input files.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Here&amp;#39;s a poweshell script that you can run from the root folder of your website. It will scan through all the PNG files in the webtree and run OptiPNG on each file. This takes quite some time if you have hundreds of files. So, you should make it a part of your build script.&lt;/p&gt;&lt;pre class="csharpcode"&gt;gci -include *.png -recurse | &lt;span class="kwrd"&gt;foreach&lt;/span&gt;
 { $fileName = $_.FullName; cmd /c &amp;quot;C:\soft\png\optipng.exe -o7 `&amp;quot;&lt;span class="str"&gt;$fileName`&amp;quot;&amp;quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;p&gt;Here I have stored the optipng.exe on the c:\soft\png folder.&lt;/p&gt;
&lt;p&gt;OptiPNG gives very good compression. But there&amp;#39;s even more scope for compression. &lt;a href="http://en.wikipedia.org/wiki/AdvanceCOMP"&gt;AdvanceCOMP&lt;/a&gt; is the ultimate in compression technology for PNG as it uses the mighty &lt;a href="http://www.7-zip.org/"&gt;7zip&lt;/a&gt; compression algorithm. It can squeeze down PNG even further after being compressed by OptiPNG using its maximum compression mode. PNG files are compressed using DEFLATE algorithm. DEFLATE has 0 to 9 compression level, where 9 is the highest. AdvanceCOMP uses 7zip DEFLATE encoder, that extends the compression factor even more. During 7zip compression, a much more detailed search of compression possibilities is performed, at the expense of significant further processor time spent on searching. Effectively, the 10-point scale used in gzip is extended to include extra settings above 9, the previous maximum search level. There will be no difference in decompression speed, regardless of the level of compressed size achieved or time taken to encode the data.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s a poweshell script that you can run from the root folder of your website. It will scan through all the PNG files in the webtree and run AdvanceCOMP on each file. You need to run AdvanceCOMP after running OptiPNG.&lt;/p&gt;&lt;pre class="csharpcode"&gt;gci -include *.png -recurse | &lt;span class="kwrd"&gt;foreach&lt;/span&gt;
 { $fileName = $_.FullName; cmd /c &lt;span class="str"&gt;&amp;quot;C:\soft\png\advpng.exe 
 --shrink-insane -z `&amp;quot;&lt;/span&gt;$fileName`&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I have collected &lt;a href="http://omar.mvps.org/tool/png.zip"&gt;both optipng and advpng in this zip&lt;/a&gt; file.&lt;/p&gt;
&lt;h3&gt;Optimize all JPEG on your website&lt;/h3&gt;
&lt;p&gt;Unfortunately, there&amp;#39;s not much powerful tool like OptiPNG for jpeg that you can run on all your jpeg files and compress them rigorously. JPEG file is compressed when it is saved. Generally all graphics applications provide you an option to select what&amp;#39;s the quality ratio of the jpeg being saved. So, you have to consciously make the best compression vs quality choice while saving the jpeg file. However, &lt;a href="http://en.wikipedia.org/wiki/Libjpeg"&gt;libjpeg&lt;/a&gt; project has a jpeg optimizer tool that does some optimization on jpeg files. It has a jpegtran utility which does the optimization according to wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;jpegtran - a utility for lossless transcoding between different JPEG formats. The jpegtran command-line program is useful to optimize the compression of a JPEG file, convert between progressive and non-progressive JPEG formats, eliminate non-standard application-specific data inserted by some image programs, or to perform certain transformations on a file — such as grayscaling, or rotating and flipping (within certain limits) — all done &amp;quot;losslessly&amp;quot; (i.e. without decompressing and recompressing the data, and so causing a reduction of image quality due to generation loss).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;However, when we ran jpegtran on all the jpeg files in Pageflakes, we are able to reduce about 20% total size of all jpeg. So, that was not too bad. &lt;/p&gt;
&lt;p&gt;Here&amp;#39;s how you run jpegtran to get all the jpeg files within your website directory optimized:&lt;/p&gt;&lt;pre class="csharpcode"&gt;gci -include *.jpg -recurse | &lt;span class="kwrd"&gt;foreach&lt;/span&gt;
 { $fileName = $_.FullName; $newFileName = $fileName + &lt;span class="str"&gt;&amp;quot;.tmp&amp;quot;&lt;/span&gt;; 
cmd /c &lt;span class="str"&gt;&amp;quot;C:\soft\jpeg\jpegtran.exe -optimize -outfile `&amp;quot;&lt;/span&gt;$newFileName`&lt;span class="str"&gt;&amp;quot; `&amp;quot;&lt;/span&gt;$fileName`&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; 
copy $newFileName $fileName; del $newFileName; }&lt;/pre&gt;
&lt;p&gt;The &lt;a href="http://omar.mvps.org/tool/jpeg.zip"&gt;libjpeg binaries are uploaded here&lt;/a&gt; for your convenience.&lt;/p&gt;
&lt;p&gt;Warning: You have to run all these powershell commands in a single line. I have broken the commands in multiple line for better readability.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s save global bandwidth, go green.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1576733" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/powershell/default.aspx">powershell</category><category domain="http://msmvps.com/blogs/omar/archive/tags/compress/default.aspx">compress</category><category domain="http://msmvps.com/blogs/omar/archive/tags/optimize/default.aspx">optimize</category><category domain="http://msmvps.com/blogs/omar/archive/tags/jpeg/default.aspx">jpeg</category><category domain="http://msmvps.com/blogs/omar/archive/tags/png/default.aspx">png</category></item><item><title>10 ASP.NET Performance and Scalability Secrets</title><link>http://msmvps.com/blogs/omar/archive/2008/01/30/10-asp-net-performance-and-scalability-secrets.aspx</link><pubDate>Wed, 30 Jan 2008 15:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1486901</guid><dc:creator>omar</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1486901</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/01/30/10-asp-net-performance-and-scalability-secrets.aspx#comments</comments><description>&lt;p&gt;ASP.NET 2.0 has many secrets, when revealed, can give you big performance and
scalability boost. For instance, there are secret bottlenecks in Membership and Profile
provider which can be solved easily to make authentication and authorization faster.
Furthermore, ASP.NET Http pipeline can be tweaked to avoid executing unnecessary code
that gets hit on each and every request. Not only that, ASP.NET Worker Process can be
pushed to its limit to squeeze out every drop of performance out of it. Page fragment
output caching on the browser (not on the server) can save significant amount of download
time on repeated visits. On demand UI loading can give your site a fast and smooth
feeling. Finally, Content Delivery Networks (CDN) and proper use of HTTP Cache headers
can make your website screaming fast when implemented properly. In this article, you will
learn these techniques that can give your ASP.NET application a big performance and
scalability boost and prepare it to perform well under 10 times to 100 times more
traffic.&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx" href="http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx"&gt;http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this article I have shown the following techniques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET Pipeline optimization&lt;/li&gt;
&lt;li&gt;ASP.NET Process configuration optimization&lt;/li&gt;
&lt;li&gt;Things you must do for ASP.NET before going live&lt;/li&gt;
&lt;li&gt;Content Delivery Network&lt;/li&gt;
&lt;li&gt;Caching AJAX calls on browser&lt;/li&gt;
&lt;li&gt;Making best use of Browser Cache&lt;/li&gt;
&lt;li&gt;On demand progressive UI loading for fast smooth experience&lt;/li&gt;
&lt;li&gt;Optimize ASP.NET 2.0 Profile provider&lt;/li&gt;
&lt;li&gt;How to query ASP.NET 2.0 Membership tables without bringing down the site&lt;/li&gt;
&lt;li&gt;Prevent Denial of Service (DOS) attack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The above techniques can be implemented on any ASP.NET website especially those who
use ASP.NET 2.0&amp;#39;s Membership and Profile provider.&lt;/p&gt;
&lt;p&gt;You can learn a lot more about performance and scalability improvement of ASP.NET and
ASP.NET AJAX websites from my book - 
&lt;a href="http://www.oreilly.com/catalog/9780596510503/"&gt;Building a Web 2.0 portal using
ASP.NET 3.5&lt;/a&gt;.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1486901" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category></item><item><title>My first book - Building a Web 2.0 Portal with ASP.NET 3.5</title><link>http://msmvps.com/blogs/omar/archive/2008/01/13/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx</link><pubDate>Sun, 13 Jan 2008 20:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1461326</guid><dc:creator>omar</dc:creator><slash:comments>44</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1461326</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/01/13/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx#comments</comments><description>&lt;p&gt;My first book &amp;quot;&lt;a href="http://www.oreilly.com/catalog/9780596510503/" target="_blank"&gt;Building a Web 2.0 Portal with ASP.NET 3.5&lt;/a&gt;&amp;quot; from O&amp;#39;Reilly is published and available in the stores. This book explains in detail the architecture design, development, test, deployment, performance and scalability challenges of my open source web portal &lt;a href="http://www.dropthings.com" target="_blank"&gt;Dropthings.com&lt;/a&gt;. Dropthings is a prototype of a web portal similar to &lt;a href="http://www.google.com/ig" target="_blank"&gt;iGoogle&lt;/a&gt; or &lt;a href="http://www.pageflakes.com" target="_blank"&gt;Pageflakes&lt;/a&gt;. But this portal is developed using recently released brand new technologies like ASP.NET 3.5, C# 3.0, Linq to Sql, Linq to XML, and Windows Workflow foundation. It makes heavy use of ASP.NET AJAX 1.0. Throughout my career I have built several state-of-the-art &lt;a href="http://omar.mvps.org" target="_blank"&gt;personal&lt;/a&gt;, educational, enterprise and &lt;a href="http://www.pageflakes.com" target="_blank"&gt;mass consumer web portals&lt;/a&gt;. This book collects my experience in building all of those portals.&lt;/p&gt;&lt;p&gt;O&amp;#39;Reilly Website:&lt;br /&gt;&lt;a href="http://www.oreilly.com/catalog/9780596510503/"&gt;http://www.oreilly.com/catalog/9780596510503/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Amazon:&lt;br /&gt;&lt;a href="http://www.amazon.com/Building-Web-2-0-Portal-ASP-NET/dp/0596510500"&gt;http://www.amazon.com/Building-Web-2-0-Portal-ASP-NET/dp/0596510500&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Disclaimer: This book does not show you how to build Pageflakes. Dropthings is entirely different in terms of architecture, implementation and the technologies involved.&lt;/p&gt; &lt;p&gt;You learn how to: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Implement a highly decoupled architecture following the popular n-tier, widget-based application model  &lt;/li&gt;&lt;li&gt;Provide drag-and-drop functionality, and use ASP.NET 3.5 to build the server-side part of the web layer  &lt;/li&gt;&lt;li&gt;Use LINQ to build the data access layer, and Windows Workflow Foundation to build the business layer as a collection of workflows  &lt;/li&gt;&lt;li&gt;Build client-side widgets using JavaScript for faster performance and better caching  &lt;/li&gt;&lt;li&gt;Get maximum performance out of the ASP.NET AJAX Framework for faster, more dynamic, and scalable sites  &lt;/li&gt;&lt;li&gt;Build a custom web service call handler to overcome shortcomings in ASP.NET AJAX 1.0 for asynchronous, transactional, cache-friendly web services  &lt;/li&gt;&lt;li&gt;Overcome JavaScript performance problems, and help the user interface load faster and be more responsive  &lt;/li&gt;&lt;li&gt;Solve various scalability and security problems as your site grows from hundreds to millions of users  &lt;/li&gt;&lt;li&gt;Deploy and run a high-volume production site while solving software, hardware, hosting, and Internet infrastructure problems &lt;/li&gt;&lt;/ul&gt;If you&amp;#39;re ready to build state-of-the art, high-volume web applications that can withstand millions of hits per day, this book has exactly what you need.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1461326" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/linq/default.aspx">linq</category><category domain="http://msmvps.com/blogs/omar/archive/tags/workflow/default.aspx">workflow</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Making best use of cache for high performance website</title><link>http://msmvps.com/blogs/omar/archive/2007/11/29/making-best-use-of-cache-for-high-performance-website.aspx</link><pubDate>Thu, 29 Nov 2007 16:21:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1369310</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=1369310</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/11/29/making-best-use-of-cache-for-high-performance-website.aspx#comments</comments><description>&lt;h5&gt;&lt;strong&gt;Use URLs &lt;/strong&gt;&lt;strong&gt;consistently&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Browsers cache content based on the URL. When URL changes, browser fetches a new version from origin server. URL can be changed by changing the query string parameters. For example, “/default.aspx” is cached on the browser. If you request “/default.aspx?123” it will fetch new content from server. Response from the new URL can also be cached in browser if you return proper caching headers. In that case, changing the query parameter to something else like “/default.aspx?456” will return new content from server. So, you need to make sure you use URL consistently everywhere when you want to get cached response. From homepage, if you have requested a file with URL “/welcome.gif”, make sure from another page you request the same file using the same URL. One common mistake is to sometimes omit the “www” subdomain from the url. &lt;a href="http://www.pageflakes.com/default.aspx"&gt;www.pageflakes.com/default.aspx&lt;/a&gt; is not same as &lt;a href="http://www.pageflakes.com/default.aspx"&gt;pageflakes.com/default.aspx&lt;/a&gt;. Both will be cached separately.  &lt;h5&gt;Cache static content for longer period&lt;/h5&gt; &lt;p&gt;Static files can be cached for longer period like one month. If you are thinking that you should cache for couple of days so that when you change the file, users will pick it up sooner, you’re mistaken. If you update a file which was cached by Expires header, new users will immediately get the new file while old users will see the old content until it expires on their browser. So, as long as you are using Expires header to cache static files, you should use as high value as possible.  &lt;p&gt;For example, if you have set expires header to cache a file for three days, one user will get the file today and store it in cache for next three days. Another user will get the file tomorrow and cache it for three days after tomorrow. If you change the file on the day after tomorrow, the first user will see it on fourth day and the second user will see it on fifth day. So, different users will see different versions of the file. As a result, it does not help setting a lower value assuming all users will pick up the latest file soon. You will have to change the url of the file in order to ensure everyone gets the exact same file immediately.  &lt;p&gt;You can setup Expires header from static files from IIS Manager. You’ll learn how to do it in later section.  &lt;h5&gt;&lt;strong&gt;Use cache friendly folder structure&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Store cached content under a common folder. For example, store all images of your site under the “/static” folder instead of storing images separately under different subfolders. This will help you use consistent URL throughout the site because from anywhere you can use “/static/images/somefile.gif”. Later on, we will learn it’s easier to move to a Content Delivery Network when you have static cacheable files under a common root folder.  &lt;h5&gt;&lt;strong&gt;Reuse common graphics files&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Sometimes we put common graphics files under several virtual directories so that we can write smaller paths. For example, say you have indicator.gif in root folder, some subfolders and under CSS folder. You did it because you need not worry about paths from different places and you could just use the file name as relative URL. This does not help in caching. Each copy of the file is cached in browser separately. So, you should collect all graphics files in the whole solution and put them under the same root “static” folder after eliminating duplicates and use the same URL from all the pages and CSS files.  &lt;h5&gt;&lt;strong&gt;Change file name when you want to expire cache&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;When you want a static file to be changed, don’t just update the file because it’s already cached in user’s browser. You need to change the file name and update all references everywhere so that browser downloads the new file. You can also store the file names in database or configuration files and use data binding to generate the URL dynamically. This way you can change the URL from one place and have the whole site receive the change immediately.  &lt;h5&gt;Use a version number while accessing static files&lt;/h5&gt; &lt;p&gt;If you do not want to clutter your static folder with multiple copies of the same file, you can use query string to differentiate versions of same file. For example, a GIF can be accessed with a dummy query string like “/static/images/indicator.gif?v=1”. When you change the indicator.gif, you can overwrite the same file and then update all references to the file to “/static/images/indicator.gif?v=2”. This way you can keep changing the same file again and again and just update the references to access the graphics using the new version number.  &lt;h5&gt;Store cacheable files in a different domain&lt;/h5&gt; &lt;p&gt;It’s always a good idea to put static contents in a different domain. First of all, browser can open another two concurrent connections to download the static files. Another benefit is that you don’t need to send the cookies to the static files. When you put the static files on the same domain as your web application, browser sends all the ASP.NET cookies and all other cookies that your web application is producing. This makes the request headers be unnecessarily large and waste bandwidth. You don’t need to send these cookies to access the static files. So, if you put the static files in a different domain, those cookies will not be sent. For example, put your static files in &lt;a href="http://www.staticcontent.com/"&gt;www.staticcontent.com&lt;/a&gt; domain while your website is running on &lt;a href="http://www.dropthings.com/"&gt;www.dropthings.com&lt;/a&gt;. The other domain does not need to be a completely different web site. It can just be an alias and share the same web application path.  &lt;h5&gt;&lt;strong&gt;SSL is not cached, so minimize SSL use&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Any content that is served over SSL is not cached. So, you need to put static content outside SSL. Moreover, you should try limiting SSL to only secure pages like Login page or Payment page. Rest of the site should be outside SSL over regular HTTP. SSL encrypts request and response and thus puts extra load on server. Encrypted content is also larger than the original content and thus takes more bandwidth.  &lt;h5&gt;HTTP POST requests are never cached&lt;/h5&gt; &lt;p&gt;Cache only happens for HTTP GET requests. HTTP POST requests are never cached. So, any kind of AJAX call you want to make cacheable, it needs to be HTTP GET enabled.  &lt;h5&gt;Generate Content-Length response header&lt;/h5&gt; &lt;p&gt;When you are dynamically serving content via web service calls or HTTP handlers, make sure you emit &lt;u&gt;Content-Length&lt;/u&gt; header. Browsers have several optimizations for downloading contents faster when it knows how many bytes to download from the response by looking at the &lt;u&gt;Content-Length&lt;/u&gt; header. Browsers can use persisted connections more effectively when this header is present. This saves browser from opening a new connection for each request. When there’s no Content-Length header, browser doesn’t know how many bytes it’s going to receive from the server and thus keeps the connection open as long as it gets bytes delivered from the server until the connection closes. So, you miss the benefit of Persisted Connections that can greatly reduce download time of several small files like css, javascripts, and images.  &lt;h4&gt;How to configure static content caching in IIS&lt;/h4&gt; &lt;p&gt;In IIS Manager, Web site properties dialog box has “HTTP Headers” tab where you can define Expires header for all requests that IIS handles. There you can define whether to expire content immediately or expire after certain number of days or on a specific date. The second option (Expire after) uses sliding expiration, not absolute expiration. This is very useful because it works per request. Whenever someone requests a static file, IIS will calculate the expiration date based on the number of days/months from the Expire after.  &lt;p&gt;&lt;a href="http://omar.mvps.org/images/Makingbestuseofcacheforbestsiteperforman_15143/clip_image001.gif"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="458" alt="clip_image001" src="http://omar.mvps.org/images/Makingbestuseofcacheforbestsiteperforman_15143/clip_image001_thumb.gif" width="472" border="0" /&gt;&lt;/a&gt;  &lt;p&gt;For dynamic pages that are served by ASP.NET, a handler can modify the expires header and override IIS default setting.  &lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1369310" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item><item><title>10 cool web development related articles in 2007</title><link>http://msmvps.com/blogs/omar/archive/2007/10/02/10-cool-web-development-related-articles-in-2007.aspx</link><pubDate>Tue, 02 Oct 2007 17:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1225686</guid><dc:creator>omar</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1225686</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/10/02/10-cool-web-development-related-articles-in-2007.aspx#comments</comments><description>&lt;p&gt;Here&amp;#39;s a list of 10 cool ASP.NET, AJAX and web development related articles and blog posts that I have written this year that you might want to take a look:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeproject.com/install/13disasters.asp"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeproject.com/install/13disasters.asp"&gt;13 disasters for production website and their solutions&lt;/a&gt; &lt;br /&gt;Talks about 13 production disasters that can happen to any website any time and bring down your business.&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.codeproject.com/Ajax/MakingGoogleIG.asp"&gt;Build Google IG like Ajax Start Page in 7 days using ASP.NET Ajax and .NET 3.0&lt;/a&gt; &lt;br /&gt;This block buster article shows how ASP.NET AJAX, Linq to XML, Linq to SQL and Workflow Foundation can be used to create a Google IG like start page in just 7 nights. Learn how to put together such hot technologies into one project and make a production site out of it.  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/04/29/serve-extensionless-url-from-asp-net-without-using-isapi-module-or-iis-6-wildcard-mapping.aspx"&gt;Serve extensionless URL from ASP.NET without using ISAPI module or IIS 6 Wildcard mapping&lt;/a&gt; &lt;br /&gt;Currently there are only two ways to service extentionless URL like &lt;a href="http://www.pageflakes.com/omar"&gt;www.pageflakes.com/omar&lt;/a&gt; that hits something besides the default document - use a custom ISAPI module or use IIS 6 wildcard mapping. Both has performance and scalability problems because both intercepts each and every hit. Learn how you can solve it by using a custom 404 handler.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/09/19/request-format-is-unrecognized-for-url-unexpectedly-ending-in-somewebservicemethod.aspx"&gt;Request format is unrecognized for URL unexpectedly ending in /SomeWebServiceMethod&lt;/a&gt; &lt;br /&gt;Since ASP.NET AJAX 1.0 release, Microsoft prevented JSON hijacking by adding a special content type header. But this caused us some trouble. &lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/03/25/cleanup-inactive-anonymous-users-from-asp-net-membership-tables.aspx"&gt;Cleanup inactive anonymous users from ASP.NET Membership Tables&lt;/a&gt; &lt;br /&gt;When you store anonymous user profile using ASP.NET Membership provider and Anonymous Identification provider, you soon end up with lots of idle anonymous user data where those users never come back. We (Pageflakes) went through a lot of difficulty keeping our database size down as we allow anonymous users to do almost everything that a registered user can do. This introduces scalability challenge. See how we solved this problem.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx"&gt;Prevent Denial of Service (DOS) attacks in your web application&lt;/a&gt; &lt;br /&gt;Web applications can be brought down to its knees by hitting the site repeatedly or by calling expensive webservices randomly. Anyone can write a simple loop that hits a webserver very frequently from a high bandwidth connectivity and bring your production server down. See how to prevent such application level DOS attacks.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/03/22/asp-net-ajax-extender-for-multi-column-widget-drag-drop.aspx"&gt;ASP.NET Ajax Extender for multi-column widget drag &amp;amp; drop&lt;/a&gt; &lt;br /&gt;It&amp;#39;s an ASP.NET AJAX extender that allows Pageflakes style drag &amp;amp; drop functionality between columns and rows. &lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/03/16/asp-net-ajax-in-depth-performance-analysis.aspx"&gt;ASP.NET Ajax in-depth performance analysis&lt;/a&gt; &lt;br /&gt;While building an open source start page using ASP.NET AJAX, I have done a lot of performance analysis on AJAX framework in order to improve first time load and perceived speed of javascript rich pages. Check out my analysis.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/01/20/think-you-know-how-to-write-update-statement-think-again.aspx"&gt;Think you know how to write UPDATE statement? Think again.&lt;/a&gt; &lt;br /&gt;Learn how to optimize common UPDATE statements&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/archive/2007/01/07/make-a-surveillance-application-which-captures-desktop-and-emails-you-as-attachment.aspx"&gt;Make a surveillance application which captures desktop and then emails you as attachment&lt;/a&gt; &lt;br /&gt;Some time back I needed to capture a certain computers desktop in order to find out what that user is doing every day. So, I made a .NET 2.0 Winforms Application which stays on system tray (optional) and capture the desktop in given time interval (say every 60 secs) and emailed the captured images to me as message attachment (say every 30 mins).&lt;/p&gt; &lt;hr /&gt;  &lt;p&gt;Today I received MVP award for the 3rd time on Visual C#. Thanks to Microsoft for the award and setting up my &lt;a href="http://weblogs.asp.net/omarzabir"&gt;new blog&lt;/a&gt;. I will continue both my &lt;a href="http://msmvps.com/omar"&gt;MVPS Blog&lt;/a&gt; and this blog from now on.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1225686" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/javascript/default.aspx">javascript</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category></item><item><title>A significant part of sql server process memory has been paged out. This may result in performance degradation</title><link>http://msmvps.com/blogs/omar/archive/2007/09/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx</link><pubDate>Wed, 19 Sep 2007 07:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1205524</guid><dc:creator>omar</dc:creator><slash:comments>31</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1205524</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/09/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx#comments</comments><description>&lt;p&gt;If you are using SQL Sever Server standard edition 64 bit on a Windows 2003 64bit, you will frequently encounter this problem where SQL Server says:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;A significant part of sql server process memory has been paged out. This may result in performance degradation. Duration 0 seconds. Working set (KB) 25432, committed (KB) 11296912, memory utilization 0%&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The number in working set and duration will vary. What happens here is SQL Server is forced to release memory to operating system because some other application or OS itself needs to allocate RAM.&lt;/p&gt; &lt;p&gt;We went through many support articles like:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/918483"&gt;918483&lt;/a&gt;: How to reduce paging of buffer pool memory in the 64-bit version of SQL Server 2005  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/905865/"&gt;905865&lt;/a&gt;: The sizes of the working sets of all the processes in a console session may be trimmed when you use Terminal Services to log on to or log off from a computer that is running Windows Server 2003  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/920739/"&gt;920739&lt;/a&gt;: You may experience a decrease in overall system performance when you are copying files that are larger than approximately 500 MB in Windows Server 2003 Service Pack 1 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;But nothing solved the problem. We still have the page out problem happening every day.&lt;/p&gt; &lt;p&gt;The server has 16 GB RAM where 12 GB is maximum limit allocated to SQL Server. 4 GB is left to OS and and other application. We have also turned off antivirus and any large backup job. 12 GB RAM should be plenty because there&amp;#39;s no other app running on the dedicated SQL Server box. But the page out still happens. When this happens, SQL Server becomes very slow. Queries timeout, website throws error, transactions abort. Sometimes this problems goes on for 30 to 40 minutes and website becomes slow/unresponsive during that time.&lt;/p&gt; &lt;p&gt;I have found what causes SQL Server to page out. File System cache somehow gets really high and forces SQL Server to trim down.&lt;/p&gt; &lt;p&gt;&lt;img height="663" alt="clip_image002" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image002.jpg" width="557" /&gt; &lt;/p&gt; &lt;p&gt;You see the System cache resident bytes are very high. During this time SQL Server gets much less RAM than it needs. Queries timeout at very high rate like 15 per sec. Moreover, there&amp;#39;s high SQL Lock Timeout/sec (around 15/sec not captured in screen shot).&lt;/p&gt; &lt;p&gt;&lt;img height="191" alt="clip_image004" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image004.jpg" width="549" /&gt; &lt;/p&gt; &lt;p&gt;SQL Server max memory is configured 12 GB. But here it shows it’s getting less than 8 GB.&lt;/p&gt; &lt;p&gt;While the file system cache is really high, there’s no process that’s taking significant RAM.&lt;/p&gt; &lt;p&gt;&lt;img height="648" alt="clip_image006" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image006.jpg" width="340" /&gt; &lt;/p&gt; &lt;p&gt;After I used SysInternal’s &lt;a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/CacheSet.mspx"&gt;CacheSet&lt;/a&gt; to reset file system cache and set around 500 MB as max limit, memory started to free up.&lt;/p&gt; &lt;p&gt;&lt;img height="285" alt="clip_image008" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image008.jpg" width="557" /&gt; &lt;/p&gt; &lt;p&gt;SQL Server started to see more RAM free:&lt;/p&gt; &lt;p&gt;&lt;img height="92" alt="clip_image010" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image010.jpg" width="564" /&gt; &lt;/p&gt; &lt;p&gt;Then I hit the “Clear” button to clear file system cache and it came down dramatically.&lt;/p&gt; &lt;p&gt;&lt;img height="668" alt="clip_image012" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image012.jpg" width="553" /&gt; &lt;/p&gt; &lt;p&gt;Paging stopped. System cache was around 175 MB only. SQL Server lock timeout came back to zero. Everything went back to normal.&lt;/p&gt; &lt;p&gt;So, I believe there&amp;#39;s either some faulty driver or the OS itself is leaking file system cache in 64bit environment.&lt;/p&gt; &lt;p&gt;What we have done is, we have a dedicated person who goes to production database servers every hour, runs the CacheSet program and clicks &amp;quot;Clear&amp;quot; button. This clears the file system cache and prevents it from growing too high.&lt;/p&gt; &lt;p&gt;There are lots of articles written about this problem. However, the most informative one I have found is from the SQL Server PSS team:&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx" href="http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx"&gt;http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;UPDATE - THE FINAL SOLUTION!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The final solution is to run this program on Windows Startup:&lt;/p&gt; &lt;p&gt;SetSystemFileCacheSize 128 256&lt;/p&gt; &lt;p&gt;This sets the lower and higher limit for the System Cache. You need to run this on every windows startup because a restart will undo the cache setting to unlimited.&lt;/p&gt; &lt;p&gt;You can run the program without any parameter to see what is the current setting.&lt;/p&gt; &lt;p&gt;Download the program from this page:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.uwe-sieber.de/ntcacheset_e.html" href="http://www.uwe-sieber.de/ntcacheset_e.html"&gt;http://www.uwe-sieber.de/ntcacheset_e.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Go to the end and you will get the link to the SetSystemFileCacheSize.zip&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1205524" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/optimize/default.aspx">optimize</category></item><item><title>What to do when you kill your database with your own hand</title><link>http://msmvps.com/blogs/omar/archive/2007/01/01/what-to-do-when-you-kill-your-database-with-your-own-hand.aspx</link><pubDate>Mon, 01 Jan 2007 11:21:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:462837</guid><dc:creator>omar</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=462837</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/01/01/what-to-do-when-you-kill-your-database-with-your-own-hand.aspx#comments</comments><description>&lt;p&gt;Couple of months ago, we had an interesting day. It was a bright
summer morning. We were all in the office doing our regular work.
Developers writing codes, QA testing the site. We&amp;nbsp;were
all&amp;nbsp;happy and smiling as there was no major bug. Some were
drinking coffee and having nice chit chat. Our honorable Sys Admin
came to office as usual late after noon. We all welcomed him
remembering his day and night inhuman effort to keep our systems up
and running fighting against germs and bacteria. As usual he
started his day logging into servers one by one checking their
health. He connected to our maintenance server via Remote Desktop.
Did some routine check up and found that there was no space on hard
drive. So, he decided to delete the database on the maintenance
server as it was quite old. He started SQL Server Management
Studio, entered sa and password, selected the database, pressed
delete. As his habit, on the confirmation dialog he pressed enter
without looking into it. Things went cool, database got deleted.
But strangely the maintenance server did not free up any hard drive
space.&lt;/p&gt;
&lt;p&gt;In the meantime, there were sharp screams from other rooms. We
all ran to see whether somebody fell down or had an electric shock
or not. Seemed like every one was intact. But with horror, we
looked into all the screens on our desktops and saw this:&lt;/p&gt;
&lt;p&gt;
&lt;img height="194" src="http://omar.mvps.org/images/Whattodowhenyoukillyourdatabasewithyouro_F42D/image01.png" width="451" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;This is our error handler page where users are redirected when
there&amp;#39;s any unknown catastrophic failure. This page appears when
something goes wrong, really wrong. We&amp;nbsp;do this by having the
&amp;lt;customErrors&amp;gt; block in web.config:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:024f8869-47ab-4dc3-acd0-6eaf3f4374c0" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;

&lt;pre style="background-color:White;"&gt;&lt;/pre&gt;
&lt;div&gt;

&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="color:#800000;"&gt;customErrors&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;mode&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;RemoteOnly&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;defaultRedirect&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;GenericErrorPage.html&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;error&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;statusCode&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;403&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;redirect&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;403.html&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;error&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;statusCode&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;404&amp;quot;&lt;/span&gt; 
&lt;span style="color:#FF0000;"&gt;redirect&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;=&amp;quot;404.html&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;customErrors&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If somebody fell down or had electric shock, we would not mind
at all but this is generally beginning of a nightmare for
us.&amp;nbsp;Then we saw our Sys Admin was shaking and his face turned
white out of blood. He somehow stood up trembling with fear and
came to me and said, &amp;quot;My blood pressure is going sky high. I think
I have deleted production database&amp;quot;.&lt;/p&gt;
&lt;p&gt;I told him, &amp;quot;no worries, I have done this before&amp;quot;, of course on
the outside. Let&amp;#39;s not say what I felt inside. So, we first looked
into Recycle Bin. Nope, no trace. It was&amp;nbsp;a 30 GB file. There&amp;#39;s
no way Windows is going to store it on Recycle Bin. Then we
searched for several undelete utilities both commercial ones and
free ones. All failed on regular attempt. Some showed an advanced
recovery can restore the file but it will take 2 hours of scanning.
This will be disastrous if we go down for 2 hours. But we had no
choice. Last backup we took was the previous day. If we restore it,
we are going to lose thousands of users and their page setup. We
will also lose hundreds of signups. So, we went for the 2 hours
scan. After 2 hours, the scan reported it found the MDF file. But
when we said recover it, it recovered a 0 byte file. We tried
another product, same result. In the meantime 4 hours past by. So,
we had to take a decision. We has no other choice but to restore
the previous day&amp;#39;s backup. So, we did, and the site went live.&lt;/p&gt;
&lt;p&gt;Now it was time to find out all those poor souls who lost their
data. We maintain a log file where we record all important
activities like adding new page, registering, first visit etc. It
was a tab delimited file like this:&lt;/p&gt;
&lt;p&gt;01.01.2007 08:39:35 e5ca904c-0348-42cf-9d1b-6fb932ec930d Create
Anonymous user if necessary 0,25
&lt;br /&gt;01.01.2007 08:39:36 e5ca904c-0348-42cf-9d1b-6fb932ec930d Get
Page: __RSSFEED__ 0,109375
&lt;br /&gt;01.01.2007 08:39:36 e5ca904c-0348-42cf-9d1b-6fb932ec930d Load
Modules in page #1413882 0,1875
&lt;br /&gt;01.01.2007 08:39:36 e5ca904c-0348-42cf-9d1b-6fb932ec930d
GetPageflake 0,546875&lt;/p&gt;
&lt;p&gt;It logs date and time of each action and also the duration of
the process. This log helps us identify slow running operations and
we can see almost in real time what&amp;#39;s going on with the site.&lt;/p&gt;
&lt;p&gt;After importing this log into database, we ran a query to find
out user name of all users who signed up since database delete.
Here, we discovered something interesting. We were expecting the
date and time will be in server&amp;#39;s own time. But Enterprise Library
logs are always in GMT. So, we had to figure out what is the time
difference from regional settings of the servers. Then we
subsctracted it to match GMT. Then we calculated when the database
was deleted and started finding the users after that. We got a list
of email addresses whose signup was lost, almost around 400. We
were lucky it happened on a weekend, so there was not much signup
that day. Then we sent that email list to our marketing team and
they sent apology letters to those users.&lt;/p&gt;
&lt;p&gt;So, what we did wrong which you should make sure you never
do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sys Admin became too comfortable with the servers. There was
lack of seriousness while working on remote desktop. It became
routine monotonous absent minded work to him. This is a real
problem with sys admins. On first month, you will see him very
serious about his role. Everytime he logs into remote desktop on
production or maintenance servers, there&amp;#39;s a considerable amount of
curves on his forehead. But day by day, it reduces and he starts
working on production server as if&amp;nbsp;he is working on his own
laptop. At some point, someone needs to make him realize what is
the gravity of his actions. He should wash his hands before sitting
in front of remote desktop (or perform wudhu if he is muslim) and
then say his prayer: &amp;quot;O Lord! I am going to work on remote desktop.
Grant me tranquility and absolute concentration and protect me from
the devil who whispers in my soul foul words and lures me to cause
great harm to production servers&amp;quot;&lt;/li&gt;
&lt;li&gt;All databases had the same &amp;quot;sa&amp;quot; password. If we had different
password, at least while typing the password, sys admin could
realize where he is connecting to. Although he did connect to
remote desktop on maintenance server, but from SQL Server
Management Studio, he connected to primary database server as he
did last time. SQL Server Management Studio remembered the last
machine name and user name. So, all he did was enter password and
hit enter and delete the database. Now we have put the server name
inside the password. So, while typing the password, we know
conciously which server we are going to connect.&lt;/li&gt;
&lt;li&gt;Don&amp;#39;t ignore confirmation dialogs on remote desktops as you do
on your local machine. Nowadays, we consider ourselves super expert
on everything and never read the confirmation dialog. I myself
don&amp;#39;t remember when was the last time I read any confirmation
dialog seriously. Definitely this attitude must change while
working on servers. When Sys Admin tried to delete the database,
there was a confirmation that there are active connections on the
database. SQL Server tried its best to inform him that this is a
database being used and don&amp;#39;t delete it, please. But as he does
hundred times per day on his laptop, clicked OK without reading the
confirmation dialog.&lt;/li&gt;
&lt;li&gt;Don&amp;#39;t put same administrator password on all servers. This
makes life easier while copying files from one server to another,
but don&amp;#39;t do it. You will accidentally delete file on another
server just like we do.&lt;/li&gt;
&lt;li&gt;DO NOT use Administrator user account to do your day to day
work. We started using a Power User account for our day to day
operation which has limited access on couple of folders only. Using
Administrator account on remote desktop means you are opening doors
to all possible accidents to happen. If you use a restricted
account, there&amp;#39;s no possibility of such&amp;nbsp;accidents.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Always have someone beside you when you work on production
server and do something important like cleaning up free space or
running scripts, restoring database etc.&amp;nbsp;Make sure the other
person is&amp;nbsp;not sleeping on his chair beside you.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://msmvps.com/aggbug.aspx?PostID=462837" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item><item><title>How to setup SQL Server 2005 Transaction Log Ship on large database that really works</title><link>http://msmvps.com/blogs/omar/archive/2006/09/15/How-to-setup-SQL-Server-2005-Transaction-Log-Ship-on-large-database-that-really-works.aspx</link><pubDate>Fri, 15 Sep 2006 10:01:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:128439</guid><dc:creator>omar</dc:creator><slash:comments>38</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=128439</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/09/15/How-to-setup-SQL-Server-2005-Transaction-Log-Ship-on-large-database-that-really-works.aspx#comments</comments><description>&lt;p&gt;I tried a lot of combinations in my life in order to find out an
effective method for implementing Transaction Log Shipping between
servers which are in a workgroup, not under domain. I realized the
things you learn from article and books are for small and medium
sized databases. When you database become 10 GB or bigger, thing&amp;#39;s
become a lot harder than it looks. Additionally many things changed
in SQL Server 2005. So, it&amp;#39;s even more difficult to configure log
shipping properly nowadays.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the steps that I finally found that works. Let&amp;#39;s assume
there are 2 servers with SQL Server 2005. Make sure both servers
have latest SP. There&amp;#39;s Service Pack 1 released already.&lt;/p&gt;
&lt;p&gt;1. Create a new user Account named &amp;quot;SyncAccount&amp;quot; on both
computers. Use the exact same user name and password.&lt;/p&gt;
&lt;p&gt;2. Make sure File Sharing is enabled on the local area
connection between the server. Also enable file sharing in
Firewall.&lt;/p&gt;
&lt;p&gt;3. Make sure the local network connection is not regular LAN. It
must be a gigabit card with near zero data corruption. Both cable
and switch needs to be perfect. If possible, connect both servers
using Fibre optic cable directly on the NIC in order to avoid a
separate Switch.&lt;/p&gt;
&lt;p&gt;4. Now create a folder named &amp;quot;TranLogs&amp;quot; on both servers. Let&amp;#39;s
assume the folder is on E:\Tranlogs.&lt;/p&gt;
&lt;p&gt;5. On Primary Database server, share the folder &amp;quot;Tranlogs&amp;quot; and
allow SyncAccount &amp;quot;Full Access&amp;quot; to it. Then allow SyncAccount
FullAccess on TranLogs folder. So you are setting the same
permission from both &amp;quot;Sharing&amp;quot; tab and from &amp;quot;Security&amp;quot; tab.&lt;/p&gt;
&lt;p&gt;6. On Secondary database server, allow SyncAccount &amp;quot;Full Access&amp;quot;
right on TranLogs folder. No need to share it.&lt;/p&gt;
&lt;p&gt;7. Test whether SyncAccount can really connect between the
servers. On Secondary Server, go to Command Prompt and do this:&lt;/p&gt;
&lt;p&gt;8. 
&lt;img height="283" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0018.png" width="580" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;9. Now you have a command prompt which is running with
SyncAccount privilege. Let&amp;#39;s confirm the account can read and write
on &amp;quot;TranLog&amp;quot; shares on both servers.&lt;/p&gt;
&lt;p&gt;10. 
&lt;img height="113" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0026.png" width="580" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;11. This is exactly what SQL Agent will be doing during log
ship. It will copy log files from primary server&amp;#39;s network share to
it&amp;#39;s own log file folder. So, the SyncAccount needs to be able to
both read files from primary server&amp;#39;s network share and write onto
its own tranlogs folder. The above test verifies the result.&lt;/p&gt;
&lt;p&gt;12. This is something new in SQL Server 2005: Add SyncAccount in
SQLServer Agent group &amp;quot;SqlServer2005SqlAgentUser$....&amp;quot;. You will
find this Windows User Group after installing SQL Server 2005.&lt;/p&gt;
&lt;p&gt;13. Now go to Control Panel-&amp;gt;Administrative
Tools-&amp;gt;Services and find the SQL Server Agent service. Go to its
properties and set SyncAccount as the account on the Logon tab.
Restart the service. Do this on both servers.&lt;/p&gt;
&lt;p&gt;14. 
&lt;img height="384" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0046.jpg" width="336" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;15. I use sa account to configure the log shipping. So, do this
on both servers:&lt;/p&gt;
&lt;p&gt;a. Enable &amp;quot;sa&amp;quot; account. By default, sa is disabled in SQL Server
2005.&lt;/p&gt;
&lt;p&gt;b. On &amp;quot;sa&amp;quot; account turn off Password Expiration Policy. This
prevents sa password from expiring automatically.&lt;/p&gt;
&lt;p&gt;16. On Secondary server, you need to allow remote connections.
By default, SQL Server 2005 disables TCP/IP connection. As a
result, you cannot login to the server from another server. Launch
the Surface Area Configuration tool from Start-&amp;gt;Programs-&amp;gt;MS
SQL Server 2005 and go to &amp;quot;Remote Connection&amp;quot; section. Choose the
3rd option which allows both TCP/IP based remote connection and
local named pipe based connections.&lt;/p&gt;
&lt;p&gt;17. On Secondary Server firewall, open port 1433 so that primary
server can connect to it.&lt;/p&gt;
&lt;p&gt;18. Restart SQL Server. Yes, you need to restart SQL Server.&lt;/p&gt;
&lt;p&gt;18. On Primary server, go to Database properties-&amp;gt;Options and
set Recovery Model to &amp;quot;Full&amp;quot;. If it was already set to full before,
it will be wise to first set it to Simple, then shrink the
transaction log file and then make it &amp;quot;Full&amp;quot; again. This will
truncate the transaction log file for sure.&lt;/p&gt;
&lt;p&gt;
&lt;img height="384" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0056.png" width="428" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;19. Now take a Full Backup of the database. During backup, make
sure you put the backup file on a physically separate hard drive
than the drive where MDF is located. Remember, not different
logical drives, different physical drives. So, you should have at
least 2 hard drives on the server. During backup, SQL Server reads
from MDF and writes on the backup file. So, if both MDF and the
backup is done on the same hard drive, it&amp;#39;s going to take more than
double the time to backup the database. 
&lt;b&gt;It will also keep the Disk fully occupied and server will become
very slow.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0066.png" width="433" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;20. After backup done, RAR the database. This ensures when you
copy the database to the other server there&amp;#39;s no data corruption
while the file was being transferred. If you fail to unRAR the file
on the secondary server, you get assurance that there&amp;#39;s some
problem on the network and you must replace network infrastructure.
The RAR also should be done on a separate hard drive than the one
where the RAR is located. Same reason, read is on one drive and
write is on another drive. Better if you can directly RAR to the
destination server using network share. It has two benefits:&lt;/p&gt;
&lt;p&gt;a. Your server&amp;#39;s IO is saved. There&amp;#39;s no write, only read.&lt;/p&gt;
&lt;p&gt;b. Both RAR and network copy is done in one step.&lt;/p&gt;
&lt;p&gt;21. 
&lt;img height="266" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0076.png" width="283" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;22. By the time you are done with the backup, RAR, copy over
network, restore on the other server, the Transaction Log file
(LDF) on the primary database server might become very big. For us,
it becomes around 2 to 3 GB. So, we have to manually take a
transaction log backup and ship to the secondary server before we
configure Transaction Log Shipping.&lt;/p&gt;
&lt;p&gt;23. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0086.png" width="432" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;24. When you are done with copying the transaction log backup to
the second server, first restore the Full Backup on the secondary
server:&lt;/p&gt;
&lt;p&gt;25. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0096.png" width="432" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;26. But before restoring, go to Options tab and choose RESTORE
WITH STANDBY:&lt;/p&gt;
&lt;p&gt;27. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0106.png" width="433" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;28. When the full backup is restored, restore the transaction
log backup.&lt;/p&gt;
&lt;p&gt;
&lt;img height="393" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0126.jpg" width="436" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;29. 
&lt;b&gt;REMEMBER: go to options tab and set the Recovery State to
&amp;quot;RESTORE WITH STANDBY&amp;quot; before you hit the OK button.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;30. This generally takes a long time. Too long in fact. Every
time I do the manual full backup, rar, copy, unrar, restore, the
Transaction Log (LDF) file becomes 2 to 3 GB. As a result, it takes
a long time to do a transaction log backup, copy and restore and it
takes more than an hour to restore it. So, within this time, the
log file on the primary server again becomes large. As a result,
when log shipping starts, the first log ship is huge. So, you need
to plan this carefully and do it only when you have least amount of
traffic.&lt;/p&gt;
&lt;p&gt;31. I usually have to do this manual Transaction Log backup
twice. First one is around 3 GB. Second one is around 500 MB.&lt;/p&gt;
&lt;p&gt;32. Now you have a database on the secondary server ready to be
configured for Log shipping.&lt;/p&gt;
&lt;p&gt;33. Go to Primary Server, select the Database, right click
&amp;quot;Tasks&amp;quot; -&amp;gt; &amp;quot;Shrik&amp;quot;. Shrink the Log File.&lt;/p&gt;
&lt;p&gt;34. Go to Primary server, bring on Database options, go to
Transaction Log option and enable log shipping.&lt;/p&gt;
&lt;p&gt;35. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0136.png" width="432" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;36. Now configure the backup settings line this:&lt;/p&gt;
&lt;p&gt;37. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0146.png" width="416" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;38. Remember, the first path is the network path that we tested
from command prompt on the secondary server. The second path is the
local hard drive folder on the primary server which is shared and
accessible from the network path.&lt;/p&gt;
&lt;p&gt;39. Add a secondary server. This is the server where you have
restored the database backup&lt;/p&gt;
&lt;p&gt;40. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0156.png" width="433" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;41. Choose &amp;quot;No, the secondary database is initialized&amp;quot; because
we have already restored the database.&lt;/p&gt;
&lt;p&gt;42. Go to second tab &amp;quot;Copy Files&amp;quot; and enter the path on the
secondary server where log files will be copied to. Note: The
secondary server will fetch the log files from the primary server
network share to it&amp;#39;s local folder. So, the path you specify is on
the secondary server. Do not get confused from the picture below
that&amp;#39;s it&amp;#39;s the same path as primary server. I just have same
folder configuration on all servers. It can be D:\tranlogs if you
have the tranlogs folder on D: drive on secondary server.&lt;/p&gt;
&lt;p&gt;43. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0166.png" width="434" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;44. On third tab, &amp;quot;Restore Transaction Log&amp;quot; configure it as
following:&lt;/p&gt;
&lt;p&gt;45. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0176.png" width="433" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;46. It is very important to choose &amp;quot;Disconnect users in
database&amp;hellip;&amp;quot;. If you don&amp;#39;t do this and by any chance
Management Studio is open on the database on secondary server, log
shipping will keep on failing. So, force disconnect of all users
when database backup is being restored.&lt;/p&gt;
&lt;p&gt;47. Setup a Monitor Server which will automatically take care of
making secondary server the primary server when your primary server
will crash.&lt;/p&gt;
&lt;p&gt;48. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0186.png" width="412" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;49. In the end, the transaction log shipping configuration
window should look like this:&lt;/p&gt;
&lt;p&gt;50. 
&lt;img height="388" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0196.png" width="432" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;51. When you press OK, you will see this:&lt;/p&gt;
&lt;p&gt;
&lt;img height="188" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0216.jpg" width="389" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;52. Do not be happy at all if you see everything shows
&amp;quot;Success&amp;quot;. Even if you did all the paths, and settings wrong, you
will still see it as successful. Login to the secondary server, go
to SQL Agents-&amp;gt;Jobs and find the Log Ship restore job. If the
job is not there, your configuration was wrong. If it&amp;#39;s there,
right click and select &amp;quot;View History&amp;quot;. Wait for 15 mins to have one
log ship done. Then refresh and see the list. If you see all OK,
then it is really ok. If not, then there are two possibilities:&lt;/p&gt;
&lt;p&gt;a. See if the Log Ship Copy job failed or not. If it fails, then
you entered incorrect path. There can be one of the following
problem:&lt;/p&gt;
&lt;div style="margin-left:4em;"&gt;
&lt;ol&gt;
&lt;li&gt;The network location on primary server is wrong&lt;/li&gt;
&lt;li&gt;The local folder was specified wrong&lt;/li&gt;
&lt;li&gt;You did not set SyncAccount as the account which runs SQL Agent
or you did but forgot to restart the service.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;b. If restore fails, then the problems can be one of the
following:&lt;/p&gt;
&lt;p&gt;i. SyncAccount is not a valid login in SQL Server. From SQL
Server Management Studio, add SyncAccount as a user.&lt;/p&gt;
&lt;p&gt;ii. You forgot to restore the database on secondary server as
Standby.&lt;/p&gt;
&lt;p&gt;iii. You probably took some manual transaction log backup on the
primary server in the meantime. As a result, the backup that log
shipping took was not the right sequence.&lt;/p&gt;
&lt;p&gt;53. If everything&amp;#39;s ok, you will see this:&lt;/p&gt;
&lt;p&gt;
&lt;img height="365" src="http://omar.mvps.org/images/HowtosetupSQLServer2005TransactionLogShi_E0B5/clip_image0236.jpg" width="418" alt="" /&gt;
&lt;/p&gt;
&lt;img src="http://msmvps.com/aggbug.aspx?PostID=128439" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item><item><title>Cost effective, failsafe, 2 server load balanced web &amp;amp; DB servers</title><link>http://msmvps.com/blogs/omar/archive/2006/08/28/cost-effective-failsafe-2-server-load-balanced-web-amp-amp-db-servers.aspx</link><pubDate>Mon, 28 Aug 2006 06:53:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:110586</guid><dc:creator>omar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=110586</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/28/cost-effective-failsafe-2-server-load-balanced-web-amp-amp-db-servers.aspx#comments</comments><description>&lt;p&gt;We were very poor when we first started 
&lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt; so we needed a
really cheap but fully reliable deployment configuration. The
requirement was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fail safe. If a server goes down, another one can take over
without users noticing&lt;/li&gt;
&lt;li&gt;Database must be mirrored in multiple servers&lt;/li&gt;
&lt;li&gt;Web servers will be in Load Balanced mode so that incase one
goes down, the other takes over immediately&lt;/li&gt;
&lt;li&gt;Do it with least hardware and cost&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, we thought a lot and could not make a reliable solution
without at least three servers. Then we found one with two servers
only. Here&amp;#39;s the plan:&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://omar.mvps.org/images/Costeffectivefailsafe2serverloadbalanced_B548/clip_image00117.png"&gt;
&lt;img height="600" src="http://omar.mvps.org/images/Costeffectivefailsafe2serverloadbalanced_B548/clip_image0011_thumb2.png" width="800" alt="" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We made the above plan for our hosting service provider.&lt;/p&gt;
&lt;p&gt;We have 2 windows server both with IIS 6.0 and SQL Server 2005.
Let&amp;#39;s call these servers Web server and DB server.&lt;/p&gt;
&lt;p&gt;Web server gets 60% web traffic configured via Network Load
Balancing. We used Windows Network Load Balancing in order to save
the cost of buying a separate Load balancer. We also used Windows
Firewall instead of external firewall. You can imagine how poor we
were. DB Server gets 40% web traffic and hosts the database in its
SQL Server 2005. We started with SQL Server 2005 Workgroup Edition
because it was the only version we could afford. So, we could not
use the new DB Mirroring feature instead we had to use Log
Shipping. The web server also had SQL Server 2005 but it was used
for a standby database so we did not have to pay for licensing fee.

&lt;strong&gt;Remember: You do not need to pay for SQL server license if
the server is hosting standby databases only.&lt;/strong&gt; The DB
Server also runs the web site in its IIS.&lt;/p&gt;
&lt;p&gt;So, we have 2 servers running the website in NLB. So, web server
is properly load balanced and failsafe. Then we have database on
the DB Server which is log shipped to the web server. So, incase DB
server goes down, we can divert all traffic to the web server and
bring up web server&amp;#39;s standby database in order to run the site
solely from web server. When DB server comes back online, we
configure log shipping the opposite way and divert most of the
traffic to the DB server. Thus DB server becomes the web server and
previously web server becomes the DB server. It requires some
manual work and not fully automated. But the cheapest solution for
a reliable configuration.&lt;/p&gt;
&lt;p&gt;So when you add more servers in future, it&amp;#39;s very easy to add
new ones.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://omar.mvps.org/images/Costeffectivefailsafe2serverloadbalanced_B548/clip_image00216.png"&gt;
&lt;img height="600" src="http://omar.mvps.org/images/Costeffectivefailsafe2serverloadbalanced_B548/clip_image0021_thumb1.png" width="800" alt="" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;img src="http://msmvps.com/aggbug.aspx?PostID=110586" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category></item></channel></rss>