<?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>Paulo Morgado : ASP.NET</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx</link><description>Tags: ASP.NET</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>PowerShell For The .NET Developer</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/09/18/powershell-for-the-net-developer.aspx</link><pubDate>Fri, 18 Sep 2009 00:03:12 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1724580</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1724580</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1724580</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/09/18/powershell-for-the-net-developer.aspx#comments</comments><description>&lt;p align="justify"&gt;Some time ago I needed to have the &lt;strong&gt;validationKey&lt;/strong&gt; of the &lt;a title="machineKey Element (ASP.NET Settings Schema)" href="http://msdn.microsoft.com/library/w8h3skw9.aspx" target="_blank"&gt;machineKey element&lt;/a&gt; of an &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; application changed and found out that ASP.NET doesn’t provide a command-line tool (or any other) to do this.&lt;/p&gt;  &lt;p align="justify"&gt;Looking around I found several applications and code samples to do it, but to have a system administrator do this I needed to test and document the application and it was to much work for such task.&lt;/p&gt;  &lt;p align="justify"&gt;I’ve always been a supporter of the idea of &lt;a title="Windows PowerShell" href="http://www.microsoft.com/powershell" target="_blank"&gt;PowerShell&lt;/a&gt; but I never used it my self. Just because I almost always have &lt;a title="Microsoft Visual Studio" href="http://cli.gs/vstudio" target="_blank"&gt;Visual Studio&lt;/a&gt; open and writing a simple console application is quicker and easier than learning PowerShell.&lt;/p&gt;  &lt;p align="justify"&gt;This time I decide that I would do a PowerShell script instead.&lt;/p&gt;  &lt;p align="justify"&gt;In &lt;a title="Microsoft Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; I would have done something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Program
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private static string &lt;/span&gt;GenerateKey()
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;buff = &lt;span style="color:blue;"&gt;new byte&lt;/span&gt;[64];
        (&lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Security.Cryptography.&lt;span style="color:#2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;()).GetBytes(buff);
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;sb = &lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Text.&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
        &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;b &lt;span style="color:blue;"&gt;in &lt;/span&gt;buff)
        {
            sb.AppendFormat(&lt;span style="color:#a31515;"&gt;&amp;quot;{0:X2}&amp;quot;&lt;/span&gt;, b);
        }
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;sb.ToString();
    }

    &lt;span style="color:blue;"&gt;private static void &lt;/span&gt;Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;path = args[0];
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;config = System.Web.Configuration.&lt;span style="color:#2b91af;"&gt;WebConfigurationManager&lt;/span&gt;.OpenMachineConfiguration(path);
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;systemWeb = config.GetSectionGroup(&lt;span style="color:#a31515;"&gt;&amp;quot;system.web&amp;quot;&lt;/span&gt;) &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.Configuration.&lt;span style="color:#2b91af;"&gt;SystemWebSectionGroup&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;machineKey = systemWeb.MachineKey;
        machineKey.ValidationKey = GenerateKey();
        config.Save(System.Configuration.&lt;span style="color:#2b91af;"&gt;ConfigurationSaveMode&lt;/span&gt;.Modified);
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;How would it be in PowerShell? As simple as this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;function GenerateKey
&lt;/span&gt;&lt;span style="color:black;"&gt;{
    [&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Byte&lt;/span&gt;&lt;span style="color:black;"&gt;[]]&lt;/span&gt;&lt;span style="color:purple;"&gt;$buff &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;0..63
    (&lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;new-object &lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Security.Cryptography.RNGCryptoServiceProvider&lt;/span&gt;&lt;span style="color:black;"&gt;).&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetBytes&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;)
    &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;new-object &lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Text.StringBuilder&lt;/span&gt;&lt;span style="color:black;"&gt;(128)
    &lt;/span&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;0&lt;/span&gt;&lt;span style="color:blue;"&gt;; &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$i &lt;/span&gt;&lt;span style="color:red;"&gt;-lt &lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Length&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:blue;"&gt;; &lt;/span&gt;&lt;span style="color:purple;"&gt;$i&lt;/span&gt;&lt;span style="color:red;"&gt;++&lt;/span&gt;&lt;span style="color:black;"&gt;)
    {
        &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;AppendFormat&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;{0:X2}&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:purple;"&gt;$i&lt;/span&gt;&lt;span style="color:black;"&gt;])
    }
    &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;ToString&lt;/span&gt;&lt;span style="color:black;"&gt;()
}

[&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Reflection.Assembly&lt;/span&gt;&lt;span style="color:black;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;LoadWithPartialName&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;System.Web&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)
&lt;/span&gt;&lt;span style="color:purple;"&gt;$config &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Web.Configuration.WebConfigurationManager&lt;/span&gt;&lt;span style="color:black;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;OpenWebConfiguration&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)
&lt;/span&gt;&lt;span style="color:purple;"&gt;$systemWeb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$config&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetSectionGroup&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;system.web&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:blue;"&gt;;
&lt;/span&gt;&lt;span style="color:purple;"&gt;$machineKey &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$systemWeb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;MachineKey
&lt;/span&gt;&lt;span style="color:purple;"&gt;$machineKey&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;ValidationKey&lt;/span&gt;&lt;span style="color:red;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;GenerateKey
&lt;/span&gt;&lt;span style="color:purple;"&gt;$config&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;save&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;Modified&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Wonder how I got from no knowledge of PowerShell to this? Simple. Something that every real &lt;a title="Microsoft .NET Framework" href="https://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; developer has and loves: &lt;a title=".NET Reflector" href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;.NET Reflector&lt;/a&gt; (with a &lt;a title="PowerShellLanguage" href="http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=PowerShellLanguage" target="_blank"&gt;PowerShell add-in&lt;/a&gt;, of course).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1724580" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Reflector/default.aspx">Reflector</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>ReMIX 09 Is Coming To Lisbon, Portugal</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/09/09/remix-09-is-coming-to-lisbon-portugal.aspx</link><pubDate>Wed, 09 Sep 2009 18:50:28 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1722131</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1722131</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1722131</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/09/09/remix-09-is-coming-to-lisbon-portugal.aspx#comments</comments><description>&lt;p&gt;&lt;a title="ReMIX 09 Portugal" href="http://www.microsoft.com/portugal/remix/index.aspx" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ReMIX 09" border="0" alt="ReMIX 09" align="left" src="https://www.microsoft.com/portugal/remix/res/img/remix_logo.gif" width="134" height="61" /&gt;&lt;/a&gt;For the first time, &lt;a title="MIX Online" href="http://www.visitmix.com/" target="_blank"&gt;ReMIX&lt;/a&gt; is coming to &lt;a title="Portugal" href="http://wikipedia.org/wiki/Portugal" target="_blank"&gt;Portugal&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The event will have a keynote and 3 tracks (Web Developer, UX and Architect) with 4 sessions each by the best speakers in each field.&lt;/p&gt;  &lt;p&gt;Don’t miss it! &lt;a title="ReMIX 09 Portugal" href="http://www.microsoft.com/portugal/remix/index.aspx" target="_blank"&gt;Register&lt;/a&gt; now!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722131" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Events/default.aspx">Events</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Mix/default.aspx">Mix</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Mix09/default.aspx">Mix09</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression+Blend/default.aspx">Expression Blend</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression/default.aspx">Expression</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression+Studio/default.aspx">Expression Studio</category></item><item><title>Typemock Is Launching The ASP.NET Bundle – Get Free Licenses</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/typemock-is-launching-the-asp-net-bundle-get-free-licenses.aspx</link><pubDate>Mon, 18 May 2009 22:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692642</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1692642</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1692642</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/typemock-is-launching-the-asp-net-bundle-get-free-licenses.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;a title="Typemock - Simplify Unit Testing!" href="http://cli.gs/Typemock" target="_blank"&gt;Typemock&lt;/a&gt; is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch they are giving out &lt;strong&gt;FREE licenses&lt;/strong&gt; to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both Typemock &lt;a title="Typemock Isolator" href="http://cli.gs/TypemockIsolator" target="_blank"&gt;Isolator&lt;/a&gt; and &lt;a title="Ivonna - ASP.NET Unit Testing Tool" href="http://cli.gs/Ivonna" target="_blank"&gt;Ivonna&lt;/a&gt;, the ASP.NET Isolator add-on, for a discounted price.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;ASP.NET Bundle launch giveaway:&lt;/strong&gt; &lt;br /&gt;For the ASP.NET Bundle launch Typemock are giving away free licenses to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;How do I get the free license?&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Are you a blogger, webmaster, or internet columnist? Get your free license by helping&amp;nbsp;Typemock launch&amp;nbsp;their new ASP.NET Bundle, the ultimate ASP.NET unit testing solution.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Post the text below on your blog (as is, with links) and &lt;a href="mailto:asp@typemock.com"&gt;tell them about it&lt;/a&gt; . If you are in the first 60 to mail us after posting, your license will be on its way!&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;If you have an ASP.NET dedicated blog, you&amp;#39;ll get a license automatically (even if more than 60 submit) during the first week of this announcement.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;8 bloggers will also get an additional 2 licenses (each) to give away / raffle to their readers or friends.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;A few simple requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;div align="justify"&gt;You must own a website, blog space or internet column, older than 2 months, or get permission from the owner of such a site.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;div align="justify"&gt;Your post must include the text below (including the links) between *Begin* and *End*.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*Begin*&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;&lt;a href="http://www.typemock.com/" target="_blank"&gt;Unit Testing&lt;/a&gt; ASP.NET? &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;ASP.NET unit testing&lt;/a&gt; has never been this easy.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Typemock is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch will be giving out &lt;strong&gt;FREE licenses&lt;/strong&gt; to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both &lt;a href="http://www.typemock.com/" target="_blank"&gt;Typemock Isolator&lt;/a&gt;, a &lt;a href="http://www.typemock.com/" target="_blank"&gt;unit test&lt;/a&gt; tool and &lt;a href="http://sm-art.biz/Ivonna.aspx" target="_blank"&gt;Ivonna&lt;/a&gt;, the Isolator add-on for &lt;a href="http://sm-art.biz/Ivonna.aspx" target="_blank"&gt;ASP.NET unit testing&lt;/a&gt;, for a bargain price.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Typemock Isolator is a leading &lt;a href="http://www.typemock.com/" target="_blank"&gt;.NET unit testing&lt;/a&gt; tool (C# and VB.NET) for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php" target="_blank"&gt;SharePoint&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;MVC&lt;/a&gt;, &lt;a href="http://www.typemock.com/wcfpage.php" target="_blank"&gt;WCF&lt;/a&gt;, WPF, &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;Silverlight&lt;/a&gt; and more. Note that for &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;unit testing Silverlight&lt;/a&gt; there is an open source Isolator add-on called &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;SilverUnit&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;The first 60 bloggers who will blog this text in their blog and &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" target="_blank"&gt;tell us about it&lt;/a&gt;, will get a Free Isolator ASP.NET Bundle license (Typemock Isolator + Ivonna). If you post this in an ASP.NET &lt;strong&gt;dedicated&lt;/strong&gt; blog, you&amp;#39;ll get a license automatically (even if more than 60 submit) during the first week of this announcement.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Also 8 bloggers will get an &lt;strong&gt;additional 2 licenses&lt;/strong&gt; (each) to give away to their readers / friends.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" target="_blank"&gt;more information&lt;/a&gt; on how to get your free license.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*End*&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Once you post this in your site, just drop them a line at &lt;a href="mailto:asp@typemock.com"&gt;asp@typemock.com&lt;/a&gt; with your name and the post URL to get your free license.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Hurry up – this offer is limited to the first 60 bloggers, or to ASP.NET dedicated bloggers who will post this in the first week.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Make sure to follow their &lt;a title="The Typemock Inseider - The Official Typemock Blog, by the Typemock developers" href="http://cli.gs/TypemockInsiderBlog" target="_blank"&gt;Blog&lt;/a&gt;, &lt;a title="Typemock - Simplify Unit Testing!" href="http://cli.gs/Typemock" target="_blank"&gt;Site&lt;/a&gt; or &lt;a title="Typemock Twitter" href="http://cli.gs/TypemockTwitter" target="_blank"&gt;Twitter&lt;/a&gt; for updates on this event.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a title="Unit Test Today! Get Typemock Isolator!" href="http://www.typemock.com/cart.php?p=Commercial&amp;amp;maint=on&amp;amp;quantity=1&amp;amp;referrer=485128" target="_blank"&gt;&lt;img alt="Unit Test Today! Get Typemock Isolator!" src="https://secure.plimus.com//developers//485128/Typemock_button_blue.jpg" /&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=1692642" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>ASP.NET Futures: Control ClientID Generation</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/03/18/asp-net-futures-control-clientid-generation.aspx</link><pubDate>Wed, 18 Mar 2009 01:44:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1678872</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1678872</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1678872</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/03/18/asp-net-futures-control-clientid-generation.aspx#comments</comments><description>&lt;p&gt;&lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; is expected to have some &lt;a title="ASP.NET 4.0 ClientID Overview" href="http://cli.gs/0ZX9W7" target="_blank"&gt;improvements on the generation of client IDs&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Although this is a major improvement, it comes short by not allowing the generation of shorter client IDs for server controls.&lt;/p&gt;  &lt;p&gt;My good friend &lt;a title="Nuno Gomes {Code Adventures}" href="http://cli.gs/NunoGomes" target="_blank"&gt;Nuno Gomes&lt;/a&gt; has done some work on generating shorter client IDs for controls (*).&lt;/p&gt;  &lt;p&gt;&lt;a title="jeff chin xyz" href="http://cli.gs/2EJjzX" target="_blank"&gt;Jeff&lt;/a&gt; has taken it one step further with his &lt;a title="How to shorten ASP.NET automatically generated control IDs" href="http://cli.gs/EpT9Bt" target="_blank"&gt;How to shorten ASP.NET automatically generated control IDs&lt;/a&gt; article on &lt;a title="The Code Project - Your Development Resource" href="http://www.codeproject.com/" target="_blank"&gt;CodeProject&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you want to see a running example, check out &lt;a title="http://www.biocompare.com/" href="http://www.biocompare.com/" target="_blank"&gt;http://www.biocompare.com/&lt;/a&gt;.&lt;/p&gt;  &lt;div style="border-top:1px solid;"&gt;(*)    &lt;ul&gt;     &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : Introduction ( Part 1)" href="http://cli.gs/qGgq3X" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : Introduction ( Part 1)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : Concept ( Part 2)" href="http://cli.gs/JLteEZ" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : Concept ( Part 2)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation - Architectural Changes ( Part 3)" href="http://cli.gs/TSE9Jv"&gt;ASP.NET Controls - Improving automatic ID generation - Architectural Changes ( Part 3)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : The ShortIDs Naming Provider (Part 4)" href="http://cli.gs/7rEWmy" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : The ShortIDs Naming Provider (Part 4)&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1678872" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>How To Issue Server Callbacks</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/12/15/how-to-issue-server-callbacks.aspx</link><pubDate>Mon, 15 Dec 2008 01:03:48 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1656740</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1656740</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1656740</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/12/15/how-to-issue-server-callbacks.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a title="Implementing Client Callbacks Programmatically Without Postbacks in ASP.NET Web Pages" href="http://msdn.microsoft.com/library/ms178208.aspx" target="_blank"&gt;Callbacks&lt;/a&gt; were introduced in &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; 2.0 and is a simple mechanism for calling &lt;a title="Page Class" href="http://msdn.microsoft.com/library/system.web.ui.page.aspx" target="_blank"&gt;page&lt;/a&gt; or &lt;a title="WebControl Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.webcontrol.aspx" target="_blank"&gt;control&lt;/a&gt; functionality without page rendering and without the user noticing a post back.&lt;/p&gt;  &lt;p align="justify"&gt;For a page or control to handle callbacks, all it needs is to implement the &lt;a title="ICallbackEventHandler Interface" href="http://msdn.microsoft.com/library/system.web.ui.icallbackeventhandler.aspx" target="_blank"&gt;ICallbackEventHandler&lt;/a&gt; Interface.&lt;/p&gt;  &lt;p align="justify"&gt;When the client calls back to de page or control, the initial state of the controls is posted along with the control being called upon in the __CALLBACKID field and the callback parameter in the __CALLBACKPARAM field.&lt;/p&gt;  &lt;p align="justify"&gt;It’s quite a simple procedure.&lt;/p&gt;  &lt;p align="justify"&gt;But what if you want to issue a callback server side?&lt;/p&gt;  &lt;p align="justify"&gt;In order for a request to be identified as a callback (&lt;a title="Page.IsCallback Property" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.iscallback.aspx" target="_blank"&gt;IsCallback&lt;/a&gt;), the request must be a postback (&lt;a title="Page.IsPostback Property" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.ispostback.aspx" target="_blank"&gt;IsPostback&lt;/a&gt;) and the before mentioned fields must be in the post data of the request. On the other hand, for a request to be considered a postback, the level of server calls (&lt;a title="Transfer Method" href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transfer.aspx" target="_blank"&gt;Transfer&lt;/a&gt; or &lt;a title="Execute Method" href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.execute.aspx" target="_blank"&gt;Execute&lt;/a&gt;) must be 0 (meaning that the current request hasn’t made any Transfer or Execute calls) or the type of the page is the same of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontext.handler.aspx" target="_blank"&gt;Handler&lt;/a&gt; for the current request and the HTTP method is POST.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Changing the HTTP method is (as far as I know) impossible. So, if the request is not already a POST, there’s no way to issue a callback.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Setting the post data is easier. All it’s needed is to override the page’s &lt;a title="DeterminePostBackMode Method" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.DeterminePostBackMode.aspx" target="_blank"&gt;DeterminePostBackMode&lt;/a&gt; method (or in a &lt;a title="PageAdapter Class" href="http://msdn.microsoft.com/en-us/library/System.Web.UI.Adapters.PageAdapter.aspx" target="_blank"&gt;page adapter&lt;/a&gt;) and return the post data previously saved in a context item. Something like this:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;protected override &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;DeterminePostBackMode()
{
    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;postBackMode = Context.Items[&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;callbackPostData&amp;quot;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection&lt;/span&gt;&lt;span&gt;;

    &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span&gt;(postBackMode != &lt;/span&gt;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&lt;span&gt;) ? postBackMode : &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;&lt;span&gt;.DeterminePostBackMode();
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And issue a callback is something like this:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;IHttpHandler &lt;/span&gt;&lt;span&gt;handler = &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler;
&lt;/span&gt;&lt;span style="color:blue;"&gt;try
&lt;/span&gt;&lt;span&gt;{
    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;postData = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection&lt;/span&gt;&lt;span&gt;();
    postData.Add(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;__CALLBACKID&amp;quot;&lt;/span&gt;&lt;span&gt;, sender);
    postData.Add(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;__CALLBACKPARAM&amp;quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.argument.Text);

    Context.Items[&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;callbackPostData&amp;quot;&lt;/span&gt;&lt;span&gt;] = postData;

    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Page &lt;/span&gt;&lt;span&gt;calledPage = (&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PageParser&lt;/span&gt;&lt;span&gt;.GetCompiledPageInstance(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;~/Callback1.aspx&amp;quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Server.MapPath(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;~/Callback1.aspx&amp;quot;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context);

    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler = calledPage;

    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter &lt;/span&gt;&lt;span&gt;writer = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter&lt;/span&gt;&lt;span&gt;();

    Server.Execute(calledPage, writer, &lt;/span&gt;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&lt;span&gt;);

    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.response.Text = writer.ToString();
}
&lt;/span&gt;&lt;span style="color:blue;"&gt;finally
&lt;/span&gt;&lt;span&gt;{
    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler = handler;
}
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;You can find an implementation of a caller and a called page &lt;a title="How To Issue Server Callbacks - Source Code" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=PauloMorgado&amp;amp;DownloadId=4176" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1656740" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>Serialized In-Process ASP.NET Session State Store</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/serialized-in-process-asp-net-session-state-store.aspx</link><pubDate>Mon, 04 Aug 2008 01:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1643215</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1643215</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1643215</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/serialized-in-process-asp-net-session-state-store.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; provides out of the box three session state stores:&lt;/p&gt;
&lt;table class="" style="PADDING-RIGHT:10px;PADDING-LEFT:10px;MARGIN-LEFT:10px;WIDTH:100%;MARGIN-RIGHT:10px;" cellspacing="0" cellpadding="2"&gt;

&lt;tr&gt;
&lt;th class=""&gt;Provider&lt;/td&gt; &lt;/th&gt;
&lt;th class=""&gt;Description&lt;/td&gt; &lt;/tr&gt;&lt;/th&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;InProc&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p align="justify"&gt;Session state is stored in the ASP.NET cache.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;SQLServer&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p align="justify"&gt;Session state is stored out-of-process in an SQL Server database.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;StateServer&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;p align="justify"&gt;Session state is stored out-of-process in an ASP.NET state service.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p align="justify"&gt;Because with &lt;strong&gt;SQLServer&lt;/strong&gt; and &lt;strong&gt;StateServer&lt;/strong&gt; providers the state must cross the &lt;a title="AppDomain Class" href="http://msdn.microsoft.com/library/system.appdomain.aspx" target="_blank"&gt;AppDomain&lt;/a&gt; boundary it needs to be serialized when stored and deserialized when loaded. Because the state needs to be loaded and stored on each request, it is only available from the &lt;a title="HttpApplication.ReleaseRequestState Event" href="http://msdn.microsoft.com/library/System.Web.HttpApplication.PostAcquireRequestState.aspx" target="_blank"&gt;PostAcquireRequestState&lt;/a&gt; to the &lt;a title="HttpApplication.ReleaseRequestState Event" href="http://msdn.microsoft.com/library/System.Web.HttpApplication.ReleaseRequestState.aspx" target="_blank"&gt;ReleaseRequestState&lt;/a&gt; events. And, because of serialization and deserialization, all objects stored must be serializable any reference held to one of the session state items won’t be to the same item after being deserialized.&lt;/p&gt;
&lt;p align="justify"&gt;On the other hand, with the &lt;strong&gt;InProc&lt;/strong&gt; provider, the state will never be serialized or deserialized, which means that objects don’t need to be serializable and any reference to an item in the state is always a reference to the item in the state even before the &lt;a title="HttpApplication.ReleaseRequestState Event" href="http://msdn.microsoft.com/library/System.Web.HttpApplication.PostAcquireRequestState.aspx" target="_blank"&gt;PostAcquireRequestState&lt;/a&gt; event and after the &lt;a title="HttpApplication.ReleaseRequestState Event" href="http://msdn.microsoft.com/library/System.Web.HttpApplication.ReleaseRequestState.aspx" target="_blank"&gt;ReleaseRequestState&lt;/a&gt; event.&lt;/p&gt;
&lt;p align="justify"&gt;In practice, developers use the &lt;strong&gt;InProc&lt;/strong&gt; provider and applications are deployed to production using the &lt;strong&gt;SQLServer&lt;/strong&gt; provider. This usually leads to application errors, like storing non serializable objects in the state, that are only uncovered in production. That’s why I’ve written a serializable in-process session state store. You can find the sources &lt;a title="ized In-Process ASP.NET Session State Store" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=PauloMorgado&amp;amp;DownloadId=2717" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1643215" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>IIS/ASP.NET Cookieless Support Not Working As Expected</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/01/iis-asp-net-cookieless-support-not-working-as-expected.aspx</link><pubDate>Fri, 01 Aug 2008 00:23:02 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1642888</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1642888</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1642888</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/01/iis-asp-net-cookieless-support-not-working-as-expected.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;In one of the environments I work, cookies cannot be used because the pages run inside web browser controls running on a client application and cookies end up being shared by all browsers.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Fortunately, &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; allows us to persist some cookies as part of the URL.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;To persist the session state identifier cookie in the URL we just need to add the following configuration:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sessionState &lt;/span&gt;&lt;span style="color:red;"&gt;cookieless&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UseUri&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;and you’ll get URLs like this:&lt;/p&gt;

&lt;p style="margin-left:10px;font-family:consolas, courier new, monospace;"&gt;http://localhost/Cookieless/(S(jcmwek3ja0lvdpbwoacpjirv))/default.aspx&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;The way &lt;a title="IIS.net : The Official Microsoft IIS Site" href="http://www.iis.net/" target="_blank"&gt;IIS&lt;/a&gt; and ASP.NET do this is by IIS removing the section between parenthesis after the virtual directory path and adding the &lt;strong&gt;AspFilterSessionId&lt;/strong&gt; HTTP header to the request. Than, ASP.NET picks it up and extracts the cookie.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;I wrote this simple page to demonstrate this working:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;@ &lt;/span&gt;&lt;span style="color:#a31515;"&gt;Page &lt;/span&gt;&lt;span style="color:red;"&gt;Language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;C#&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;true&amp;quot; &lt;/span&gt;&lt;span style="background:#ffee62;"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color:red;"&gt;html PUBLIC &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;html &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Head1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;head&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;body&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;form1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;table&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Raw URL&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;Request.RawUrl &lt;span style="background:#ffee62;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Cookiless Cookies&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;AspFilterSessionId Request HTTP Header&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;Request.Headers[&lt;span style="color:#a31515;"&gt;&amp;quot;AspFilterSessionId&amp;quot;&lt;/span&gt;] &lt;span style="background:#ffee62;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Session ID&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;Session.SessionID &lt;span style="background:#ffee62;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;table&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;body&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;html&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;For the above URL, we&amp;#39;ll get a page like this:&lt;/p&gt;

&lt;p style="border-right:thin outset;padding-right:20px;border-top:thin inset;padding-left:20px;padding-bottom:20px;overflow:auto;border-left:thin inset;padding-top:20px;border-bottom:thin outset;"&gt;
  &lt;table&gt;
      &lt;tr&gt;
        &lt;td&gt;Raw URL&lt;/td&gt;

        &lt;td&gt;/Cookieless/default.aspx&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;Cookiless Cookies 
          &lt;br /&gt;AspFilterSessionId Request HTTP Header&lt;/td&gt;

        &lt;td&gt;S(jcmwek3ja0lvdpbwoacpjirv)&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;Session ID&lt;/td&gt;

        &lt;td&gt;jcmwek3ja0lvdpbwoacpjirv&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;IIS strips these cookies even for serving static content like cascading stylesheets.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;You can test this by creating a default theme. You can do this by adding a &lt;strong&gt;Default&lt;/strong&gt; folder under the &lt;strong&gt;App_Themes&lt;/strong&gt; folder and adding a &lt;strong&gt;Styles.css&lt;/strong&gt; file to it:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#a31515;"&gt;body
&lt;/span&gt;{
    &lt;span style="color:red;"&gt;background-color&lt;/span&gt;: &lt;span style="color:blue;"&gt;Yellow&lt;/span&gt;;
}
&lt;span style="color:#a31515;"&gt;table&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;td
&lt;/span&gt;{
    &lt;span style="color:red;"&gt;border&lt;/span&gt;: &lt;span style="color:blue;"&gt;thin solid black&lt;/span&gt;;
}&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;and setting the theme as default using the following configuration&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sessionState &lt;/span&gt;&lt;span style="color:red;"&gt;cookieless&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UseUri&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;pages &lt;/span&gt;&lt;span style="color:red;"&gt;theme&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Default&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And you&amp;#39;ll get a &amp;quot;pretier&amp;quot; page:&lt;/p&gt;

&lt;p style="border-right:thin outset;padding-right:20px;border-top:thin inset;padding-left:20px;padding-bottom:20px;overflow:auto;border-left:thin inset;padding-top:20px;border-bottom:thin outset;background-color:yellow;"&gt;
  &lt;table style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;
      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Raw URL&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;/Cookieless/default.aspx&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Cookiless Cookies 
          &lt;br /&gt;AspFilterSessionId Request HTTP Header&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;S(jcmwek3ja0lvdpbwoacpjirv)&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Session ID&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;jcmwek3ja0lvdpbwoacpjirv&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;If you have special needs for your session state identifiers, you can implement your own &lt;a title="ISessionIDManager Interface" href="http://msdn.microsoft.com/library/System.Web.SessionState.ISessionIDManager.aspx" target="_blank"&gt;session identifier manager&lt;/a&gt;.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;But if you want to use cookieless cookies, you only have one way to do it: extend the &lt;a title="SessionIDManager Class" href="http://msdn.microsoft.com/library/System.Web.SessionState.SessionIDManager.aspx" target="_blank"&gt;SessionIDManager class&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SessionIdManager &lt;/span&gt;: System.Web.SessionState.&lt;span style="color:#2b91af;"&gt;SessionIDManager
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public override string &lt;/span&gt;CreateSessionID(System.Web.&lt;span style="color:#2b91af;"&gt;HttpContext &lt;/span&gt;context)
    {
        &lt;span style="color:blue;"&gt;string &lt;/span&gt;id = System.&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString(&lt;span style="color:#a31515;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;);

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;id;
    }

    &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;Validate(&lt;span style="color:blue;"&gt;string &lt;/span&gt;id)
    {
        &lt;span style="color:blue;"&gt;try
        &lt;/span&gt;{
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;System.&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;(id);
            &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;
        }
        &lt;span style="color:blue;"&gt;catch
        &lt;/span&gt;{
            &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;and configure the session state module to use it:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sessionState &lt;/span&gt;&lt;span style="color:red;"&gt;cookieless&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UseUri&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;sessionIDManagerType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;SessionIdManager&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;pages &lt;/span&gt;&lt;span style="color:red;"&gt;theme&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Default&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And we&amp;#39;ll end up with this nice page:&lt;/p&gt;

&lt;p style="margin-left:10px;font-family:consolas, courier new, monospace;"&gt;http://localhost/Cookieless/(S(%7b0861e55a-e29b-4b6f-825b-1e1d4c57f095%7d))/default.aspx&lt;/p&gt;

&lt;p style="border-right:thin outset;padding-right:20px;border-top:thin inset;padding-left:20px;padding-bottom:20px;overflow:auto;border-left:thin inset;padding-top:20px;border-bottom:thin outset;"&gt;
  &lt;table&gt;
      &lt;tr&gt;
        &lt;td&gt;Raw URL&lt;/td&gt;

        &lt;td&gt;/Cookieless/(S({0861e55a-e29b-4b6f-825b-1e1d4c57f095}))/default.aspx&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;Cookiless Cookies 
          &lt;br /&gt;AspFilterSessionId Request HTTP Header&lt;/td&gt;

        &lt;td&gt;&amp;#160;&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;Session ID&lt;/td&gt;

        &lt;td&gt;{0861e55a-e29b-4b6f-825b-1e1d4c57f095}&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;OOPS! What happened here?&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Looks like IIS was unable to transfer the cookies to the appropriate HTTP header but ASP.NET was able to find the requested resource. On the other hand, IIS couldn’t find the &lt;strong&gt;http://localhost/Cookieless/(S(%7b0861e55a-e29b-4b6f-825b-1e1d4c57f095%7d))App_Themes/Default/Styles.css&lt;/strong&gt;.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;This happens in these environments:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;th&gt;Operating System&lt;/th&gt;

      &lt;th&gt;IIS&lt;/th&gt;

      &lt;th&gt;ASP.NET&lt;/th&gt;
    &lt;/tr&gt;
  
    &lt;tr&gt;
      &lt;td&gt;Windows XP Pro SP3&lt;/td&gt;

      &lt;td&gt;5.1&lt;/td&gt;

      &lt;td&gt;2.0 SP1, 3.5&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;Windows Server 2003 R2&lt;/td&gt;

      &lt;td&gt;6&lt;/td&gt;

      &lt;td&gt;2.0 SP1, 3.5&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;Windows Server 2008&lt;/td&gt;

      &lt;td&gt;7&lt;/td&gt;

      &lt;td&gt;2.0 SP1, 3.5&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Fortunately, in IIS 7 you can have HTTP modules in integrated pipeline mode that are called for every resource requested to IIS.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Your module doesn’t even need to do nothing. It just needs to exist:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Module &lt;/span&gt;: System.Web.&lt;span style="color:#2b91af;"&gt;IHttpModule
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Dispose()
    {
    }

    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Init(System.Web.&lt;span style="color:#2b91af;"&gt;HttpApplication &lt;/span&gt;context)
    {
    }
}&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;and be added to the configuration:&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sessionState &lt;/span&gt;&lt;span style="color:red;"&gt;cookieless&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UseUri&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;sessionIDManagerType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;SessionIdManager&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;pages &lt;/span&gt;&lt;span style="color:red;"&gt;theme&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Default&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.webServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;modules&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Module&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;preCondition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;integratedMode&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Module&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;modules&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.webServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And our “pretty” page is back:&lt;/p&gt;

&lt;p style="border-right:thin outset;padding-right:20px;border-top:thin inset;padding-left:20px;padding-bottom:20px;overflow:auto;border-left:thin inset;padding-top:20px;border-bottom:thin outset;background-color:yellow;"&gt;
  &lt;table style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;
      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Raw URL&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;/Cookieless/default.aspx&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Cookiless Cookies 
          &lt;br /&gt;AspFilterSessionId Request HTTP Header&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;S({0861e55a-e29b-4b6f-825b-1e1d4c57f095})&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;Session ID&lt;/td&gt;

        &lt;td style="border-right:black thin solid;border-top:black thin solid;border-left:black thin solid;border-bottom:black thin solid;"&gt;{0861e55a-e29b-4b6f-825b-1e1d4c57f095}&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Is it just me, or there’s something definitely wrong here?&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;That’s why I opened this &lt;a title="IIS/ASP.NET Cookieless Support Not Working As Expected" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=359227" target="_blank"&gt;bug&lt;/a&gt; on &lt;a title="Microsoft Connect" href="http://connect.microsoft.com/" target="_blank"&gt;Microsoft Connect&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1642888" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS/default.aspx">IIS</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS7/default.aspx">IIS7</category></item><item><title>Other Ways For Making PathInfo And ASP.NET Themes Work Together</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/25/other-ways-for-making-pathinfo-and-asp-net-themes-work-together.aspx</link><pubDate>Fri, 25 Jul 2008 00:07:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1642074</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1642074</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1642074</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/25/other-ways-for-making-pathinfo-and-asp-net-themes-work-together.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;On my &lt;a title="Making PathInfo And ASP.NET Themes Work Together" href="http://msmvps.com/blogs/paulomorgado/archive/2008/07/24/making-pathinfo-and-asp-net-themes-work-together.aspx" target="_blank"&gt;last post&lt;/a&gt; I wrote about a solution for &lt;a title="PathInfo And ASP.NET Themes: Why Can’t They Work Together?" href="http://msmvps.com/blogs/paulomorgado/archive/2008/07/23/pathinfo-and-asp-net-themes-why-can-t-they-work-together.aspx" target="_blank"&gt;the problem that arises when we try the use path infos and ASP.NET Themes and Skins together&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;&lt;a title="Raj Kaimal" href="http://weblogs.asp.net/rajbk/" target="_blank"&gt;Raj Kaimal&lt;/a&gt;&amp;#160;&lt;a title="Making PathInfo And ASP.NET Themes Work Together" href="http://weblogs.asp.net/paulomorgado/archive/2008/07/24/making-pathinfo-and-asp-net-themes-work-together.aspx#comments" target="_blank"&gt;suggested&lt;/a&gt; rewriting all &lt;a title="LINK Element | link Object" href="http://msdn.microsoft.com/library/ms535848.aspx" target="_blank"&gt;LINK&lt;/a&gt; HTML elements URLs to the correct URL as seen from the client. Something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;void &lt;/span&gt;HttpApplicationPreRequestHandlerExecute(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, System.&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;httpApplication = sender &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.&lt;span style="color:#2b91af;"&gt;HttpApplication&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;httpContext = httpApplication.Context;

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;page = httpContext.CurrentHandler &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.UI.&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;if &lt;/span&gt;((page != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; !&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(httpContext.Request.PathInfo))
    {
        page.PreRenderComplete += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;source, System.&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;args)
        {
            &lt;span style="color:blue;"&gt;var &lt;/span&gt;p = source &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.UI.&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;;

            &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(System.Web.UI.&lt;span style="color:#2b91af;"&gt;Control &lt;/span&gt;headerControl &lt;span style="color:blue;"&gt;in &lt;/span&gt;p.Header.Controls)
            {
                &lt;span style="color:blue;"&gt;var &lt;/span&gt;link = headerControl &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.UI.HtmlControls.&lt;span style="color:#2b91af;"&gt;HtmlLink&lt;/span&gt;;
                &lt;span style="color:blue;"&gt;if &lt;/span&gt;(link != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
                {
                    link.Href = p.ResolveUrl(link.Href);
                }
            }
        };
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;With this approach you still have a problem (which mine didn’t solve) with post backs because the rendering of the &lt;a title="ACTION Attribute | action Property" href="http://msdn.microsoft.com/library/ms533063.aspx" target="_blank"&gt;ACTION&lt;/a&gt; of the HTML &lt;a title="FORM Element | form Object" href="http://msdn.microsoft.com/library/ms535249.aspx" target="_blank"&gt;FORM&lt;/a&gt; is also &lt;a title="FORM ACTION not rendered correctly when the reques has a PathInfo" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=357669" target="_blank"&gt;broken&lt;/a&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://weblogs.pontonetpt.com/israelaece/"&gt;Israel Aéce&lt;/a&gt;&amp;#160;&lt;a title="Fazendo Com Que PathInfo E ASP.NET Themes Coexistam" href="http://weblogs.pontonetpt.com/pjmorgado/posts/27968.aspx#27970" target="_blank"&gt;suggested&lt;/a&gt; the use of the &lt;a title="BASE Element | base Object" href="http://msdn.microsoft.com/library/ms535191.aspx" target="_blank"&gt;BASE&lt;/a&gt; HTML element to re-base relative URLs. Something like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;void &lt;/span&gt;HttpApplicationPreRequestHandlerExecute(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, System.&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;httpApplication = sender &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.&lt;span style="color:#2b91af;"&gt;HttpApplication&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;httpContext = httpApplication.Context;

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;page = httpContext.CurrentHandler &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.UI.&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;if &lt;/span&gt;((page != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; !&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(httpContext.Request.PathInfo))
    {
        page.PreRenderComplete += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;source, System.&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;args)
        {
            page.Init += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;source, System.&lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;args)
            {
                &lt;span style="color:blue;"&gt;var &lt;/span&gt;p = source &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.UI.&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;;

                &lt;span style="color:blue;"&gt;var &lt;/span&gt;htmlBase = &lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Web.UI.WebControls.&lt;span style="color:#2b91af;"&gt;WebControl&lt;/span&gt;(System.Web.UI.&lt;span style="color:#2b91af;"&gt;HtmlTextWriterTag&lt;/span&gt;.Base);
                htmlBase.Attributes.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;, p.Request.Url.GetLeftPart(System.&lt;span style="color:#2b91af;"&gt;UriPartial&lt;/span&gt;.Authority) + p.Request.CurrentExecutionFilePath);
                p.Header.Controls.Add(htmlBase);
            };
        };
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;This seems like the better solution except if your site sits behind several security perimeters and it is not possible to be sure what the domain is as seem from the client side, which was my problem to begin with.&lt;/p&gt;

&lt;p align="justify"&gt;But if you are thinking of calling &lt;a title="HttpServerUtility.Executet Method" href="http://msdn.microsoft.com/library/System.Web.HttpServerUtility.Execute.aspx" target="_blank"&gt;Server.Execute&lt;/a&gt;, &lt;a title="HttpServerUtility.TransferRequest Method" href="http://msdn.microsoft.com/library/System.Web.HttpServerUtility.TransferRequest.aspx" target="_blank"&gt;Server.TransferRequest&lt;/a&gt; or &lt;a title="HttpServerUtility.TransferRequest Method" href="http://msdn.microsoft.com/library/System.Web.HttpServerUtility.TransferRequest.aspx" target="_blank"&gt;Server.TransferRequest&lt;/a&gt;, neither of these two solutions will work.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1642074" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS/default.aspx">IIS</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS7/default.aspx">IIS7</category></item><item><title>Making PathInfo And ASP.NET Themes Work Together</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/24/making-pathinfo-and-asp-net-themes-work-together.aspx</link><pubDate>Thu, 24 Jul 2008 00:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641944</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1641944</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1641944</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/24/making-pathinfo-and-asp-net-themes-work-together.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;Updated on 2008.07.28&lt;/strong&gt; – The code was done in a hurry and, talking to my friend &lt;a title="LA.NET [EN]" href="http://msmvps.com/blogs/luisabreu/" target="_blank"&gt;Luís&lt;/a&gt;, I noticed that I had forgotten to make a case insensitive comparison and that the code was not so obvious. So, I updated the code and added an explanation.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;On my &lt;a title="PathInfo And ASP.NET Themes: Why Can’t They Work Together?" href="http://msmvps.com/blogs/paulomorgado/archive/2008/07/23/pathinfo-and-asp-net-themes-why-can-t-they-work-together.aspx" target="_blank"&gt;last post&lt;/a&gt; I wrote about the problem that arises when we try the use &lt;a title="HttpRequest.PathInfo Property" href="http://msdn.microsoft.com/library/System.Web.HttpRequest.PathInfo.aspx" target="_blank"&gt;path infos&lt;/a&gt; and &lt;a title="ASP.NET Themes and Skins" href="http://msdn.microsoft.com/library/ea1d8583-c05c-4e97-a851-0ceefea328f7.aspx" target="_blank"&gt;ASP.NET Themes and Skins&lt;/a&gt; together.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;But most of the times you don’t care about the &lt;strong&gt;why you can’t&lt;/strong&gt;. You just want to know &lt;strong&gt;how you can&lt;/strong&gt;.&lt;/a&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;The way I see it, the right solution would be to render the URLs for the stylesheets rooted.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;But since I can’t do that, the next best thing is the serve the wrongly addressed request properly.&lt;/a&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;But how can we do that?&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;The only way I could come up with, was an &lt;a title="IHttpModule Interface" href="http://msdn.microsoft.com/library/System.Web.IHttpModule.aspx" target="_blank"&gt;HTTP Module&lt;/a&gt;:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;AppThemesModule &lt;/span&gt;: &lt;span style="COLOR:blue;"&gt;global&lt;/span&gt;::System.Web.&lt;span style="COLOR:#2b91af;"&gt;IHttpModule
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;private const string&lt;/span&gt; LocalThemesFolderName = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;/App_Themes/&amp;quot;&lt;/span&gt;;
    &lt;span style="COLOR:blue;"&gt;private static readonly int&lt;/span&gt; searchStartIndex;
    &lt;span style="COLOR:blue;"&gt;private static readonly int&lt;/span&gt; minimumLenghtForSearch;

    &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; AppThemesModule()
    {
        &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; searchStartIndex = System.Web.&lt;span style="COLOR:#2b91af;"&gt;HttpRuntime&lt;/span&gt;.AppDomainAppVirtualPath.Length;

        &lt;span style="COLOR:#2b91af;"&gt;AppThemesModule&lt;/span&gt;.searchStartIndex = ((searchStartIndex == 1) ? 0 : searchStartIndex) + 2;

        &lt;span style="COLOR:#2b91af;"&gt;AppThemesModule&lt;/span&gt;.minimumLenghtForSearch = &lt;span style="COLOR:#2b91af;"&gt;AppThemesModule&lt;/span&gt;.searchStartIndex + &lt;span style="COLOR:#2b91af;"&gt;AppThemesModule&lt;/span&gt;.LocalThemesFolderName.Length;
    }

    &lt;span style="COLOR:blue;"&gt;#region &lt;/span&gt;IHttpModule Members

    &lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;Dispose()
    {
    }

    &lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;Init(System.Web.&lt;span style="COLOR:#2b91af;"&gt;HttpApplication &lt;/span&gt;context)
    {
        context.BeginRequest += HttpApplicationBeginRequest;
    }

    &lt;span style="COLOR:blue;"&gt;#endregion

    void &lt;/span&gt;HttpApplicationBeginRequest(&lt;span style="COLOR:blue;"&gt;object &lt;/span&gt;sender, System.&lt;span style="COLOR:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        System.Web.&lt;span style="COLOR:#2b91af;"&gt;HttpApplication &lt;/span&gt;httpApplication = sender &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;System.Web.&lt;span style="COLOR:#2b91af;"&gt;HttpApplication&lt;/span&gt;;

        &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;path = httpApplication.Request.Path;
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(path.Length &amp;gt; searchStartIndex)
        {
            &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;appThemesStartIndex = path.IndexOf(&lt;span style="COLOR:#2b91af;"&gt;AppThemesModule&lt;/span&gt;.LocalThemesFolderName, searchStartIndex, System.&lt;span style="COLOR:#2b91af;"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase);
            &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(appThemesStartIndex &amp;gt; 0)
            {
                httpApplication.Context.RewritePath(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;~&amp;quot; &lt;/span&gt;+ path.Substring(appThemesStartIndex));
            }
        }
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The code starts by initializing the static read-only field &lt;strong&gt;searchStartIndex&lt;/strong&gt; with the start index of the search for the &lt;strong&gt;/App_Themes/&lt;/strong&gt; pattern. If the length of the application’s virtual path is 1, that means that it’s the root of the site and search start index is &lt;strong&gt;0&lt;/strong&gt; instead of &lt;strong&gt;1&lt;/strong&gt;; otherwise the search start index will be the length of the application’s virtual path. &lt;strong&gt;2&lt;/strong&gt; is added because there is no need to start searching the path just after the application’s virtual path (if the pattern was found just after the application’s virtual path, no replacement would be needed).&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Than, the static read-only field &lt;strong&gt;minimumLenghtForSearch&lt;/strong&gt; is initialized with the minimum length of the path to search for the pattern. There is no need to search for the pattern on paths shorter than the search start index plus the length of the pattern because, if found, no replacement would be needed.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Besides registering the module, you’ll have to configure your virtual directory so that all the files to be served out of the themes are handled by a &lt;a title="StaticFileHandler Class" href="http://msdn.microsoft.com/library/ms404287.aspx" target="_blank"&gt;StaticFileHandler&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641944" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>PathInfo And ASP.NET Themes: Why Can’t They Work Together?</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/23/pathinfo-and-asp-net-themes-why-can-t-they-work-together.aspx</link><pubDate>Wed, 23 Jul 2008 22:37:55 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641934</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1641934</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1641934</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/23/pathinfo-and-asp-net-themes-why-can-t-they-work-together.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;If you ever worked with &lt;a title="ASP.NET Themes and Skins" href="http://msdn.microsoft.com/library/ea1d8583-c05c-4e97-a851-0ceefea328f7.aspx" target="_blank"&gt;ASP.NET Themes and Skins&lt;/a&gt;, you know that stylesheet links are added to the head section of the HTML document.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;The rendered URL to these stylesheets is always relative to location of the page being requested.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;So, for a request to:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p style="margin-left:10px;font-family:consolas,courier new;"&gt;http://MySite/Section/Default.aspx&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;you&amp;#39;ll get:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p style="margin-left:10px;font-family:consolas,courier new;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;link &lt;/span&gt;&lt;span style="color:red;"&gt;href&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;../App_Themes/Default/Styles.css&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/css&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;rel&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;which will make the web browser request for:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p style="margin-left:10px;font-family:consolas,courier new;"&gt;http://MySite/App_Themes/Default/Styles.css&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;and it all works fine.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Well, it works fine until you need to navigate to:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p style="margin-left:10px;font-family:consolas,courier new;"&gt;http://MySite/Section/Default.aspx/PathInfo&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;You&amp;#39;ll get the same stylesheet reference and the browser will request for:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p style="margin-left:10px;font-family:consolas,courier new;"&gt;http://MySite/Section/Default.aspx/App_Themes/Default/Styles.css&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;This happens because the web browser has no knowledge of what &lt;a title="HttpRequest.PathInfo Property" href="http://msdn.microsoft.com/library/System.Web.HttpRequest.PathInfo.aspx" target="_blank"&gt;PathInfo&lt;/a&gt;s are. It only accounts for the number of forward slashes (/).&lt;/p&gt;  &lt;p align="justify"&gt;I&amp;#39;ve filed a &lt;a title="Themes don&amp;#39;t work when the request has a PathInfo" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=357532" target="_blank"&gt;bug&lt;/a&gt; on &lt;a title="Microsoft Connect" href="http://connect.microsoft.com/" target="_blank"&gt;Microsoft Connect&lt;/a&gt; about this.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641934" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>Make The HttpValueCollection Class Public And Move It To System.DLL</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/15/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll.aspx</link><pubDate>Tue, 15 Jul 2008 00:22:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640806</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1640806</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1640806</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/15/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;I find the &lt;strong&gt;System.Web.HttpValueCollection&lt;/strong&gt; class very useful in a wide number of situations that involve composing HTTP requests or any other need to represent name/value collection as a string (in an XML attribute, for example).&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;As of now (&lt;a title="Microsoft .NET" href="http://www.microsoft.com/net/" target="_blank"&gt;.NET Framework&lt;/a&gt; 3.5 SP1 Beta), the only way to create an instance of the &lt;strong&gt;System.Web.HttpValueCollection&lt;/strong&gt; class is using the &lt;a title="System.Web.HttpUtility.ParseQueryString Method" href="http://msdn.microsoft.com/library/System.Web.HttpUtility.ParseQueryString.aspx" target="_blank"&gt;System.Web.HttpUtility.ParseQueryString method&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;I’d like to see it public and available in a more generic assembly like &lt;strong&gt;System.DLL&lt;/strong&gt; to be available on every type of &lt;a title=".NET Framework Developer Center" href="http://msdn.microsoft.com/netframework/" target="_blank"&gt;.NET&lt;/a&gt; application (Windows Client applications, Windows Service applications, Silverlight applications, Windows Mobile applications, etc.).&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;If you agree with me, &lt;a title="Make the HttpValueCollection class public and move it to System.dll" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=356144" target="_blank"&gt;vote on my suggestion&lt;/a&gt; on &lt;a title="Microsoft Connect" href="http://connect.microsoft.com/" target="_blank"&gt;Microsoft Connect&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640806" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsClient/default.aspx">WindowsClient</category></item><item><title>BEWARE: System.Web.HttpValueCollection Parsing Is Not Reversible</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/14/beware-system-web-httpvaluecollection-parsing-is-not-reversible.aspx</link><pubDate>Mon, 14 Jul 2008 12:50:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640722</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1640722</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1640722</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/14/beware-system-web-httpvaluecollection-parsing-is-not-reversible.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;If you run this code:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;
System.Collections.Specialized.&lt;span&gt;NameValueCollection&lt;/span&gt; queryString = System.Web.&lt;span&gt;HttpUtility&lt;/span&gt;.ParseQueryString(&lt;span&gt;&amp;quot;noKey&amp;amp;=emptyKey&amp;amp;A=Akey&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;&lt;strong&gt;queryString&lt;/strong&gt; will actually have the running &lt;a title="Type Class" href="http://msdn2.microsoft.com/library/System.Type.aspx" target="_blank"&gt;type&lt;/a&gt; of &lt;strong&gt;System.Web.HttpValueCollection&lt;/strong&gt;.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;What&amp;#39;s great about this class is that its &lt;a title="ToString Method" href="http://msdn.microsoft.com/library/System.Object.ToString.aspx" target="_blank"&gt;ToString method&lt;/a&gt; output is the collection&amp;#39;s content in a nice URL encoded format.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;As with its base class (&lt;a title="System.Collections.Specialized.NameValueCollection Class" href="http://msdn.microsoft.com/library/System.Collections.Specialized.NameValueCollection.aspx" target="_blank"&gt;NameValueCollection&lt;/a&gt;), there’s a difference between a null string and an empty string key and the parsing treats query string parameters with no parameter specification as having a null string key and parameters with an empty string key having an empty string parameter key.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;So, when call &lt;strong&gt;ToString&lt;/strong&gt; on the instance returned by &lt;a title="System.Web.HttpUtility.ParseQueryString Method" href="http://msdn.microsoft.com/library/System.Web.HttpUtility.ParseQueryString.aspx" target="_blank"&gt;System.Web.HttpUtility.ParseQueryString method&lt;/a&gt; you would expect to get the parsed string (or, at least, one that would be parsed into the equivalent collection), right? But what you’ll get instead is this: &lt;strong&gt;noKey&amp;amp;emptyKey&amp;amp;A=Akey&lt;/strong&gt;.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;I’ve filed a &lt;a title="HttpValueCollection.FillFromString(string s, bool urlencoded, Encoding encoding) parsing does not have the reverse behavior of HttpValueCollection.ToString()" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355774" target="_blank"&gt;bug&lt;/a&gt; into &lt;a title="Microsoft Connect" href="http://connect.microsoft.com/" target="_blank"&gt;connect&lt;/a&gt;. If you think this is important and must be corrected, please &lt;a title="HttpValueCollection.FillFromString(string s, bool urlencoded, Encoding encoding) parsing does not have the reverse behavior of HttpValueCollection.ToString()" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355774" target="_blank"&gt;vote&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640722" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item><item><title>Isolator 4.3 Released!</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/07/02/isolator-4-3-released.aspx</link><pubDate>Wed, 02 Jul 2008 20:47:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639160</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1639160</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1639160</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/07/02/isolator-4-3-released.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;Today &lt;a title="Typemock - Simplify Unit Testing!" href="http://www.typemock.com/" target="_blank"&gt;Typemock&lt;/a&gt; released version 4.3 of &lt;a title="Typemock Isolator - Serious Development" href="http://www.typemock.com/Product.html" target="_blank"&gt;Typemock Isolator&lt;/a&gt;. Download it from &lt;a title="Typemock Isolator Download" href="http://www.typemock.com/Downloads.php" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;What’s new? &lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;Support for &lt;a title="Ivonna" href="http://sm-art.biz/Ivonna.aspx" target="_blank"&gt;Ivonna&lt;/a&gt;. For those of you who develop ASP.Net applications, Ivonna is a great tool, built on top of Isolator’s platform, to simplify writing tests for &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;Typemock.Integration.Packs namespace APIs added to support license management through Isolator, the way Ivonna does. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;As announced when it was released, version 4.2 was the last version of Isolator to support .NET 1.1. Version 4.3 only supports the 2.0 runtime and its &lt;a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/vstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt; counterparts: VS2005 and VS2008. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;For 64 bit machines, now there’s a single installer. (don’t forget to uninstall both previous 32 and 64 installers prior to installing 4.3.) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;strong&gt;RecorderManager.GetMockOf(instanceRef)&lt;/strong&gt; and &lt;strong&gt;MockManager.GetMockOf(instanceRef)&lt;/strong&gt;. To retrieve the mock controller object based on a reference to the instance. (&lt;a title="Getting mock object from an instance" href="http://blog.typemock.com/2008/06/getting-mock-object-from-instance.html" target="_blank"&gt;more...&lt;/a&gt;). &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Bug fixes:&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;Fixes to DLINQ support. LINQ Queries with data tables now work better, for example with GroupBy. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;Static constructors in Natural Mocks are now invoked correctly. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;A bug that caused an exception to be thrown when mocking interfaces (&amp;quot;Method XX in type &lt;strong&gt;IMyInterface&lt;/strong&gt; has no matching overload that returns &lt;strong&gt;TypeMock.Mock+a&lt;/strong&gt;) was fixed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;A bug that caused an exception to be thrown when the mocked object was overriding &lt;strong&gt;Equals &lt;/strong&gt;was fixed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;A bug that caused failure in mocking explicit interface with the same name was fixed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;A bug occurring im multithreading scenarios in &lt;strong&gt;VerifyWithWait&lt;/strong&gt; was fixed. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;A bug that causes &lt;strong&gt;NullReferenceException&lt;/strong&gt; to be thrown when using &lt;strong&gt;Auto Deploy&lt;/strong&gt; was fixed. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;See also:&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;a title="Isolator 4.3 Released!" href="http://blog.typemock.com/2008/07/isolator-43-released.html" target="_blank"&gt;Isolator 4.3 Released!&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;a title="Isolator 4.3 Release Notes" href="http://www.typemock.com/Docs/UserGuide/index.php?topic=ReleaseNotes43.html" target="_blank"&gt;Isolator 4.3 Release Notes&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;a title="Getting mock object from an instance" href="http://blog.typemock.com/2008/06/getting-mock-object-from-instance.html" target="_blank"&gt;Getting mock object from an instance&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639160" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>More On ASP.NET Validators And Validation Summary Rendering of Properties</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/06/23/more-on-asp-net-validators-and-validation-summary-rendering-of-properties.aspx</link><pubDate>Mon, 23 Jun 2008 00:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1636848</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1636848</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1636848</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/06/23/more-on-asp-net-validators-and-validation-summary-rendering-of-properties.aspx#comments</comments><description>&lt;p&gt;On previous posts [&lt;a title="The Cause Of ASP.NET Validators And Validation Summary Slowness" href="http://msmvps.com/blogs/paulomorgado/archive/2008/05/12/the-cause-of-asp-net-validators-and-validation-summary-slowness.aspx" target="_blank"&gt;^&lt;/a&gt;][&lt;a title="Rendering ASP.NET Validators And Validation Summary Property As HTML Attributes" href="http://msmvps.com/blogs/paulomorgado/archive/2008/05/13/rendering-asp-net-validators-and-validation-summary-property-as-html-attributes.aspx" target="_blank"&gt;^&lt;/a&gt;] I mentioned the size of &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; validators and validation summary rendering and the fact that &lt;a title="ClentScriptManager.RegisterExpandoAttribute Method" href="http://msdn.microsoft.com/library/system.web.ui.clientscriptmanager.registerexpandoattribute.aspx" target="_blank"&gt;expando attributes&lt;/a&gt; are being used to add properties. &lt;a title="Guru Stop - Mohamed Meligy blogging the interests of an Egyptian .NET software engineer (Communities, Architecture, Patterns, etc..)" href="http://weblogs.asp.net/meligy/" target="_blank"&gt;Mohamed&lt;/a&gt; also &lt;a title="Prevent ASP.NET Validators from Massively Increasing Page Size" href="http://weblogs.asp.net/meligy/archive/2008/06/17/prevent-asp-net-validators-from-massively-increasing-page-size.aspx" target="_blank"&gt;mentions&lt;/a&gt; this issue.&lt;/p&gt;
&lt;p&gt;Besides the fact that custom attributes aren&amp;#39;t &lt;a title="XHTML2 Working Group Home Page" href="http://www.w3.org/MarkUp/" target="_blank"&gt;XHTML&lt;/a&gt; conformant, &lt;a title="Firefox web browser" href="http://www.firefox.com/" target="_blank"&gt;Firefox&lt;/a&gt; differs from &lt;a title="Internet Explorer" href="http://www.microsoft.com/ie" target="_blank"&gt;Internet Explorer&lt;/a&gt; in the way it handles these attributes.&lt;/p&gt;
&lt;p&gt;On &lt;a title="Internet Explorer" href="http://www.microsoft.com/ie" target="_blank"&gt;Internet Explorer&lt;/a&gt;, these attributes are converted in string properties of the HTML element. On &lt;a title="Firefox web browser" href="http://www.firefox.com/" target="_blank"&gt;Firefox&lt;/a&gt;, on the other hand, these attributes are only accessible through the &lt;strong&gt;attributes&lt;/strong&gt; collection.&lt;/p&gt;
&lt;p&gt;I wonder why I don’t like client-side JavaScript development.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1636848" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/InternetExplorer/default.aspx">InternetExplorer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/FireFox/default.aspx">FireFox</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/HTML/default.aspx">HTML</category></item><item><title>Rendering ASP.NET Validators And Validation Summary Property As HTML Attributes</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/05/13/rendering-asp-net-validators-and-validation-summary-property-as-html-attributes.aspx</link><pubDate>Tue, 13 May 2008 00:34:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1621419</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1621419</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1621419</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/05/13/rendering-asp-net-validators-and-validation-summary-property-as-html-attributes.aspx#comments</comments><description>&lt;p&gt;Yesterday I blogged about &lt;a class="" title="The Cause Of ASP.NET Validators And Validation Summary Slowness" href="http://weblogs.asp.net/paulomorgado/archive/2008/05/12/the-cause-of-asp-net-validators-and-validation-summary-slowness.aspx" target="_blank"&gt;the cause of ASP.NET validators and validation summary slowness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At that point I wasn&amp;#39;t aware of the existence of the &lt;a title="xhtmlConformance Element (ASP.NET Settings Schema)" href="http://msdn.microsoft.com/library/ms228268.aspx" target="_blank"&gt;XHTML conformance configuration&lt;/a&gt; (thanks &lt;a title="Nuno Faro Gomes" href="http://nunogomes.net/" target="_blank"&gt;Nuno&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;With the XHTML conformance configuration set to &lt;strong&gt;Legacy&lt;/strong&gt;, the rendering of controls works like it worked in ASP.NET 1.1.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1621419" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/HTML/default.aspx">HTML</category></item><item><title>The Cause Of ASP.NET Validators And Validation Summary Slowness</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/05/12/the-cause-of-asp-net-validators-and-validation-summary-slowness.aspx</link><pubDate>Sun, 11 May 2008 23:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1620018</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1620018</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1620018</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/05/12/the-cause-of-asp-net-validators-and-validation-summary-slowness.aspx#comments</comments><description>&lt;p align="justify"&gt;When building &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; pages, if you use too many validators and validation summaries your pages can become very slow. Have you ever wondered why?&lt;/p&gt;
&lt;p align="justify"&gt;Lets build a simple page web page with a few validators. Something like this:&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="212" alt="Web page with validation" src="http://weblogs.asp.net/blogs/paulomorgado/WindowsLiveWriter/VisualStudi.51SP1BetaAvailableToDownload_14B70/WebPageWithValidators_thumb_2.png" width="217" border="0" /&gt; &lt;/p&gt;
&lt;p&gt;The page is composed of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 &lt;a title="TextBox Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.textbox.aspx" target="_blank"&gt;TextBox&lt;/a&gt;es &lt;/li&gt;
&lt;li&gt;1 &lt;a title="RequiredFieldValidator Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.RequiredFieldValidator.aspx" target="_blank"&gt;RequiredFieldValidator&lt;/a&gt; for each &lt;strong&gt;TextBox&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;1 &lt;a title="RangeValidator Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.RangeValidator.aspx" target="_blank"&gt;RangeValidator&lt;/a&gt; for each &lt;strong&gt;TextBox&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;1 &lt;a title="CompareValidator Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.CompareValidator.aspx" target="_blank"&gt;CompareValidator&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;1 &lt;a title="ValidationSummary Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.validationsummary.aspx" target="_blank"&gt;ValidationSummary&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;1 &lt;a href="http://msdn.microsoft.com/library/system.web.ui.webcontrols" target="_blank"&gt;Button&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p align="justify"&gt;ASP.NET renders the &lt;strong&gt;ValidationSummary&lt;/strong&gt; as a &lt;strong&gt;DIV&lt;/strong&gt; and each validator as a &lt;strong&gt;SPAN&lt;/strong&gt; and uses &lt;a title="ClientScriptManager.RegisterExpandoAttribute Method" href="http://msdn.microsoft.com/library/system.web.ui.clientscriptmanager.registerexpandoattribute.aspx" target="_blank"&gt;expando attributes&lt;/a&gt; to add properties to those elements.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a title="ClientScriptManager.RegisterExpandoAttribute Method (String, String, String)" href="http://msdn.microsoft.com/library/ms153122.aspx" target="_blank"&gt;According to the documentation&lt;/a&gt;, expando attributes are set dynamically from JavaScript to preserve &lt;a title="XHTML2 Working Group Home Page" href="http://www.w3.org/MarkUp/" target="_blank"&gt;XHTML&lt;/a&gt; compatibility for the rendered control&amp;#39;s markup.&lt;/p&gt;
&lt;p align="justify"&gt;The problem is that all that JavaScript makes the HTML document larger and slower to execute than if the properties were rendered in HTML as attributes of the elements.&lt;/p&gt;
&lt;p align="justify"&gt;For such a small page, the difference in size approaches 2k bytes. If you add a few dozen validators to he page, the slowness is noticeable.&lt;/p&gt;
&lt;p align="justify"&gt;I&amp;#39;m all in favor of strict standards and standards compliance, but in this case, I wish &lt;strong&gt;XHTML&lt;/strong&gt; would allow arbitrary attributes.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1620018" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/HTML/default.aspx">HTML</category></item><item><title>Upgrading the WCSF EventBroker Extension to WCSF 2.0</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/03/12/upgrading-the-wcsf-eventbroker-extension-to-wcsf-2-0.aspx</link><pubDate>Wed, 12 Mar 2008 00:15:10 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1540533</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1540533</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1540533</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/03/12/upgrading-the-wcsf-eventbroker-extension-to-wcsf-2-0.aspx#comments</comments><description>&lt;p align="justify"&gt;While preparing the demos for &lt;a title="WEB10 - Web Client Software Factory: Building RIAs with ASP.NET AJAX and WCSF" href="http://www.techdays.pt/session/2008/WEB10.aspx" target="_blank"&gt;my session&lt;/a&gt; at &lt;a title="TechDays Portugal - The biggest and greaetest IT event in Portugal" href="http://www.techdays.pt/" target="_blank"&gt;TechDays Portugal 2008&lt;/a&gt;, I&amp;#39;ve noticed some changes in the &lt;a title="Web Client Software Factory" href="http://www.codeplex.com/websf/" target="_blank"&gt;Web Client Software Factory 2.0&lt;/a&gt; that prevented the &lt;a title="WCSF EventBroker Extension" href="http://www.codeplex.com/wcsfcontrib/Wiki/View.aspx?title=EventBroker%20extension&amp;amp;referringTitle=Documentation" target="_blank"&gt;EventBroker Extension&lt;/a&gt; from compiling and running.&lt;/p&gt;  &lt;p align="justify"&gt;The problem ended out just being a little change in the WebClientApplication class. The virtual methods related to creating the builders changed.&lt;/p&gt;  &lt;p align="justify"&gt;To fix this, all it&amp;#39;s needed is editing the WebClientApplication class (CompositeWeb\WebClientApplication.cs, line 35).&lt;/p&gt;  &lt;p align="justify"&gt;Just replace the CreateBuilder override:&lt;/p&gt;  &lt;pre class="code" style="border-right:thin outset;padding-right:10px;border-top:thin groove;padding-left:10px;background:#ffffff;overflow-x:auto;padding-bottom:10px;border-left:thin groove;padding-top:10px;border-bottom:thin outset;font-family:consolas;"&gt;&lt;span style="color:blue;"&gt;protected override &lt;/span&gt;Microsoft.Practices.CompositeWeb.ObjectBuilder.&lt;font color="#2b91af"&gt;WCSFBuilder&lt;/font&gt; CreateBuilder(&lt;span style="color:blue;"&gt;bool &lt;/span&gt;isSingleton)
{
    &lt;span style="color:green;"&gt;// Our builder adds an EventBrokerStrategy to the build.
    &lt;/span&gt;&lt;font color="#2b91af"&gt;WCSFBuilder&lt;/font&gt; builder = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;font color="#2b91af"&gt;WCSFBuilder&lt;/font&gt;();
    builder.Policies.SetDefault&amp;lt;&lt;font color="#2b91af"&gt;ISingletonPolicy&lt;/font&gt;&amp;gt;(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;font color="#2b91af"&gt;SingletonPolicy&lt;/font&gt;(isSingleton));
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;builder;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;with an override of the AddBuilderStrategies method:&lt;/p&gt;

&lt;pre class="code" style="border-right:thin outset;padding-right:10px;border-top:thin groove;padding-left:10px;background:#ffffff;overflow-x:auto;padding-bottom:10px;border-left:thin groove;padding-top:10px;border-bottom:thin outset;font-family:consolas;"&gt;&lt;span style="color:blue;"&gt;protected override void &lt;/span&gt;AddBuilderStrategies(&lt;font color="#2b91af"&gt;IBuilder&lt;/font&gt;&amp;lt;Microsoft.Practices.CompositeWeb.ObjectBuilder.&lt;font color="#2b91af"&gt;WCSFBuilderStage&lt;/font&gt;&amp;gt; builder)
{
    &lt;span style="color:blue;"&gt;base&lt;/span&gt;.AddBuilderStrategies(builder);
    builder.Strategies.AddNew&amp;lt;&lt;font color="#2b91af"&gt;EventBrokerStrategy&lt;/font&gt;&amp;gt;(Microsoft.Practices.CompositeWeb.ObjectBuilder.&lt;font color="#2b91af"&gt;WCSFBuilderStage&lt;/font&gt;.PostInitialization);
}&lt;/pre&gt;

&lt;p&gt;Don&amp;#39;t forget that if you want to run it in IIS7 Integrated Pipeline mode, you have a few more &lt;a title="WCSF 2.0 And IIS7 Integrated Pipeline Mode" href="http://msmvps.com/blogs/paulomorgado/archive/2008/03/11/wcsf-2-0-and-iis7-integrated-pipeline-mode.aspx" target="_blank"&gt;changes&lt;/a&gt; to make.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1540533" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WCSF/default.aspx">WCSF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PnP/default.aspx">PnP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftwareFactories/default.aspx">SoftwareFactories</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Techdays/default.aspx">Techdays</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechdaysPT08/default.aspx">TechdaysPT08</category></item><item><title>WCSF 2.0 And IIS7 Integrated Pipeline Mode</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/03/11/wcsf-2-0-and-iis7-integrated-pipeline-mode.aspx</link><pubDate>Tue, 11 Mar 2008 10:06:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1539873</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1539873</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1539873</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/03/11/wcsf-2-0-and-iis7-integrated-pipeline-mode.aspx#comments</comments><description>&lt;p align="justify"&gt;While preparing the demos for &lt;a title="WEB10 - Web Client Software Factory: Building RIAs with ASP.NET AJAX and WCSF" href="http://www.techdays.pt/session/2008/WEB10.aspx" target="_blank"&gt;my session&lt;/a&gt; at &lt;a title="TechDays Portugal - The biggest and greaetest IT event in Portugal" href="http://www.techdays.pt/" target="_blank"&gt;TechDays Portugal 2008&lt;/a&gt;, I&amp;#39;ve noticed that the &lt;a title="Web Client Software Factory" href="http://www.codeplex.com/websf/" target="_blank"&gt;Web Client Software Factory 2.0&lt;/a&gt; doesn&amp;#39;t work with &lt;a title="IIS.net: Home: The Official Microsoft IIS Site" href="http://www.iis.net/" target="_blank"&gt;IIS7&lt;/a&gt; in &lt;a title="Enhance Your Apps with the Integrated ASP.NET Pipeline" href="http://msdn2.microsoft.com/magazine/cc135973.aspx" target="_blank"&gt;integrated pipeline mode&lt;/a&gt; because it&amp;#39;s trying to access the &lt;a title="HttpContext.Request Property" href="http://msdn2.microsoft.com/library/System.Web.HttpContext.Request.aspx" target="_blank"&gt;Request&lt;/a&gt; property of the &lt;a title="HttpContext.Current Property" href="http://msdn2.microsoft.com/library/System.Web.HttpContext.Current.aspx" target="_blank"&gt;current HTTP Context&lt;/a&gt; from the &lt;a title="Application_Start method" href="http://msdn2.microsoft.com/library/de0d8a1c-b1bc-48e1-b246-26e32289a82f.aspx" target="_blank"&gt;HTTP Application Start &amp;quot;event&amp;quot;&lt;/a&gt;, &lt;a title="IIS7 Integrated mode: Request is not available in this context exception in Application_Start" href="http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx" target="_blank"&gt;which is not available at this point&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;This is an already &lt;a title="Request is not available in this context - Feb 2008" href="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=23221" target="_blank"&gt;known issue&lt;/a&gt; and you can &lt;a title="IIS7 Issue - Microsoft.Practices.CompositeWeb uses HttpRequest in Application_Start Title is required" href="http://www.codeplex.com/websf/WorkItem/View.aspx?WorkItemId=15451" target="_blank"&gt;vote to get it solved&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Meanwhile, there are two ways to work around this:&lt;/p&gt;
&lt;h4 align="justify"&gt;Changing the Composite Web Application Block&lt;/h4&gt;
&lt;p align="justify"&gt;If you are comfortable with having your own build of this block instead of the provided strong named one, you only need to change one statement in the WebConfigModuleInfoStore class (WCSFBlocks-Feb2008\CompositeWeb\Source\CompositeWeb\Services\WebConfigModuleInfoStore.cs, line 105).&lt;/p&gt;
&lt;p align="justify"&gt;Just replace:&lt;/p&gt;&lt;pre class="code" style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;configuration =
    &lt;span style="COLOR:#2b91af;"&gt;WebConfigurationManager&lt;/span&gt;.OpenWebConfiguration(context.Request.ApplicationPath + &lt;span style="COLOR:#a31515;"&gt;&amp;quot;/&amp;quot; &lt;/span&gt;+
                                                 configFilePath.Replace(context.Request.PhysicalApplicationPath, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;p&gt;with:&lt;/p&gt;&lt;pre class="code" style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;configuration =
    &lt;font color="#2b91af"&gt;WebConfigurationManager&lt;/font&gt;.OpenWebConfiguration(&lt;font color="#2b91af"&gt;HttpRuntime&lt;/font&gt;.AppDomainAppVirtualPath + &lt;span style="COLOR:#a31515;"&gt;&amp;quot;/&amp;quot; &lt;/span&gt;+
                                                 configFilePath.Substring(&lt;font color="#2b91af"&gt;HttpRuntime&lt;/font&gt;.AppDomainAppPath.Length));&lt;/pre&gt;
&lt;h4&gt;Changing the application&lt;/h4&gt;
&lt;p align="justify"&gt;If you prefer to (or have to) use the provided and strong named version of the Composite Web Application Block, you can always change your application.&lt;/p&gt;
&lt;p align="justify"&gt;Just open the generated global.asax file:&lt;/p&gt;&lt;pre class="code" style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="BACKGROUND:#ffee62;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;@ &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;Application &lt;/span&gt;&lt;span style="COLOR:red;"&gt;Language&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;C#&amp;quot; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;Inherits&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;Microsoft.Practices.CompositeWeb.WebClientApplication&amp;quot; &lt;/span&gt;&lt;span style="BACKGROUND:#ffee62;"&gt;%&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p align="justify"&gt;and add:&lt;/p&gt;&lt;pre class="code" style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;script &lt;/span&gt;&lt;span style="COLOR:red;"&gt;RunAt&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;

    private bool &lt;/span&gt;initialized;

    &lt;span style="COLOR:blue;"&gt;protected override void &lt;/span&gt;Application_Start(&lt;span style="COLOR:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="COLOR:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.initialized = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;;
    }

    &lt;span style="COLOR:blue;"&gt;protected void &lt;/span&gt;Application_BeginRequest(&lt;span style="COLOR:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="COLOR:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(!&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.initialized)
        {
            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.initialized = &lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;;

            &lt;span style="COLOR:blue;"&gt;base&lt;/span&gt;.Application_Start(sender, e);
        }
    }

&lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;script&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1539873" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WCSF/default.aspx">WCSF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PnP/default.aspx">PnP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftwareFactories/default.aspx">SoftwareFactories</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS/default.aspx">IIS</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Techdays/default.aspx">Techdays</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechdaysPT08/default.aspx">TechdaysPT08</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/IIS7/default.aspx">IIS7</category></item><item><title>Web Client Software Factory 2.0 shipped</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/02/29/web-client-software-factory-2-0-shipped.aspx</link><pubDate>Fri, 29 Feb 2008 01:54:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1527570</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1527570</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1527570</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/02/29/web-client-software-factory-2-0-shipped.aspx#comments</comments><description>&lt;div style="border-right:1px solid;border-top:1px solid;border-left:1px solid;width:550px;border-bottom:1px solid;text-align:center;"&gt; &lt;p&gt;&lt;img src="http://msdn2.microsoft.com/en-us/library/Bb264518.pponline(en-us,MSDN.10).gif" alt="" /&gt; &lt;/p&gt; &lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;&lt;span style="font-size:22pt;color:black;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Web Client Software Factory 2.0&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;&lt;span style="color:black;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;February 2008 Release&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:12pt;color:black;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="left"&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="left"&gt;MSDN site: &lt;a href="http://msdn.microsoft.com/webclientfactory" target="_blank"&gt;http://msdn.microsoft.com/webclientfactory&lt;/a&gt; &lt;/div&gt; &lt;li&gt; &lt;div align="left"&gt;Community site: &lt;a href="http://www.codeplex.com/websf" target="_blank"&gt;http://www.codeplex.com/websf&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;p&gt;&lt;b&gt;About the Deliverable&lt;/b&gt; &lt;/p&gt; &lt;p align="justify"&gt;The Web Client Software Factory (WCSF) provides a set of guidance for architects and developers building enterprise Web applications. The factory includes samples, reusable code and a guidance package which automates key development tasks from within Visual Studio. &lt;/p&gt; &lt;p align="justify"&gt;Using the Web Client Software Factory assets, developers can create &lt;a title="Composite Web Clients" href="http://www.codeplex.com/websf/Wiki/View.aspx?title=Composite%20Web%20Clients&amp;amp;referringTitle=Home" target="_blank"&gt;Composite Web&lt;/a&gt; applications composed of independently developed and deployed modules. These modules are dynamically brought together at runtime into a common shell. Additionally the factory includes support for ASP.NET AJAX thus providing users with a richer and more responsive user experience. &lt;/p&gt; &lt;p&gt;&lt;b&gt;New In This Release&lt;/b&gt; &lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt; &lt;p align="justify"&gt;The February 2008 release of the Web Client Software Factory has the following improvements to the June 2007 release. &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Full support for Visual Studio 2008 and .NET Framework 3.5 &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added ASP.NET AJAX extenders for Context Sensitive Autocomplete, AJAX Validation, and Real Time Search that can be used in existing ASP.NET sites and ASP.NET sites built using the Composite Web Application Block. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added UI Composition capability through extending our dependency injection mechanism to support Pages, User Controls and Master Pages. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added Dependency Injection on ASMX Web Services and JSON services. &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added a new set of Quickstarts and How-To topics on MVP, Modularity and the new AJAX extenders &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added a new Order Entry Reference application that demonstrates all of the new functionality. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;In addition, this release of WCSF has the following community issues and fixes: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;42 Workitems closed including the top-voted items on CodePlex &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Add ASP.NET AJAX Support (97 votes) &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Web Client Software Factory Support for Enterprise Library 3.1 (62 votes) &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Services through configuration (32 votes) &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Support for using the Validation Application Block (16 votes) &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Recipe support for Visual Basic .NET (20 votes) &lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align="justify"&gt;Added Presenter support for Master Pages (11 votes)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1527570" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WCSF/default.aspx">WCSF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PnP/default.aspx">PnP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftwareFactories/default.aspx">SoftwareFactories</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PageFlow/default.aspx">PageFlow</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>FormsAuthentication And Query String Parameteres</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/02/15/formsauthentication-and-query-string-parameteres.aspx</link><pubDate>Fri, 15 Feb 2008 00:40:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1514718</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1514718</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1514718</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/02/15/formsauthentication-and-query-string-parameteres.aspx#comments</comments><description>&lt;p align="justify"&gt;Today I ran into this strange&amp;quot;feature&amp;quot; of &lt;a title="The Official Microsoft ASP.NET Site" href="http://asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt;:&lt;/p&gt; &lt;p style="padding-left:20px;text-align:justify;"&gt;&lt;strong&gt;When redirecting to the login page, the query string parameters are encoded with the requested URL into the ReturnUrl query string parameter of the request to the login page, but are also in the query string of the request to the login page.&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;Here is an example:&lt;/p&gt; &lt;p style="padding-left:20px;text-align:justify;"&gt;When requesting:&lt;/p&gt; &lt;p style="padding-left:40px;text-align:justify;"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://localhost:5014/FormsAuthentication/default.aspx?test=true&lt;/font&gt;&lt;/u&gt;&lt;/p&gt; &lt;p style="padding-left:20px;text-align:justify;"&gt;we are redirected to:&lt;/p&gt; &lt;p style="padding-left:40px;text-align:justify;"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://localhost:5014/FormsAuthentication/login.aspx?ReturnUrl=%2fFormsAuthentication%2fdefault.aspx%3ftest%3dtrue&amp;amp;test=true&lt;/font&gt;&lt;/u&gt;&lt;/p&gt; &lt;p align="justify"&gt;See the &lt;strong&gt;test&lt;/strong&gt; parameter?&lt;/p&gt; &lt;p align="justify"&gt;As far as I know, this is not documented or overridable.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1514718" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category></item></channel></rss>