<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/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>Itai Goldstein</title><link>http://blogs.microsoft.co.il/blogs/itai/</link><description>.NET Cooking Adventures</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>SkyDrive Explorer</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2010/02/03/skydrive-explorer.aspx</link><pubDate>Wed, 03 Feb 2010 13:54:56 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:513635</guid><dc:creator>itai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=513635</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=513635</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2010/02/03/skydrive-explorer.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_001DA4DA.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="SkyDrive Explorer" border="0" alt="SkyDrive Explorer" align="right" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_70D4858E.png" width="174" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Microsoft SkyDrive is a very useful storage service. it gives you 25 GB of storage where you can store any files you’d like when each file weigh no more than 50 MB.&lt;/p&gt;  &lt;p&gt;If you decide to use SkyDrive (which I highly recommend), check out &lt;a href="http://skydriveexplorer.com/" target="_blank"&gt;SkyDrive Explorer&lt;/a&gt; – this tool improves the SkyDrive experience and allows using SkyDrive similarly as using another drive on your computer.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_10A2E94A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_334ED9D8.png" width="408" height="160" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here’s where you can download it from: &lt;a href="http://skydriveexplorer.com/download.php" target="_blank"&gt;SkyDrive Explorer download&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Enjoy,&lt;/p&gt;  &lt;p&gt;Itai&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=513635" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SkyDrive/default.aspx">SkyDrive</category></item><item><title>IIS SEO Toolkit Beta Released</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/06/03/iis-seo-toolkit-beta-released.aspx</link><pubDate>Thu, 04 Jun 2009 03:39:33 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:328860</guid><dc:creator>itai</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=328860</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=328860</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/06/03/iis-seo-toolkit-beta-released.aspx#comments</comments><description>&lt;p&gt;Microsoft are shipping today a new tool – IIS &lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization" target="_blank"&gt;Search Engine Optimization&lt;/a&gt; Toolkit – which helps developers to analyze their site from SEO prospective.&lt;/p&gt;  &lt;p&gt;When a site is SEO Optimized – it basically means that this site is designed in a way that search engines can easily relate it to specific keywords so it will appear high on the search engine results.&lt;/p&gt;  &lt;p&gt;The tool that Microsoft are releasing today helps the developers identify mistakes as broken links, poorly chosen title, description and more.&lt;/p&gt;  &lt;p&gt;Read more about it at &lt;a href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;Scott Guthrie&lt;/a&gt; excellent blog post here: &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/06/03/iis-search-engine-optimization-toolkit.aspx" target="_blank"&gt;IIS Search Engine Optimization Toolkit post&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_67041DAB.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_75DB26F8.png" width="566" height="377" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=328860" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SEO/default.aspx">SEO</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/IIS/default.aspx">IIS</category></item><item><title>How To: Font Embedding In Silverlight</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/10/how-to-font-embedding-in-silverlight.aspx</link><pubDate>Sun, 10 May 2009 18:19:04 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:288158</guid><dc:creator>itai</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=288158</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=288158</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/10/how-to-font-embedding-in-silverlight.aspx#comments</comments><description>&lt;p&gt;Silverlight includes nine basic core fonts (these fonts can be rendered correctly on any browser and operating system Silverlight supports):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Arial &lt;/li&gt;    &lt;li&gt;Arial Black &lt;/li&gt;    &lt;li&gt;Comic Sans MS &lt;/li&gt;    &lt;li&gt;Courier New &lt;/li&gt;    &lt;li&gt;Georgia &lt;/li&gt;    &lt;li&gt;Lucida Grande / Lucida Sans Unicode &lt;/li&gt;    &lt;li&gt;Times New Roman &lt;/li&gt;    &lt;li&gt;Trebuchet MS &lt;/li&gt;    &lt;li&gt;Verdana &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;But what can you do when you like to use another font which is not included in the core fonts list?&lt;/p&gt;  &lt;p&gt;The answer is embedding the desired font in your Silverlight application:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add the font file to your application and set the &lt;strong&gt;Build Action&lt;/strong&gt; to &lt;strong&gt;Resource&lt;/strong&gt;:      &lt;br /&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_719E67F1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_7F099C59.png" width="187" height="457" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Set the FontFamily property in the following format: &lt;font color="#0080ff"&gt;FontFileName&lt;font color="#ff8040"&gt;#&lt;/font&gt;FontName&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;TextBlock &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;Text&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;This is Calibri Font&amp;quot; 
           &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;FontFamily&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;CALIBRI.TTF#Calibri&amp;quot; 
           &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;FontSize&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;20&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;            
&amp;lt;/&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;TextBlock&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/a&gt;

  &lt;p&gt;Or you can achieve the same effect in the code behind:&lt;/p&gt;

  &lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;StreamResourceInfo &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;sri &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Application&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetResourceStream(
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Uri&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;SilverlightApplication1;component/CALIBRI.TTF&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;, 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;UriKind&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Relative));
TextBlock1&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;FontSource &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;FontSource&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(sri&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Stream);
TextBlock1&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;FontFamily &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;FontFamily&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;Calibri&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;And here’s the result:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_2224508E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_35D13A22.png" width="356" height="83" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Hope you find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=288158" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>And the Emmy goes to… Silverlight!</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/07/and-the-emmy-goes-to-silverlight.aspx</link><pubDate>Fri, 08 May 2009 03:09:07 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:285834</guid><dc:creator>itai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=285834</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=285834</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/07/and-the-emmy-goes-to-silverlight.aspx#comments</comments><description>&lt;p&gt;NBC Olympics wins an Emmy for its online coverage of 2008 Summer Olympics where &lt;a href="http://team.silverlight.net/announcements/nbc-olympics-wins-an-emmy-with-silverlight/" target="_blank"&gt;Silverlight took&lt;/a&gt; a major part in “Outstanding New Approaches Sport Event Coverage”.&lt;/p&gt;  &lt;p&gt;This should boost up Silverlight reputation..&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=285834" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Azure Design Patterns Site</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/05/azure-design-patterns-site.aspx</link><pubDate>Tue, 05 May 2009 19:58:23 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:283148</guid><dc:creator>itai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=283148</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=283148</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/05/05/azure-design-patterns-site.aspx#comments</comments><description>&lt;p&gt;I came across this &lt;a href="http://azuredesignpatterns.cloudapp.net/" target="_blank"&gt;Azure Design Patterns&lt;/a&gt; site which I found very interesting and worth sharing.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=283148" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Azure/default.aspx">Azure</category></item><item><title>Cheat Sheets</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/31/cheat-sheets.aspx</link><pubDate>Tue, 31 Mar 2009 14:03:37 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:262352</guid><dc:creator>itai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=262352</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=262352</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/31/cheat-sheets.aspx#comments</comments><description>&lt;p&gt;This might come handy for some of you out there: &lt;a href="http://www.cheat-sheets.org/" target="_blank"&gt;cheat sheets for developers and students&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=262352" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category></item><item><title>Generating SQL Server DB scripts</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/26/generating-sql-server-db-scripts.aspx</link><pubDate>Thu, 26 Mar 2009 18:25:57 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:258752</guid><dc:creator>itai</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=258752</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=258752</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/26/generating-sql-server-db-scripts.aspx#comments</comments><description>&lt;p&gt;This solution is probably known to a lot of you out there, but for the ones who don’t, here is the solution in a Step-By-Step tutorial:&lt;/p&gt;  &lt;p&gt;In SQL Server Management Studio right click on one of the databases on your Object Explorer, and choose Tasks-&amp;gt;Generate Scripts…:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_3293BC83.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_5091CA77.png" width="448" height="320" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then you’ll be introduced with the SQL Server Scripts Wizard:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_3DFC5AB3.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_3CD74BC7.png" width="434" height="332" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Next, you need to choose the database you would like to generate scripts for, in this step you can choose whether to script all objects in your database, or you can set the ones you want in a latter step:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_34930063.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_4B8C3A70.png" width="418" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now you need to choose your script options:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_5EB2887E.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_7A59A525.png" width="372" height="315" /&gt;&lt;/a&gt;In the following steps you need to configure which object types you would like to script, and choose the specific objects (unless you decided to check the “Script all objects in the selected database” option):&lt;/p&gt;  &lt;p&gt;The Object types you want to script:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_4EE2CDAD.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_4927B407.png" width="376" height="321" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And the objects:&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_697CB348.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_39DE94BC.png" width="372" height="315" /&gt;&lt;/a&gt;In the last step, you need to choose where to output the script to:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_5756072A.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_2C65CB38.png" width="401" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That’s it.&lt;/p&gt;  &lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=258752" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Configuring AJAX Extensions In SharePoint</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/23/configuring-ajax-extensions-in-sharepoint.aspx</link><pubDate>Mon, 23 Mar 2009 16:53:36 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:255531</guid><dc:creator>itai</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=255531</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=255531</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/03/23/configuring-ajax-extensions-in-sharepoint.aspx#comments</comments><description>&lt;p&gt;Using &lt;a href="http://www.codeplex.com/smartpart" target="_blank"&gt;&lt;strong&gt;SmartPart&lt;/strong&gt;&lt;/a&gt; in SharePoint can reduce web parts development time.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.codeplex.com/smartpart" target="_blank"&gt;&lt;strong&gt;SmartPart&lt;/strong&gt;&lt;/a&gt; install document includes instructions on configuring AJAX Extensions on &lt;strong&gt;SharePoint&lt;/strong&gt; website configuration file, but it lacks 2 issues I’ve encountered while enabling &lt;a href="http://www.codeplex.com/smartpart" target="_blank"&gt;&lt;strong&gt;SmartPart&lt;/strong&gt;&lt;/a&gt; on my SharePoint website:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;This is pretty straight forward – if you’re using a more advanced version of the AJAX extensions – you should update its full assembly name:      &lt;pre class="code"&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;Assembly&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;ReturnOfSmartPart, Version=1.3.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5&amp;quot;&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;Under runtime-&amp;gt;assemblyBinding tags add a dependent assembly tag: 
    &lt;pre class="code"&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;assemblyIdentity &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;name&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;System.Web.Extensions&amp;quot; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;publicKeyToken&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;31bf3856ad364e35&amp;quot; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;/&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;bindingRedirect &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;oldVersion&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;1.0.0.0-1.1.0.0&amp;quot; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;newVersion&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;3.5.0.0&amp;quot; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=255531" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SmartPart/default.aspx">SmartPart</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>How To: Implement HMAC Authentication On a RESTful WCF Service</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx</link><pubDate>Sun, 22 Feb 2009 21:21:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:233996</guid><dc:creator>itai</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=233996</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=233996</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx#comments</comments><description>&lt;p&gt;There are several approaches in implementing authentication in &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd203052.aspx" target="_blank"&gt;RESTful WCF&lt;/a&gt;&lt;/strong&gt; services. Using &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Transport_Layer_Security" target="_blank"&gt;SSL&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Digest_access_authentication" target="_blank"&gt;Digest Authentication&lt;/a&gt;&lt;/strong&gt; are two options, while in this post I would like to demonstrate another approach which uses &lt;a href="http://en.wikipedia.org/wiki/HMAC" target="_blank"&gt;&lt;strong&gt;HMAC&lt;/strong&gt;&lt;/a&gt; (Hash Message Authentication Code) in order to achieve both message authentication and integrity.&lt;/p&gt;  &lt;p&gt;In this approach the server provides the client an ID and a secret key through some technique (e.g. sending an email containing the ID and the secret key) which will be used by the client to sign all his requests.&lt;/p&gt;  &lt;p&gt;A secret key can be generated in the following way:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] secretkey &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:cyan;"&gt;Byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;64&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;];
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;RNGCryptoServiceProvider &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;rng &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;RNGCryptoServiceProvider&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;();
rng&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetBytes(secretkey);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;This post will not cover what is a RESTful service and how should we implement all it’s properties in WCF, for this purpose you can refer to &lt;a href="http://msdn.microsoft.com/en-us/library/dd203052.aspx" target="_blank"&gt;this great article&lt;/a&gt; which I used in my research prior to this post.&lt;/p&gt;

&lt;p&gt;In our example the service will provide specific user’s bookmarks to its consumer. In order to consume this service, a requester must provide some hashed message (in our case – the request Uri encrypted with the secret key) in the request header authorization property (different implementations of the client would be provided in future posts). &lt;/p&gt;

&lt;p&gt;So without further ado&amp;#39;s, this is the service contract method definition:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebGet&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(UriTemplate &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;users/{username}/bookmarks?tag={tag}&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;)]
[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;OperationContract&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;]
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Bookmarks &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetUserBookmarks(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;username, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;tag);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;The contract enforces us to use the specified Uri template which implies that for a specific username (the requested user) and specific tag filter, the requester will be provided with a bookmarks list matching this criteria.&lt;/p&gt;

&lt;p&gt;Here is the service method implementation:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;public &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Bookmarks &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetUserBookmarks(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;username, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;tag)
{
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebOperationContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;context &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebOperationContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Current;
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;OutgoingWebResponseContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;outgoingResponseContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;context&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;OutgoingResponse;                       

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;bool &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;isUserAuthenticated &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;IsUserAuthenticated(username);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;if &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(isUserAuthenticated &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;== &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;false&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;)
    {
        outgoingResponseContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;StatusCode &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Unauthorized;
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return null&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;;
    }
    
    outgoingResponseContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;StatusCode &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;OK;
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Bookmarks &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;bookmarks &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Bookmarks&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;BookmarksProvider&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetUserBookmarks(username, tag));

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;bookmarks;
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;The simple implementation I used here suggests that the request is being checked for its user’s authentication: if the authentication fails, the requester will be responded with Unauthorized HTTP status code (401) and no bookmarks. If the authentication succeeds – the bookmarks list is provided along with OK HTTP status code (200).&lt;/p&gt;

&lt;p&gt;I’ve skipped the BookmarksProvider.GetUserBookmarks method implementation due to it’s irrelevancy for this post subject.&lt;/p&gt;

&lt;p&gt;Here is my implementation for the IsUserAuthenticated method:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;private bool &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;IsUserAuthenticated(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;username)
{
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebOperationContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;context &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebOperationContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Current;
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;IncomingWebRequestContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;incomingRequestContext &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;context&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;IncomingRequest;

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;requestUri &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;incomingRequestContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;UriTemplateMatch&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;RequestUri&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ToString();
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;authorizationHeader &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;incomingRequestContext&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Headers[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;HttpRequestHeader&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Authorization];

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;authenticationToekn &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Format(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;{1}{0}{2}&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;, 
            &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Delimeters&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;FirstClassDelimeter, 
            authorizationHeader, 
            requestUri);

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] userKey &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetUserKey(username);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;bool &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;isValidHash &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Authentication&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ValidateHash(
        userKey,
        authenticationToekn, 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Delimeters&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;FirstClassDelimeter, 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;UTF8Encoding&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;UTF8);

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;isValidHash;
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;This method composes an authentication token (this is a pure implementation step – it is up to the server to decide it’s protocol – and up to the client to obey in order to consume..) from the request Uri and the hashed authorization header. Then the authentication token is being validated along with the current requester secret key (fetched by the GetUserKey method) through the Authentication.ValidateHash method:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;public static bool &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ValidateHash(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] key, 
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;message, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;delimeter, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Encoding &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encoding)
{
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HMACMD5 &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;hmacMD5 &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HMACMD5&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(key);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] messageParts &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;message&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Split(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new string&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] { delimeter },
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;StringSplitOptions&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;RemoveEmptyEntries);

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;if &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(messageParts &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;== &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;null &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;|| &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;messageParts&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Length &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;&amp;lt; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;2&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;)
    {
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return false&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;;
    }

    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedText &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;messageParts[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;0&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;];
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;text &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;messageParts[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;1&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;];
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] textBytes &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encoding&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetBytes(text);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] computedHash &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;hmacMD5&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ComputeHash(textBytes);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;computedHashString &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Convert&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ToBase64String(computedHash);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedText&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Equals(computedHashString);
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;In the validation method, the authentication token is being split to the message and hashed message parts – in our case, it’s the request Uri and the request Uri hashed using the requester’s secret key. After the parts are split, the secret key is being used to generate the hashed message (using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacmd5.aspx" target="_blank"&gt;HMACMD5 class&lt;/a&gt;) again in order to be compared to the received hashed message. If the hashed messages are equal then the authentication is ok, otherwise it is invalid.&lt;/p&gt;

&lt;p&gt;There are several ways to consume this service. In this post I’ll go over one of them in which a console application consumes our service:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] key &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetUserKey();
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;uri &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;http://localhost:4609/ServiceHost/BookmarksService.svc/users/itai/bookmarks?tag=News&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;;
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HttpWebRequest &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;request &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;WebRequest&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Create(uri) &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;as &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HttpWebRequest&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;;
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedUri &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Authentication&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;EncodeText(key, uri, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;UTF8Encoding&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;UTF8);
request&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Headers[&lt;/span&gt;&lt;span style="background:#4a4a4a;color:olive;"&gt;HttpRequestHeader&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Authorization] &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedUri;
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HttpWebResponse &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;response &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;request&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetResponse() &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;as &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HttpWebResponse&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;;
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Stream &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;bookmarksStream &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetResponseStream();
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;StreamReader &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;reader &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;StreamReader&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(bookmarksStream);
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;str &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;reader&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ReadToEnd();
reader&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Close();
bookmarksStream&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Close();
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;As you can see for yourself, this client is rather simple: prepare the request object using service Uri and define the authorization header using the client secret key to hash the message (in our case it is the request Uri), then send the request and parse the response (XML formatted).&lt;/p&gt;

&lt;p&gt;Here is Authentication.EncodeText method implementation:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;public static string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;EncodeText(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] key, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;text, &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Encoding &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encoding)
{
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HMACMD5 &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;hmacMD5 &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;new &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;HMACMD5&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;(key);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] textBytes &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encoding&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;GetBytes(text);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;byte&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;[] encodedTextBytes &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;hmacMD5&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ComputeHash(textBytes);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedText &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;=
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Convert&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ToBase64String(encodedTextBytes);
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;encodedText;
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p&gt;And here are our client results:&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_6B0127CD.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="433" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_03987731.png" width="559" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;u&gt;Summary&lt;/u&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;In this post I’ve implemented a &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd203052.aspx" target="_blank"&gt;RESTful WCF&lt;/a&gt;&lt;/strong&gt; service which is protected by &lt;a href="http://en.wikipedia.org/wiki/HMAC" target="_blank"&gt;&lt;strong&gt;HMAC&lt;/strong&gt;&lt;/a&gt; authentication token which is being passed in the service request header by a simple service consumer.&lt;/p&gt;

&lt;p&gt;In my upcoming posts, I’ll review another different client implementations – stay tuned..&lt;/p&gt;

&lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;References:&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd203052.aspx" target="_blank"&gt;A Guide to Designing and Building RESTful Web Services with WCF 3.5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacmd5.aspx" target="_blank"&gt;HMACMD5 at MSDN&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=233996" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/HMAC/default.aspx">HMAC</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Authentication/default.aspx">Authentication</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Configuration shortcuts (or IntelliSense for configuration file)</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/18/configuration-shortcuts-or-intellisense-for-configuration-file.aspx</link><pubDate>Wed, 18 Feb 2009 15:39:49 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:231458</guid><dc:creator>itai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=231458</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=231458</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/18/configuration-shortcuts-or-intellisense-for-configuration-file.aspx#comments</comments><description>&lt;p&gt;&lt;font face="Verdana" size="2"&gt;The configuration &lt;strong&gt;appSettings&lt;/strong&gt; &amp;amp; &lt;strong&gt;connectionStrings&lt;/strong&gt; sections are highly used in our daily application development.&lt;/font&gt;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;appSettings&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;add &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;key&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;ApplicationName&amp;quot; &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;value&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;=&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;&amp;quot;ConfigurationShortcutsSample&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;appSettings&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;&amp;gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;The way we usually access the values which are stored within these sections is through the &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx"&gt;&lt;font face="Verdana" size="2"&gt;ConfigurationManager&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; class when we specify the section key string:&lt;/font&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;applicationName
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;= &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;ConfigurationManager&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;AppSettings
        [&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;AppSettingsKeys&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ApplicationName];
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;font size="2"&gt;This methodology could lead us developers to mistakes which can be detected only at runtime in case we mistyped the application setting key string.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;I would like to offer another way of accessing these sections which will prevent us from mistyping the application setting key and even provide sort of IntelliSense. &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;In this way, we need to write a static class which will hold the keys for our configuration section keys in static properties:&lt;/font&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;div style="background:#4a4a4a;"&gt;
&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;public static class &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;AppSettingsKeys
&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;{
    &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;public static string &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;ApplicationName 
    { 
        &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;get &lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;{ &lt;/span&gt;&lt;span style="background:#4a4a4a;color:#0080ff;"&gt;return &lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;ApplicationName&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;; } 
    }        
}
&lt;/span&gt;
&lt;/div&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;font size="+0"&gt;That’s it.. now we can access our configuration application settings keys with the help of our static class:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_6C3A6650.png"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/a&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_2D16A544.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="163" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_1BE17077.png" width="576" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;font size="2"&gt;Summary&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;In this post I reviewed a way to have shortcuts to our configuration file appSettings &amp;amp; connectionStrings sections which can act as IntelliSense and prevent us from coding mistakes which can be detected only on runtime.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;Hope you’ll find it useful.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=231458" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/IntelliSense/default.aspx">IntelliSense</category></item><item><title>Redirecting on a callback</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/11/redirecting-on-a-callback.aspx</link><pubDate>Wed, 11 Feb 2009 13:24:32 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:226961</guid><dc:creator>itai</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=226961</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=226961</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/11/redirecting-on-a-callback.aspx#comments</comments><description>&lt;p&gt;&lt;font face="Verdana" size="2"&gt;In &lt;a href="http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/21/exposing-user-control-client-events-to-host-page-server-side.aspx" target="_blank"&gt;one of my previous posts&lt;/a&gt;, I reviewed a way to handle client side events on the server side by using the &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163941.aspx"&gt;&lt;font face="Verdana" size="2"&gt;Callback&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; feature of &lt;/font&gt;&lt;a href="http://www.asp.net/"&gt;&lt;font face="Verdana" size="2"&gt;ASP.NET&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; 2.0.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana" size="2"&gt;But what about redirecting from the current page when you handle the client event?&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana" size="2"&gt;You’ll find that it is not possible: “Response.Redirect cannot be called in a Page callback.” or “Server.Transfer cannot be called in a Page callback.” messages will appear in case you’ll use &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms524309.aspx"&gt;&lt;font face="Verdana" size="2"&gt;Response.Redirect&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; or &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms525800.aspx"&gt;&lt;font face="Verdana" size="2"&gt;Server.Transfer&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; operations&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana" size="2"&gt;In order to redirect to another page at the end of your flow, you’ll have to do it in the client side &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163941.aspx"&gt;&lt;font face="Verdana" size="2"&gt;callback&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; handler which was defined at the &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.getcallbackeventreference.aspx"&gt;&lt;font face="Verdana" size="2"&gt;ClientScriptManager.GetCallbackEventReference&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; method:&lt;/font&gt;&lt;/p&gt;  &lt;div&gt;   &lt;pre class="csharpcode"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_3E39F1EB.png"&gt;&lt;img title="Redirecting on a callback" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="83" alt="Redirecting on a callback" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_726E1B31.png" width="512" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt;&amp;#160;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;font face="Verdana" size="2"&gt;Hope you’ll find it useful.&lt;/font&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=226961" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Redirect/default.aspx">Redirect</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Server.Transfer/default.aspx">Server.Transfer</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Callback/default.aspx">Callback</category></item><item><title>Improve your ASP.NET Website User Experience: Flush Down your partial Response</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/08/improve-your-asp-net-website-user-experience-flush-down-your-partial-response.aspx</link><pubDate>Sun, 08 Feb 2009 13:46:28 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:224693</guid><dc:creator>itai</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=224693</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=224693</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/08/improve-your-asp-net-website-user-experience-flush-down-your-partial-response.aspx#comments</comments><description>&lt;p&gt;There are times when your website page needs to do some heavy work on the server side and you don’t want your user to wait till the work is complete to get a response.&lt;/p&gt;  &lt;p&gt;In these cases you can use the &lt;a href="http://msdn.microsoft.com/en-us/library/ms525585.aspx" target="_blank"&gt;Response.Write&lt;/a&gt; &amp;amp; &lt;a href="http://msdn.microsoft.com/en-us/library/ms525560.aspx" target="_blank"&gt;Response.Flush&lt;/a&gt; methods, and here is a short example (on the HTML source side):&lt;/p&gt;  &lt;div style="background:#4a4a4a;"&gt;   &lt;pre class="code"&gt;&lt;span style="background:#4a4a4a;color:silver;"&gt;        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Write(&lt;span style="color:red;"&gt;&amp;quot;1st response...&amp;quot;&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Flush(); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; System&lt;span style="color:lime;"&gt;.&lt;/span&gt;Threading&lt;span style="color:lime;"&gt;.&lt;/span&gt;&lt;span style="color:mediumslateblue;"&gt;Thread&lt;/span&gt;&lt;span style="color:lime;"&gt;.&lt;/span&gt;Sleep(&lt;span style="color:orange;"&gt;2000&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Write(&lt;span style="color:red;"&gt;&amp;quot;2nd response...&amp;quot;&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Flush(); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; System&lt;span style="color:lime;"&gt;.&lt;/span&gt;Threading&lt;span style="color:lime;"&gt;.&lt;/span&gt;&lt;span style="color:mediumslateblue;"&gt;Thread&lt;/span&gt;&lt;span style="color:lime;"&gt;.&lt;/span&gt;Sleep(&lt;span style="color:orange;"&gt;2000&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Write(&lt;span style="color:red;"&gt;&amp;quot;3rd response...&amp;quot;&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Flush(); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Write(&lt;span style="color:red;"&gt;&amp;quot;4th response...&amp;quot;&lt;/span&gt;); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
        &lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt; Response&lt;span style="color:lime;"&gt;.&lt;/span&gt;Flush(); &lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;When you’ll run this code, you’ll find that the page is loaded with “1st response…” message, after 2 more seconds, the “2nd response…” would popup, and after 2 more seconds, the last two messages would appear.&lt;/p&gt;

&lt;p&gt;This means that we can show our website users some response while our server doing some work.&lt;/p&gt;

&lt;p&gt;This will work also on the code-behind, but needs a little tweak..&lt;/p&gt;

&lt;div style="background:#4a4a4a;"&gt;
  &lt;pre class="code"&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Write(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;1st response...&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
    System&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Threading&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Thread&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Sleep(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;2000&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Write(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;2nd response...&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
    System&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Threading&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#8080ff;"&gt;Thread&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Sleep(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:#ff8000;"&gt;2000&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Write(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;3rd response...&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Write(&lt;/span&gt;&lt;span style="background:#4a4a4a;color:red;"&gt;&amp;quot;4th response...&amp;quot;&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;);
    Response&lt;/span&gt;&lt;span style="background:#4a4a4a;color:lime;"&gt;.&lt;/span&gt;&lt;span style="background:#4a4a4a;color:white;"&gt;Flush();
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;You probably notice that each &lt;a href="http://msdn.microsoft.com/en-us/library/ms525560.aspx" target="_blank"&gt;Response.Flush&lt;/a&gt; appear twice, this is not a mistake - The reason is that sometimes when &lt;a href="http://www.velocityreviews.com/forums/t94099-problems-with-responseflush.html#6" target="_blank"&gt;“you have to use more than a handful of toilet paper, it’s best to flush twice”&lt;/a&gt;..&lt;/p&gt;

&lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=224693" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/User+Experience/default.aspx">User Experience</category></item><item><title>Quince - User Experience Design patterns Exploration Tool</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/03/quince-user-experience-design-patterns-exploration-tool.aspx</link><pubDate>Tue, 03 Feb 2009 21:41:06 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:221351</guid><dc:creator>itai</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=221351</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=221351</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/03/quince-user-experience-design-patterns-exploration-tool.aspx#comments</comments><description>&lt;p&gt;There is no need to break your head each time you try to find the best way to design your application user interface in order to provide the best user experience to your application users.&lt;/p&gt;  &lt;p&gt;You can check out the &lt;a href="http://quince.infragistics.com/#/Main" target="_blank"&gt;Infragistics Quince&lt;/a&gt; which is a User experience (UX) patterns exploration tool.&lt;/p&gt;  &lt;p&gt;There are different ways to find the pattern you are looking for:&lt;/p&gt;  &lt;p&gt;Here is exploring all patterns method:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_0451C84A.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="394" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_079083A7.png" width="657" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And here is exploring by tag relations method:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_5668D54C.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="323" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_6F1A8D40.png" width="574" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And the pattern description screen is very intuitive:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_1DE7F7F6.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="389" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_1505392C.png" width="648" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;You can check out this &lt;a href="http://blogs.infragistics.com/blogs/ux/archive/2009/02/02/introducing-quince-a-ux-design-pattern-explorer.aspx" target="_blank"&gt;blog post&lt;/a&gt;, which introduces this tool.&lt;/p&gt;  &lt;p&gt;Hope you’ll find it useful.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=221351" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/User+Experience/default.aspx">User Experience</category></item><item><title>T-SQL Split function</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx</link><pubDate>Sun, 01 Feb 2009 20:54:11 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:220218</guid><dc:creator>itai</dc:creator><slash:comments>35</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=220218</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=220218</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx#comments</comments><description>&lt;p&gt;&lt;font face="Verdana" size="2"&gt;During one of the projects I worked on, I had to parse a text which was passed from the application in my T-SQL code. I found that T-SQL had no built-in string system function for this operation, which I find rather useful, especially in cases you need to perform some batch based operations (which helps accelerate your application performance by reducing round trips to the DB).&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Verdana" size="2"&gt;So I came up with the following solution:&lt;/font&gt;&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FUNCTION&lt;/span&gt; [dbo].[Split]
(    
    @RowData NVARCHAR(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;),
    @Delimeter NVARCHAR(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;)
)
&lt;span style="color:#0000ff;"&gt;RETURNS&lt;/span&gt; @RtnValue &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; 
(
    ID &lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;IDENTITY&lt;/span&gt;(1,1),
    &lt;span style="color:#0000ff;"&gt;Data&lt;/span&gt; NVARCHAR(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;)
) 
&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;BEGIN&lt;/span&gt; 
    &lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @Iterator &lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Iterator = 1

    &lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @FoundIndex &lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @FoundIndex = CHARINDEX(@Delimeter,@RowData)

    &lt;span style="color:#0000ff;"&gt;WHILE&lt;/span&gt; (@FoundIndex&amp;gt;0)
    &lt;span style="color:#0000ff;"&gt;BEGIN&lt;/span&gt;
        INSERT &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; @RtnValue (&lt;span style="color:#0000ff;"&gt;data&lt;/span&gt;)
        &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; 
            &lt;span style="color:#0000ff;"&gt;Data&lt;/span&gt; = LTRIM(RTRIM(&lt;span style="color:#0000ff;"&gt;SUBSTRING&lt;/span&gt;(@RowData, 1, @FoundIndex - 1)))

        &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @RowData = &lt;span style="color:#0000ff;"&gt;SUBSTRING&lt;/span&gt;(@RowData,
                @FoundIndex + DATALENGTH(@Delimeter) / 2,
                LEN(@RowData))

        &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Iterator = @Iterator + 1
        &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @FoundIndex = CHARINDEX(@Delimeter, @RowData)
    &lt;span style="color:#0000ff;"&gt;END&lt;/span&gt;
    
    INSERT &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; @RtnValue (&lt;span style="color:#0000ff;"&gt;Data&lt;/span&gt;)
    &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Data&lt;/span&gt; = LTRIM(RTRIM(@RowData))

    &lt;span style="color:#0000ff;"&gt;RETURN&lt;/span&gt;
END&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Note that this implementation uses &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/da-db_4.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;DATALENGTH&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; function instead of the &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/la-lz_1.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;LEN&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; function, and that is due to the fact that &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/la-lz_1.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;LEN&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; doesn’t consider the leading spaces in the given string variable – this can harm the parsed result. Another difference between &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/da-db_4.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;DATALENGTH&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; and &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/la-lz_1.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;LEN&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; is that &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/da-db_4.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;DATALENGTH&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; returns the result as the number of bytes used where &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/la-lz_1.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;LEN&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; returns the result as number of characters, and that is the reason we should divide the &lt;/font&gt;&lt;a href="http://doc.ddart.net/mssql/sql70/da-db_4.htm" target="_blank"&gt;&lt;font face="Verdana" size="2"&gt;DATALENGTH&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; result with 2.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Here is an example of how to use the Split function:&lt;/font&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @Str NVARCHAR(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @Str = &lt;span style="color:#006080;"&gt;&amp;#39;This#$#is#$#my#$#test&amp;#39;&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; *
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;   [dbo].[Split] (@Str, &lt;span style="color:#006080;"&gt;&amp;#39;#$#&amp;#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;And here are the results:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_43E37BC9.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="193" alt="image" src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_3E286223.png" width="368" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;font face="Verdana" size="2"&gt;Summary&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;In this post I reviewed my implementation for T-SQL string Split function which you may find useful when parsing strings in T-SQL, especially in cases you would like to improve your application performance by doing some batch based operations.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Hope you’ll find it useful.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=220218" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DATALENGTH/default.aspx">DATALENGTH</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/LEN/default.aspx">LEN</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Split+function/default.aspx">Split function</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/T-SQL/default.aspx">T-SQL</category></item><item><title>Transform List&lt;T&gt; to List&lt;K&gt; where T inherits from K</title><link>http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx</link><pubDate>Mon, 26 Jan 2009 02:02:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:217094</guid><dc:creator>itai</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/rsscomments.aspx?PostID=217094</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/itai/commentapi.aspx?PostID=217094</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx#comments</comments><description>&lt;p&gt;Download &lt;font size="2"&gt;ListExtension.cs file : &lt;a href="http://uaa19g.bay.livefilestore.com/y1pyiKWGFhJ0uq7J7zXsATiHjsZ5B1TJ0H1gtsVC5RUKTfV2D9FEu3VND-ugCbxxdIi0ZvfFlb7g_kfouT-XM8BTw/ListExtension.cs?download" style="border-width:0px;"&gt;&lt;img src="http://blogs.microsoft.co.il/photos/itai/images/214709/original.aspx" style="border-width:0px;" border="0" alt="" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Sometimes it is useful to copy one list contents to another which its type is more general.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Let me emphasize my intent with a small example:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Let there be a &lt;font color="#00ff40"&gt;Dog&lt;/font&gt;, &lt;font color="#00ff40"&gt;Cat&lt;/font&gt; &amp;amp; a &lt;font color="#00ff40"&gt;Mouse&lt;/font&gt; types which inherit from &lt;font color="#00ff40"&gt;Animal&lt;/font&gt; type, and let there be some lists: &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Dog&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt;, &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Cat&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; &amp;amp; &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Mouse&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; list that we would like to union to one &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Animal&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; list in order to perform an general operation on all of the animals objects.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Here’s an example of these classes implementation for clarifying purpose:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_77F0F996.png"&gt;&lt;font size="2"&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_35BD6B46.png" title="image" style="border-width:0px;display:inline;" alt="image" width="300" border="0" height="299" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;We can try adding the specific lists to the general list (e.g.: adding &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Dog&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; to &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Animal&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt;):&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_563715DC.png"&gt;&lt;font size="2"&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_2319A4BF.png" title="image" style="border-width:0px;display:inline;" alt="image" width="607" border="0" height="265" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Casting dogs list to &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;&lt;font color="#00ff40"&gt;Animal&lt;/font&gt;&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; is also not allowed. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;So we need a way to transform the specific type list to its general type form, something like the following:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_5B421301.png"&gt;&lt;font size="2"&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_0BA35049.png" title="image" style="border-width:0px;display:inline;" alt="image" width="440" border="0" height="95" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;In order to enable us to perform the precedes we’ll use the &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank"&gt;&lt;font size="2"&gt;Extension Method&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; feature in .NET 3.5 to extend the &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;T&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; type with the Transform method:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/itai/image_4C4D4ECB.png"&gt;&lt;font size="2"&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/itai/image_thumb_0CA2F239.png" title="image" style="border-width:0px;display:inline;" alt="image" width="579" border="0" height="328" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Note how the Transform method signature enforces T type to inherit from K type using the &lt;font color="#8080c0"&gt;where&lt;/font&gt; keyword.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;font size="2"&gt;Summary&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;In this post I reviewed a way to transform one typed generic list &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;T&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; to another typed generic list &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;K&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; in case that the type T inherits from the type K and used &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank"&gt;&lt;font size="2"&gt;Extension Method&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; feature to add this capability to the &lt;font color="#8080c0"&gt;List&amp;lt;&lt;/font&gt;T&lt;font color="#8080c0"&gt;&amp;gt;&lt;/font&gt; class.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Hope you’ll find it useful.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fitai%2farchive%2f2009%2f01%2f25%2ftransform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fitai%2farchive%2f2009%2f01%2f25%2ftransform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
      &lt;tr&gt;
        &lt;td class="sbmText"&gt;Share it:&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://social.msdn.microsoft.com/en-us/action/create/s/E/?url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;ttl=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to MSDN!" target="_blank"&gt;&lt;img src="http://www.dotnetscraps.com/dotnetscraps/samples/sbmtool/msdn.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://social.technet.microsoft.com/en-us/action/create/s/E/?url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;ttl=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to Technet!" target="_blank"&gt;&lt;img src="http://www.dotnetscraps.com/dotnetscraps/samples/sbmtool/technet.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://del.icio.us/post?url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to del.icio.us" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to del.iri.ous!" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://digg.com/submit?phase=2&amp;amp;url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to digg" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to dotnetkicks" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://www.facebook.com/sharer.php?u=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;t=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to Facebook" target="_blank"&gt;&lt;img src="http://blogs.technet.com/photos/james/images/1765319/original.aspx" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to live" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://reddit.com/submit?url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to reddit!" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to spurl" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://technorati.com/faves/?add=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;title=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to technorati!" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td&gt;&lt;a href="http://myweb.yahoo.com/myresults/bookmarklet?u=http://blogs.microsoft.co.il/blogs/itai/archive/2009/01/25/transform-list-lt-t-gt-to-list-lt-k-gt-where-t-inherits-from-k.aspx&amp;amp;t=Transform%20List%3CT%3E%20to%20List%3CK%3E%20where%20T%20inherits%20from%20K" title="Post it to yahoo!" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=217094" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Generics/default.aspx">Generics</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/Extension+Methods/default.aspx">Extension Methods</category><category domain="http://blogs.microsoft.co.il/blogs/itai/archive/tags/C_2300_/default.aspx">C#</category></item></channel></rss>