<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>dnknormark.net</title>
    <description>A developers third place...</description>
    <link>http://www.dnknormark.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.0.0</generator>
<language>en-GB</language><blogChannel:blogRoll>http://www.dnknormark.net/opml.axd</blogChannel:blogRoll><blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd?format=rss</blogChannel:blink><dc:creator>Martin H. Normark</dc:creator><dc:title>dnknormark.net</dc:title><geo:lat>0.000000</geo:lat><geo:long>0.000000</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/dnknormark" type="application/rss+xml" /><feedburner:emailServiceId>dnknormark</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/dnknormark" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fdnknormark" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Search Twitter from C# using LINQ to XML</title><description>&lt;p&gt;In some applications, it could be cool to have a feature that enabled the user to quickly get a glimpse of what people are saying on &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; about the user or their product, service, company etc.&lt;/p&gt;  &lt;p&gt;For instance, a service like &lt;a href="http://getsatisfaction.com"&gt;GetSatisfaction.com&lt;/a&gt; has a feature just like that. They call it &lt;a href="http://getsatisfaction.com/dell/overheard"&gt;Overheard&lt;/a&gt;, and this is what it looks like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=overheard.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="overheard" border="0" alt="overheard" src="http://www.dnknormark.net/image.axd?picture=overheard_thumb.jpg" width="621" height="513" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There’s nothing like Twitter to give you feedback. I think &lt;a href="http://mediatemple.net/"&gt;MediaTemple&lt;/a&gt; felt the &lt;a href="http://search.twitter.com/search?q=+mediatemple+since%3A2009-02-26+until%3A2009-02-28"&gt;effect of unhappy customers on Twitter&lt;/a&gt; when their servers broke down, and stayed there for more than two days!&lt;/p&gt;  &lt;p&gt;Anyway. I wanted to search from C#, and get back a DataTable. Here’s how it’s done:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Searches Twitter for the specified query.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;query&amp;quot;&amp;gt;The query.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Returns the search results as a DataTable&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DataTable Search(&lt;span class="kwrd"&gt;string&lt;/span&gt; query)
    {
      DataTable dt = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;pubdate&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;authorname&amp;quot;&lt;/span&gt;);
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;authorlink&amp;quot;&lt;/span&gt;);

      XDocument tweetResults = XDocument.Load(String.Format(&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;      &lt;span class="str"&gt;&amp;quot;http://search.twitter.com/search.atom?q={0}&amp;quot;&lt;/span&gt;, HttpUtility.UrlEncode(query)));&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;
      XNamespace atomNS = &lt;span class="str"&gt;&amp;quot;http://www.w3.org/2005/Atom&amp;quot;&lt;/span&gt;;
      var q = from tweet &lt;span class="kwrd"&gt;in&lt;/span&gt; tweetResults.Descendants(atomNS + &lt;span class="str"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
              select &lt;span class="kwrd"&gt;new&lt;/span&gt;
              {
                Text = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)tweet.Element(atomNS + &lt;span class="str"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;),
                Html = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)tweet.Element(atomNS + &lt;span class="str"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;),
                DatePublished = DateTime.Parse((&lt;span class="kwrd"&gt;string&lt;/span&gt;)tweet.Element(atomNS + &lt;span class="str"&gt;&amp;quot;published&amp;quot;&lt;/span&gt;)),
                Id = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)tweet.Element(atomNS + &lt;span class="str"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;),
                Link = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)tweet.Elements(atomNS + &lt;span class="str"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;)
                .Where(link =&amp;gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;)link.Attribute(&lt;span class="str"&gt;&amp;quot;rel&amp;quot;&lt;/span&gt;) == &lt;span class="str"&gt;&amp;quot;alternate&amp;quot;&lt;/span&gt;)
                .Select(link =&amp;gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;)link.Attribute(&lt;span class="str"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;))
                .First(),
                Author = (from author &lt;span class="kwrd"&gt;in&lt;/span&gt; tweet.Descendants(atomNS + &lt;span class="str"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;)
                          select &lt;span class="kwrd"&gt;new&lt;/span&gt;
                          {
                            Name = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)author.Element(atomNS + &lt;span class="str"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;),
                            Uri = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)author.Element(atomNS + &lt;span class="str"&gt;&amp;quot;uri&amp;quot;&lt;/span&gt;),
                          }).First()
              };
      
      &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var item &lt;span class="kwrd"&gt;in&lt;/span&gt; q)
      {
        dt.Rows.Add(item.Text, item.Html, item.DatePublished, item.Id, item.Link, &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;                    item.Author.Name, item.Author.Uri);
      }

      &lt;span class="kwrd"&gt;return&lt;/span&gt; dt;
    }&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=Wl4ZH3yKeWI:PwYtNi03eBQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=Wl4ZH3yKeWI:PwYtNi03eBQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=Wl4ZH3yKeWI:PwYtNi03eBQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=Wl4ZH3yKeWI:PwYtNi03eBQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=Wl4ZH3yKeWI:PwYtNi03eBQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=Wl4ZH3yKeWI:PwYtNi03eBQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=Wl4ZH3yKeWI:PwYtNi03eBQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/Wl4ZH3yKeWI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/Wl4ZH3yKeWI/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/Search-Twitter-from-C-using-LINQ-to-XML.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=a419e2bb-2124-4d7d-a966-1afd9efd2161</guid><pubDate>Mon, 16 Mar 2009 21:28:08 +0200</pubDate><category>C#</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=a419e2bb-2124-4d7d-a966-1afd9efd2161</pingback:target><slash:comments>8</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=a419e2bb-2124-4d7d-a966-1afd9efd2161</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Search-Twitter-from-C-using-LINQ-to-XML.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=a419e2bb-2124-4d7d-a966-1afd9efd2161</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=a419e2bb-2124-4d7d-a966-1afd9efd2161</feedburner:origLink></item><item><title>Migrate web.config to support the IIS 7 Integrated Pipeline</title><description>&lt;p&gt;Whenever you deploy a website to &lt;strong&gt;IIS 7&lt;/strong&gt; that is not compliant with the IIS 7 integrated pipeline, you will get an error like this one:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=iis7integratedpipelineerror.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="iis7-integrated-pipeline-error" border="0" alt="iis7-integrated-pipeline-error" src="http://www.dnknormark.net/image.axd?picture=iis7integratedpipelineerror_thumb.png" width="644" height="458" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Not the great error message you get. It actually gives you the solution right away: &lt;strong&gt;Migrate Web.config to support the integrated pipeline. &lt;/strong&gt;To do that, start a command prompt, and execute: &lt;/p&gt;  &lt;p&gt;&lt;b&gt;%SystemRoot%\system32\inetsrv\appcmd migrate config &amp;quot;test/&amp;quot;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;After doing this, our Web.config is changed to support the IIS 7 integrated pipeline and we can see the website.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=YxbtcGfIVVE:u119cMGH52A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=YxbtcGfIVVE:u119cMGH52A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=YxbtcGfIVVE:u119cMGH52A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=YxbtcGfIVVE:u119cMGH52A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=YxbtcGfIVVE:u119cMGH52A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=YxbtcGfIVVE:u119cMGH52A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=YxbtcGfIVVE:u119cMGH52A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/YxbtcGfIVVE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/YxbtcGfIVVE/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/Migrate-webconfig-to-support-the-IIS-7-Integrated-Pipeline.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=f20dd65b-bff9-4446-a1b6-d02c228d2032</guid><pubDate>Sun, 15 Mar 2009 22:13:47 +0200</pubDate><category>IIS7</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=f20dd65b-bff9-4446-a1b6-d02c228d2032</pingback:target><slash:comments>3</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=f20dd65b-bff9-4446-a1b6-d02c228d2032</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Migrate-webconfig-to-support-the-IIS-7-Integrated-Pipeline.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=f20dd65b-bff9-4446-a1b6-d02c228d2032</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=f20dd65b-bff9-4446-a1b6-d02c228d2032</feedburner:origLink></item><item><title>Automatically translate Global and Local Resource (resx) files</title><description>&lt;p&gt;Yesterday, I blogged about how you can &lt;a href="http://dnknormark.net/post/Translate-text-in-C-using-Google-Translate.aspx"&gt;use Google Translate to translate a string in C#&lt;/a&gt;. To make it more useful than just a simple translator, and because I need to translate some Global Resource files for an E-commerce website that I’m working on, I wanted to create a small Windows Application in C# that could read a Global Resource file (.resx) and translate it into a selected language using the &lt;a href="http://dnknormark.net/post/Translate-text-in-C-using-Google-Translate.aspx"&gt;method for translating a word in C#&lt;/a&gt; that i blogged about yesterday.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=image.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://www.dnknormark.net/image.axd?picture=image_thumb.png" width="451" height="166" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is how it looks so far. You simply select the resource file you want to translate. Select the current language of the resource file in the middle box, and select the language you want to translate it to in the last box. Click &lt;strong&gt;Translate&lt;/strong&gt; at it should work. The new resource file will be saved in the same location as the application itself.&lt;/p&gt; &lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-146a3db7b364e824.skydrive.live.com/embedrowdetail.aspx/Public/ResxTranslator.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=SScAAMomJk4:fTvYfFGxFMQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=SScAAMomJk4:fTvYfFGxFMQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=SScAAMomJk4:fTvYfFGxFMQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=SScAAMomJk4:fTvYfFGxFMQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=SScAAMomJk4:fTvYfFGxFMQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=SScAAMomJk4:fTvYfFGxFMQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=SScAAMomJk4:fTvYfFGxFMQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/SScAAMomJk4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/SScAAMomJk4/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/Automatically-translate-Global-and-Local-Resource-(resx)-files.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=7b9c2f28-6797-49bb-8a90-908ae94b8351</guid><pubDate>Fri, 13 Mar 2009 22:31:14 +0200</pubDate><category>C#</category><category>Internationalization</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=7b9c2f28-6797-49bb-8a90-908ae94b8351</pingback:target><slash:comments>10</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=7b9c2f28-6797-49bb-8a90-908ae94b8351</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Automatically-translate-Global-and-Local-Resource-(resx)-files.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=7b9c2f28-6797-49bb-8a90-908ae94b8351</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=7b9c2f28-6797-49bb-8a90-908ae94b8351</feedburner:origLink></item><item><title>Translate text in C#, using Google Translate</title><description>&lt;p&gt;Sometimes, it would be great to be able to translate a text from e.g. English to Danish directly from C#. This could be useful when you want to translate a &lt;a href="http://msdn.microsoft.com/en-us/library/ekyft91f(VS.80).aspx"&gt;Resource file&lt;/a&gt; into another language.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://translate.google.com/"&gt;Google Translate&lt;/a&gt; is awesome. There’s also &lt;a href="http://www.windowslivetranslator.com/"&gt;Windows Live Translator&lt;/a&gt;, but Microsoft are far behind Google (also) in this game.&lt;/p&gt;  &lt;p&gt;Code:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text.RegularExpressions;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Utilities
{
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Translator
  {
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Translates the text.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;The input.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;languagePair&amp;quot;&amp;gt;The language pair.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TranslateText(&lt;span class="kwrd"&gt;string&lt;/span&gt; input, &lt;span class="kwrd"&gt;string&lt;/span&gt; languagePair)
    {
      &lt;span class="kwrd"&gt;return&lt;/span&gt; TranslateText(input, languagePair, System.Text.Encoding.UTF7);
    }

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Translate Text using Google Translate&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;The string you want translated&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;languagePair&amp;quot;&amp;gt;2 letter Language Pair, delimited by &amp;quot;|&amp;quot;. &lt;/span&gt;
    &lt;span class="rem"&gt;/// e.g. &amp;quot;en|da&amp;quot; language pair means to translate from English to Danish&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;encoding&amp;quot;&amp;gt;The encoding.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Translated to String&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TranslateText(&lt;span class="kwrd"&gt;string&lt;/span&gt; input, &lt;span class="kwrd"&gt;string&lt;/span&gt; languagePair, Encoding encoding)
    {
      &lt;span class="kwrd"&gt;string&lt;/span&gt; url = String.Format(&lt;span class="str"&gt;&amp;quot;http://www.google.com/translate_t?hl=en&amp;amp;ie=UTF8&amp;amp;text={0}&amp;amp;langpair={1}&amp;quot;&lt;/span&gt;, input, languagePair);

      &lt;span class="kwrd"&gt;string&lt;/span&gt; result = String.Empty;

      &lt;span class="kwrd"&gt;using&lt;/span&gt; (WebClient webClient = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient())
      {
        webClient.Encoding = encoding;
        result = webClient.DownloadString(url);
      }

      Match m = Regex.Match(result, &lt;span class="str"&gt;&amp;quot;(?&amp;lt;=&amp;lt;div id=result_box dir=\&amp;quot;ltr\&amp;quot;&amp;gt;)(.*?)(?=&amp;lt;/div&amp;gt;)&amp;quot;&lt;/span&gt;);

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (m.Success)
        result = m.Value;

      &lt;span class="kwrd"&gt;return&lt;/span&gt; result;
    }
  }
}&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;The translated string is fetched by the RegEx close to the bottom. This could of course change, and you have to keep it up to date.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZCMqjmjZRxg:rwHINTJCtaY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZCMqjmjZRxg:rwHINTJCtaY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=ZCMqjmjZRxg:rwHINTJCtaY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZCMqjmjZRxg:rwHINTJCtaY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZCMqjmjZRxg:rwHINTJCtaY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=ZCMqjmjZRxg:rwHINTJCtaY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZCMqjmjZRxg:rwHINTJCtaY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/ZCMqjmjZRxg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/ZCMqjmjZRxg/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/Translate-text-in-C-using-Google-Translate.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=a0f72805-3e12-4953-9f3f-c38d9efc3efb</guid><pubDate>Thu, 12 Mar 2009 00:14:26 +0200</pubDate><category>C#</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=a0f72805-3e12-4953-9f3f-c38d9efc3efb</pingback:target><slash:comments>12</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=a0f72805-3e12-4953-9f3f-c38d9efc3efb</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Translate-text-in-C-using-Google-Translate.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=a0f72805-3e12-4953-9f3f-c38d9efc3efb</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=a0f72805-3e12-4953-9f3f-c38d9efc3efb</feedburner:origLink></item><item><title>ASP.NET Search Engine Optimization</title><description>&lt;p&gt;I made a few E-commerce websites a few years back when I was self-employed. Ranking well in the search engines is very important for E-commerce websites in order to get relevant visitors, and if your site is designed well for converting, visitors into sales, you will make money. That’s the way it goes.&lt;/p&gt;  &lt;p&gt;A lot of naive CEO’s and alike, think that you absolutely have to hire expensive SEO consultants in order to rank well. That is *not* true. Instead, why don’t you just spent your time and money on making original, relevant and great content? That’s a true winner. &lt;/p&gt;  &lt;p&gt;Though, there’s still a few technical details you have to get right. &lt;/p&gt;  &lt;p&gt;Make sure to set a unique page title on all your pages. Use the same text as a &amp;lt;h1&amp;gt; tag on the page.&lt;/p&gt;  &lt;p&gt;Don’t screw up your URLs. You will get punished having the same content on those URLs: &lt;a href="http://www.example.com/producs/computers?sortorder=price&amp;amp;page=2"&gt;www.example.com/producs/computers?sortorder=price&amp;amp;page=2&lt;/a&gt; and &lt;a href="http://www.example.com/producs/computers?page=2&amp;amp;sortorder=price"&gt;www.example.com/producs/computers?page=2&amp;amp;sortorder=price&lt;/a&gt;. This is called duplicate content, and search engines doesn’t like that. You can use the new &lt;a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html"&gt;canonical tag&lt;/a&gt; for telling search engines which one is original.&lt;/p&gt;  &lt;p&gt;Make internal links absolute. Yes. You shouldn’t do this: &amp;lt;a href=”/page1.htm”&amp;gt;Page 1&amp;lt;/a&amp;gt;. Do this instead: &amp;lt;a href=”http://www.example.com/page1.htm”&amp;gt;Page 1&amp;lt;/a&amp;gt;. &lt;/p&gt;  &lt;p&gt;301 permanent redirect example.com to &lt;a href="http://www.example.com"&gt;www.example.com&lt;/a&gt; or vice versa. Allowing visitors to access your page on both URLs, will also be treated as duplicate content.&lt;/p&gt;  &lt;p&gt;If you’re moving your website to a new platform, server, technology and your URLs will change. Make sure not to return 404 on the old URLs. You have to 301 permanent redirect the old URLs to the new ones. Otherwise you will lose all your current search engine carma.&lt;/p&gt;  &lt;p&gt;I use those two methods to set page information, and 301 redirect:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetMetaInformation()
  {
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Title = PageTitle;

    HtmlMeta metaKeywords = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlMeta();
    metaKeywords.Name = &lt;span class="str"&gt;&amp;quot;keywords&amp;quot;&lt;/span&gt;;
    metaKeywords.Content = &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaKeywords;
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Header.Controls.Add(metaKeywords);

    HtmlMeta metaDescription = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlMeta();
    metaDescription.Name = &lt;span class="str"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;;
    metaDescription.Content = &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaDescription;
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Header.Controls.Add(metaDescription);

    HtmlMeta metaRobots = &lt;span class="kwrd"&gt;new&lt;/span&gt; HtmlMeta();
    metaRobots.Name = &lt;span class="str"&gt;&amp;quot;robots&amp;quot;&lt;/span&gt;;
    metaRobots.Content = &lt;span class="kwrd"&gt;this&lt;/span&gt;.MetaRobots;
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.Header.Controls.Add(metaRobots);
  }

  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PermanentRedirect(&lt;span class="kwrd"&gt;string&lt;/span&gt; newUrl)
  {
    Response.Status = &lt;span class="str"&gt;&amp;quot;301 Moved Permanently&amp;quot;&lt;/span&gt;;
    Response.StatusCode = 301;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;    Response.AddHeader(&lt;span class="str"&gt;&amp;quot;Location&amp;quot;&lt;/span&gt;, newUrl);
  }&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;You also want to take a look at the &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=40318&amp;amp;hl=en"&gt;Google SiteMap&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Create a generic handler in ASP.NET and call it sitemap.ashx. Generate and XML string like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;UTF-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;urlset&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.sitemaps.org/schemas/sitemap/0.9&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;url&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;loc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;http://www.example.com/&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;loc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;lastmod&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2005-01-01&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;lastmod&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;changefreq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;monthly&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;changefreq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;priority&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0.8&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;priority&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;url&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;urlset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Take a further look at &lt;a href="http://www.codinghorror.com/blog/archives/001174.html"&gt;the importance of sitemaps&lt;/a&gt;, if you want to know why you should use one. &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=3lH6qiH0XvU:q0sku5w6zVQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=3lH6qiH0XvU:q0sku5w6zVQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=3lH6qiH0XvU:q0sku5w6zVQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=3lH6qiH0XvU:q0sku5w6zVQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=3lH6qiH0XvU:q0sku5w6zVQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=3lH6qiH0XvU:q0sku5w6zVQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=3lH6qiH0XvU:q0sku5w6zVQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/3lH6qiH0XvU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/3lH6qiH0XvU/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/ASPNET-Search-Engine-Optimization.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=dbcc22e6-b5ae-4f5e-add9-265d740d666d</guid><pubDate>Wed, 11 Mar 2009 17:46:04 +0200</pubDate><category>ASP.NET</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=dbcc22e6-b5ae-4f5e-add9-265d740d666d</pingback:target><slash:comments>1</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=dbcc22e6-b5ae-4f5e-add9-265d740d666d</trackback:ping><wfw:comment>http://www.dnknormark.net/post/ASPNET-Search-Engine-Optimization.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=dbcc22e6-b5ae-4f5e-add9-265d740d666d</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=dbcc22e6-b5ae-4f5e-add9-265d740d666d</feedburner:origLink></item><item><title>C# TwitPic API client</title><description>&lt;p&gt;I’ve spent some time lately, playing around with the &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; &lt;a href="http://apiwiki.twitter.com/"&gt;API&lt;/a&gt;. And along with that belongs the &lt;a href="http://twitpic.com/"&gt;TwitPic&lt;/a&gt;’s &lt;a href="http://twitpic.com/api.do"&gt;API&lt;/a&gt;. I’m using Twitter a lot, to stay in touch with tech news, other developers and just for fun. But it’s getting more and more used for a lot of different things, and I needed it to integrate with an E-commerce platform I’m developing.&lt;/p&gt;  &lt;p&gt;The code for post a picture to TwitPic looks like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// URL for the TwitPic API's upload method&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TWITPIC_UPLADO_API_URL = &lt;span class="str"&gt;&amp;quot;http://twitpic.com/api/upload&amp;quot;&lt;/span&gt;;

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// URL for the TwitPic API's upload and post method&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TWITPIC_UPLOAD_AND_POST_API_URL = &lt;span class="str"&gt;&amp;quot;http://twitpic.com/api/uploadAndPost&amp;quot;&lt;/span&gt;;

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Uploads the photo and sends a new Tweet&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;binaryImageData&amp;quot;&amp;gt;The binary image data.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;tweetMessage&amp;quot;&amp;gt;The tweet message.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;filename&amp;quot;&amp;gt;The filename.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;Return true, if the operation was succeded.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; UploadPhoto(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] binaryImageData, &lt;span class="kwrd"&gt;string&lt;/span&gt; tweetMessage, &lt;span class="kwrd"&gt;string&lt;/span&gt; filename)
    {
      &lt;span class="rem"&gt;// Documentation: http://www.twitpic.com/api.do&lt;/span&gt;
      &lt;span class="kwrd"&gt;string&lt;/span&gt; boundary = Guid.NewGuid().ToString();
      &lt;span class="kwrd"&gt;string&lt;/span&gt; requestUrl = String.IsNullOrEmpty(tweetMessage) ? TWITPIC_UPLADO_API_URL : TWITPIC_UPLOAD_AND_POST_API_URL;
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
      &lt;span class="kwrd"&gt;string&lt;/span&gt; encoding = &lt;span class="str"&gt;&amp;quot;iso-8859-1&amp;quot;&lt;/span&gt;;

      request.PreAuthenticate = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
      request.AllowWriteStreamBuffering = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
      request.ContentType = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;multipart/form-data; boundary={0}&amp;quot;&lt;/span&gt;, boundary);
      request.Method = &lt;span class="str"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;;

      &lt;span class="kwrd"&gt;string&lt;/span&gt; header = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;--{0}&amp;quot;&lt;/span&gt;, boundary);
      &lt;span class="kwrd"&gt;string&lt;/span&gt; footer = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;--{0}--&amp;quot;&lt;/span&gt;, boundary);

      StringBuilder contents = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();
      contents.AppendLine(header);

      &lt;span class="kwrd"&gt;string&lt;/span&gt; fileContentType = GetImageContentType(filename);
      &lt;span class="kwrd"&gt;string&lt;/span&gt; fileHeader = String.Format(&lt;span class="str"&gt;&amp;quot;Content-Disposition: file; name=\&amp;quot;{0}\&amp;quot;; filename=\&amp;quot;{1}\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;media&amp;quot;&lt;/span&gt;, filename);
      &lt;span class="kwrd"&gt;string&lt;/span&gt; fileData = Encoding.GetEncoding(encoding).GetString(binaryImageData);

      contents.AppendLine(fileHeader);
      contents.AppendLine(String.Format(&lt;span class="str"&gt;&amp;quot;Content-Type: {0}&amp;quot;&lt;/span&gt;, fileContentType));
      contents.AppendLine();
      contents.AppendLine(fileData);

      contents.AppendLine(header);
      contents.AppendLine(String.Format(&lt;span class="str"&gt;&amp;quot;Content-Disposition: form-data; name=\&amp;quot;{0}\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;));
      contents.AppendLine();
      contents.AppendLine(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Username);

      contents.AppendLine(header);
      contents.AppendLine(String.Format(&lt;span class="str"&gt;&amp;quot;Content-Disposition: form-data; name=\&amp;quot;{0}\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;));
      contents.AppendLine();
      contents.AppendLine(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Password.ToInsecureString());

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(tweetMessage))
      {
        contents.AppendLine(header);
        contents.AppendLine(String.Format(&lt;span class="str"&gt;&amp;quot;Content-Disposition: form-data; name=\&amp;quot;{0}\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;));
        contents.AppendLine();
        contents.AppendLine(tweetMessage);
      }

      contents.AppendLine(footer);

      &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] bytes = Encoding.GetEncoding(encoding).GetBytes(contents.ToString());
      request.ContentLength = bytes.Length;

      &lt;span class="kwrd"&gt;using&lt;/span&gt; (Stream requestStream = request.GetRequestStream())
      {
        requestStream.Write(bytes, 0, bytes.Length);

        &lt;span class="kwrd"&gt;using&lt;/span&gt; (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
          &lt;span class="kwrd"&gt;using&lt;/span&gt; (StreamReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(response.GetResponseStream()))
          {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; result = reader.ReadToEnd();

            XDocument doc = XDocument.Parse(result);

            XElement rsp = doc.Element(&lt;span class="str"&gt;&amp;quot;rsp&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;string&lt;/span&gt; status = rsp.Attribute(XName.Get(&lt;span class="str"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;)) != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? rsp.Attribute(XName.Get(&lt;span class="str"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;)).Value : rsp.Attribute(XName.Get(&lt;span class="str"&gt;&amp;quot;stat&amp;quot;&lt;/span&gt;)).Value;

            &lt;span class="kwrd"&gt;return&lt;/span&gt; status.ToUpperInvariant().Equals(&lt;span class="str"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;);
          }
        }
      }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=V74StWhXN1Y:k39Xns56t1M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=V74StWhXN1Y:k39Xns56t1M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=V74StWhXN1Y:k39Xns56t1M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=V74StWhXN1Y:k39Xns56t1M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=V74StWhXN1Y:k39Xns56t1M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=V74StWhXN1Y:k39Xns56t1M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=V74StWhXN1Y:k39Xns56t1M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/V74StWhXN1Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/V74StWhXN1Y/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/C-TwitPic-API-client.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=aabea254-926e-4b5e-ac93-8cca2139564a</guid><pubDate>Tue, 10 Mar 2009 22:51:38 +0200</pubDate><category>C#</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=aabea254-926e-4b5e-ac93-8cca2139564a</pingback:target><slash:comments>14</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=aabea254-926e-4b5e-ac93-8cca2139564a</trackback:ping><wfw:comment>http://www.dnknormark.net/post/C-TwitPic-API-client.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=aabea254-926e-4b5e-ac93-8cca2139564a</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=aabea254-926e-4b5e-ac93-8cca2139564a</feedburner:origLink></item><item><title>ASP.NET MVC and Classic ASP</title><description>&lt;p&gt;As I pointed out in my &lt;a href="http://www.dnknormark.net/post/Is-the-use-of-AJAX-on-the-web-voting-for-a-change-to-ASPNET-MVC.aspx"&gt;blog post&lt;/a&gt; a few days ago, I see several reasons why you should make the switch to &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;. On the other hand, you have to remember that &lt;a href="http://msdn.microsoft.com/en-us/library/ms973868.aspx"&gt;ASP.NET WebForms&lt;/a&gt; has been around for many years, and is a very mature technology. We all know that new technology has its initial flaws.&lt;/p&gt;  &lt;p&gt;I was fooling a little around with the technology, specifically some databinding where I had a &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx"&gt;DataTable&lt;/a&gt; and wanted to display a Table with the contents. My instant thought was: “This is like databinding back in the days of &lt;a href="http://en.wikipedia.org/wiki/Active_Server_Pages"&gt;Classic ASP&lt;/a&gt;”…&lt;/p&gt;  &lt;p&gt;Take a look at this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Get data from database&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;
&lt;span class="str"&gt;' Data connection
Set Conn = Server.CreateObject(&amp;quot;ADODB.Connection&amp;quot;)
DSN = &amp;quot;DRIVER={Microsoft Access Driver (*.mdb)}; &amp;quot;
DSN = DSN &amp;amp; &amp;quot;DBQ=&amp;quot; &amp;amp; Server.MapPath(&amp;quot;/cgi-bin/database.mdb&amp;quot;)
Conn.Open DSN

'&lt;/span&gt; SQL statement
strSQL = &lt;span class="str"&gt;&amp;quot;Select * from Employees&amp;quot;&lt;/span&gt;
Set rs = Conn.Execute(strSQL)

Do

   Response.Write rs(&lt;span class="str"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;) &amp;amp; &lt;span class="str"&gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;

   rs.MoveNext

Loop While Not rs.EOF

Conn.Close
Set Conn = Nothing
&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;Good old Classic ASP that is. You’ve got to admit that you had seamless control of the HTML that was being rendered!&lt;/p&gt;

&lt;p&gt;Which is also the case with ASP.NET MVC. MVC offers you control and simplicity, as opposed to WebForms where you place a server control on the form, and sometimes you ended up with your HTML a complete mess…&lt;/p&gt;

&lt;p&gt;Of course, MVC is a lot more maintainable and structured, than Classic ASP was. You instantly get a separation of concerns with the &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model, View and Controller design pattern&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So we can fetch data in our Controller:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()
    {
      DataTable dt = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();
      dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;Column1&amp;quot;&lt;/span&gt;);

      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);
      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);
      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);
      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);
      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);
      dt.Rows.Add(&lt;span class="str"&gt;&amp;quot;Test 1&amp;quot;&lt;/span&gt;);

      ViewData.Model = dt;
      
      &lt;span class="kwrd"&gt;return&lt;/span&gt; View();
    }&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;And display it, somewhat like we did back in the days of Classic ASP:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (System.Data.DataRow item &lt;span class="kwrd"&gt;in&lt;/span&gt; ((System.Data.DataTable)ViewData.Model).Rows) 
   { &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;
    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.Encode(item[0].ToString()) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; } &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;To be honest, I actually likes going back to basics and getting full control of my HTML. Working in WebForms, you sometimes search for control settings to enable or disable the rendering of a certain piece of HTML. I think it is a lot easier to just give you full control.&lt;/p&gt;

&lt;p&gt;But on the other hand, I could easily see a lot of the Classic ASP ‘bad habits’ return. Classic ASP can be *ugly* as hell, which means the maintainability is very poor. The same could happen with MVC if you aren’t disciplined enough. WebForms sort of put you in a box, but you could still make it look pretty ugly as well…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASP.NET MVC Release Candidate links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release-candidate-now-available.aspx"&gt;ScottGu’s release candidate blog post&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://stephenwalther.com/blog/archive/2009/01/27/a-guide-to-learning-asp.net-mvc-release-candidate-1.aspx"&gt;Stephen Walther’s guide to learning ASP.NET MVC&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l3aASPEolwg:lpS_qC_i8oE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l3aASPEolwg:lpS_qC_i8oE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=l3aASPEolwg:lpS_qC_i8oE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l3aASPEolwg:lpS_qC_i8oE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l3aASPEolwg:lpS_qC_i8oE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=l3aASPEolwg:lpS_qC_i8oE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l3aASPEolwg:lpS_qC_i8oE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/l3aASPEolwg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/l3aASPEolwg/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/ASPNET-MVC-and-Classic-ASP.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=15c348a3-3c93-4bdf-98c4-8017d5202714</guid><pubDate>Mon, 02 Feb 2009 00:09:12 +0200</pubDate><category>ASP.NET</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=15c348a3-3c93-4bdf-98c4-8017d5202714</pingback:target><slash:comments>11</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=15c348a3-3c93-4bdf-98c4-8017d5202714</trackback:ping><wfw:comment>http://www.dnknormark.net/post/ASPNET-MVC-and-Classic-ASP.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=15c348a3-3c93-4bdf-98c4-8017d5202714</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=15c348a3-3c93-4bdf-98c4-8017d5202714</feedburner:origLink></item><item><title>Is the use of AJAX on the web voting for a change to ASP.NET MVC?</title><description>&lt;p&gt;With &lt;a href="http://www.asp.net/mvc"&gt;ASP.NET MVC&lt;/a&gt; in Release Candidate now, the technology is getting a lot of attention these days. I personally haven’t given it any greater thought until just recently, but I have to admit that I’m tempted towards a change. I like &lt;a href="http://msdn.microsoft.com/en-us/library/ms973868.aspx"&gt;ASP.NET WebForms&lt;/a&gt;. I think the WebForm approach provides us with great manageability and gives us a very rich set of controls.&lt;/p&gt;  &lt;p&gt;But one thing that I don’t like about WebForms is, that it abstracts the anatomy of the web and how the web works. This was probably done to lure WinForms developers towards web development and making the change as easy as possible. But I think developers learning ASP.NET WebForms is missing out on the core web technology that is request, responses and headers etc. If you don’t know the core elements of what you’re working with, you can easily make some terrible mistakes. &lt;/p&gt;  &lt;p&gt;As user experience is getting much more focus today, especially in the business of SaaS products, you have to deliver a great deal of responsiveness through the use of AJAX. In ASP.NET WebForms I see myself ending up rendering the page once, and doing AJAX callback through the core &lt;a href="http://www.w3.org/TR/XMLHttpRequest/"&gt;XmlHttpRequest&lt;/a&gt; in JavaScript when the user makes a change to some data. That’s to avoid postbacks. By doing this, I’m missing out on &lt;a href="http://msdn.microsoft.com/en-us/library/ms972976.aspx"&gt;ViewState&lt;/a&gt; as well and what is left of ASP.NET WebForms now? &lt;/p&gt;  &lt;p&gt;I think the high demand of quality (Testability) and user experience (Responsiveness = AJAX) is making ASP.NET WebForms obsolete.&lt;/p&gt;  &lt;p&gt;I see several good reasons to dump WebForms for MVC:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; - AJAX is used all over, so what good is postback, ViewState and the Page life cycle? &lt;/li&gt;    &lt;li&gt; - WebForms is making your HTML look very ugly, especially because of the ViewState hidden field. &lt;/li&gt;    &lt;li&gt; - ViewState can get very large, and slow down your pages.&lt;/li&gt;    &lt;li&gt; - Performance is better on MVC –&amp;gt; You can handle more requests per second.&lt;/li&gt;    &lt;li&gt; - The ability to test your code is better on MVC.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Initially, it looks like MVC is missing out on the rich set of controls that ASP.NET WebForms have. But I think this need will be driven by the awesome community that .NET have.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l_RwIYiL4tI:-z9YdfD4PJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l_RwIYiL4tI:-z9YdfD4PJ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=l_RwIYiL4tI:-z9YdfD4PJ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l_RwIYiL4tI:-z9YdfD4PJ0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l_RwIYiL4tI:-z9YdfD4PJ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=l_RwIYiL4tI:-z9YdfD4PJ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=l_RwIYiL4tI:-z9YdfD4PJ0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/l_RwIYiL4tI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/l_RwIYiL4tI/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/Is-the-use-of-AJAX-on-the-web-voting-for-a-change-to-ASPNET-MVC.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=cc96a23a-e040-422f-83cf-e92548972a5a</guid><pubDate>Fri, 30 Jan 2009 00:13:32 +0200</pubDate><category>ASP.NET</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=cc96a23a-e040-422f-83cf-e92548972a5a</pingback:target><slash:comments>1</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=cc96a23a-e040-422f-83cf-e92548972a5a</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Is-the-use-of-AJAX-on-the-web-voting-for-a-change-to-ASPNET-MVC.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=cc96a23a-e040-422f-83cf-e92548972a5a</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=cc96a23a-e040-422f-83cf-e92548972a5a</feedburner:origLink></item><item><title>A buggy one: Introduction post</title><description>&lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/AbuggyoneIntroductionpost_13594/0916b_bug_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="0916b_bug" border="0" alt="0916b_bug" align="right" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/AbuggyoneIntroductionpost_13594/0916b_bug_thumb.jpg" width="240" height="211" /&gt;&lt;/a&gt; Today, I was thinking about all those hours spent hunting and fixing bugs. I was hunting down a bug that was found after installing Flash Player 10 which resulted in Flash objects not being loaded. I will give the details shortly in the next post – this is just to clarify my intentions about upcoming posts, and the definition of them.&lt;/p&gt;  &lt;p&gt;I thought it would be great, at least for myself, to have a place of some of the bugs that makes you laugh, cry, bang your head against the wall or whatever you do. I decided to write a blog post about bugs every once in a while when I find a “good” one. Bugs are never good, are they? I will post them in a category called ‘A buggy one’ and simply just tag them bugs, along with other relevant tags such as ASP.NET, HttpHandler, C# etc.&lt;/p&gt;  &lt;p&gt;The bugs I share here, are not necessarily bugs in e.g. the .Net framework, Flash Player 10 or whatever – but bugs introduced by myself or another developer, causing our software not to work properly. No matter what you think about bugs, who you are and how good you think you are – you can just *NEVER* avoid bugs 100%. It is absolutely impossible. &lt;/p&gt;  &lt;p&gt;I think the worst attitude you can have towards bugs, is to have so much pride about yourself and your work that you really think that you can write code 100% bug free.&lt;/p&gt;  &lt;p&gt;Go hunt some bugs, first post is up for grabs shortly.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e793e2cb-d67f-4148-8a8a-f9420ee58548" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/bugs" rel="tag"&gt;bugs&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZjQ3GQoFukc:A_Dw0fW5b0Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZjQ3GQoFukc:A_Dw0fW5b0Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=ZjQ3GQoFukc:A_Dw0fW5b0Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZjQ3GQoFukc:A_Dw0fW5b0Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZjQ3GQoFukc:A_Dw0fW5b0Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=ZjQ3GQoFukc:A_Dw0fW5b0Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=ZjQ3GQoFukc:A_Dw0fW5b0Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/ZjQ3GQoFukc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/ZjQ3GQoFukc/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/A-buggy-one-Introduction-post.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=1a35b98e-ba08-49c2-a451-3dbc182817af</guid><pubDate>Mon, 03 Nov 2008 22:08:35 +0200</pubDate><category>A buggy one</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=1a35b98e-ba08-49c2-a451-3dbc182817af</pingback:target><slash:comments>1</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=1a35b98e-ba08-49c2-a451-3dbc182817af</trackback:ping><wfw:comment>http://www.dnknormark.net/post/A-buggy-one-Introduction-post.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=1a35b98e-ba08-49c2-a451-3dbc182817af</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=1a35b98e-ba08-49c2-a451-3dbc182817af</feedburner:origLink></item><item><title>Early thoughts on Windows Azure</title><description>&lt;p&gt;&lt;a title="Windows Azure, Windows en la nube" href="http://www.flickr.com/photos/64542070@N00/2978778160/"&gt;&lt;img style="margin: 0px 0px 0px 15px" border="0" alt="Windows Azure, Windows en la nube" align="right" src="http://static.flickr.com/3193/2978778160_da4e239e00.jpg" /&gt;&lt;/a&gt;So I just got home from work, and fired up my browser to check out the latest news from this year’s &lt;a href="http://www.microsoftpdc.com/"&gt;Microsoft PDC&lt;/a&gt;, by live streaming, and following the &lt;a href="http://www.istartedsomething.com/20081028/live-from-pdc08-keynote-ray-ozzie-amitabh-srivastava-bob-muglia-and-david-thompson/"&gt;live blogging session&lt;/a&gt;. And as always, something big is underway. Windows Azure, is Microsoft’s answer to &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;. It is a cloud computing platform on Microsoft technology. &lt;/p&gt;  &lt;p&gt;I’m truly thrilled by the thought. This gives me great possibilities. As an entrepreneur, I get loads of ideas. My biggest pain is always how to deploy this. Funding is a big issue, and this leads to compromises in server infrastructure and stuff. As a developer, I’m not that much focused on servers and thing alike, so to have a big platform is an advantage. &lt;/p&gt;  &lt;p&gt;At &lt;a href="http://www.microsoftpdc.com"&gt;PDC2008&lt;/a&gt;, they showcased a mobile app called &lt;a href="http://www.bluehoo.com"&gt;Bluehoo&lt;/a&gt;. On stage, by editing an XML file online he scaled his platform from 1 to 20 nodes to be capable of the upcoming load due to the the announcement made at PDC.&lt;/p&gt;  &lt;p&gt;My thoughts on pros:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Great scalability &lt;/li&gt;    &lt;li&gt;Large content network = low latency around the world &lt;/li&gt;    &lt;li&gt;Consolidation &lt;/li&gt;    &lt;li&gt;Pay as you go premise – compared to buying hardware upfront &lt;/li&gt;    &lt;li&gt;Easy application maturing – developing locally, deploying to a staging environment before deploying to production &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Cons:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The inevitable: “What will they do with my data?” &lt;/li&gt;    &lt;li&gt;Dependency on Microsoft &lt;/li&gt;    &lt;li&gt;Unawareness – like deploying your app to ‘a black box’ &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On the &lt;a href="http://www.microsoft.com/azure"&gt;Windows Azure&lt;/a&gt; site, the links to &lt;a href="http://www.microsoft.com/azure/register.mspx"&gt;SDK’s and VS2008 tools&lt;/a&gt; are broken. They should be good shortly!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;For &lt;a href="http://on10.net/blogs/sarahintampa/Microsofts-Cloud-Part-2-Windows-Azure/"&gt;more information on Windows Azure&lt;/a&gt;, check out &lt;a href="http://on10.net/blogs/sarahintampa/Microsofts-Cloud-Part-2-Windows-Azure/"&gt;this blog post&lt;/a&gt; at &lt;a href="http://on10.net"&gt;Channel 10&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Or this: &lt;a title="http://blogs.zdnet.com/microsoft/?p=1671" href="http://blogs.zdnet.com/microsoft/?p=1671"&gt;http://blogs.zdnet.com/microsoft/?p=1671&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1901ac62-8706-476a-bc7e-fe5f344d2db9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Software+%2b+Services" rel="tag"&gt;Software + Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Live" rel="tag"&gt;Windows Live&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Azure" rel="tag"&gt;Windows Azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/cloud+computing" rel="tag"&gt;cloud computing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PDC2008" rel="tag"&gt;PDC2008&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=7Lg6RdSek0Q:Yttbv1lPC-A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=7Lg6RdSek0Q:Yttbv1lPC-A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=7Lg6RdSek0Q:Yttbv1lPC-A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=7Lg6RdSek0Q:Yttbv1lPC-A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=7Lg6RdSek0Q:Yttbv1lPC-A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=7Lg6RdSek0Q:Yttbv1lPC-A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=7Lg6RdSek0Q:Yttbv1lPC-A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/7Lg6RdSek0Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/7Lg6RdSek0Q/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/Early-thoughts-on-Windows-Azure.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=84be3728-7c54-4a15-83a3-98d346ddc47c</guid><pubDate>Mon, 27 Oct 2008 17:53:11 +0200</pubDate><category>C#</category><category>Windows Azure</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=84be3728-7c54-4a15-83a3-98d346ddc47c</pingback:target><slash:comments>7</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=84be3728-7c54-4a15-83a3-98d346ddc47c</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Early-thoughts-on-Windows-Azure.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=84be3728-7c54-4a15-83a3-98d346ddc47c</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=84be3728-7c54-4a15-83a3-98d346ddc47c</feedburner:origLink></item><item><title>Silverlight 2.0 provides better remote debugging experience</title><description>&lt;p&gt;Some months ago, I did some &lt;a href="http://www.dnknormark.net/post/Windows-Vista-Mac-debugging-a-Silverlight-app-using-Visual-Studio-2008.aspx"&gt;remote debugging of a Silverlight app on a Mac&lt;/a&gt;. To say the least, it wasn’t all that intuitive, and it required a lot of trying and guessing to achieve the desired goal. Personally I think remote debugging is cool, but I can’t really see the great need of it. &lt;a href="http://www.silverlight.net"&gt;Silverlight&lt;/a&gt; is cross-browser, cross-platform compatible – so when it works in a browser on Windows, shouldn’t it work on a Mac as well?&lt;/p&gt;  &lt;p&gt;The release of Silverlight 2.0 has some great news in respect to remote debugging. It is no longer necessary to edit config files, and so on to authenticate the remote debugging session. This is all done from a nice user interface. &lt;a href="http://blogs.msdn.com/peterlau/default.aspx"&gt;JrzyShr Dev Guy&lt;/a&gt; has a excellent &lt;a href="http://blogs.msdn.com/peterlau/archive/2008/10/14/remote-debugging-a-silverlight-application-on-mac-osx.aspx"&gt;blog post describing the process of setting up remote debugging on a Mac on Silverlight 2.0&lt;/a&gt;. Furthermore, he suggests I mark my post as obsolete:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I ended up relying on a couple of random blog posts I came across on &lt;a href="http://www.live.com"&gt;Live Search&lt;/a&gt; &amp;amp; Google to figure it out.&amp;#160; If your search turns up any of these links, know that they are now obsolete:&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;Old 1.1 Alpha Way of Doing Things:        &lt;br /&gt;&lt;a href="http://www.dnknormark.net/post/Windows-Vista-Mac-debugging-a-Silverlight-app-using-Visual-Studio-2008.aspx"&gt;http://www.dnknormark.net/post/Windows-Vista-Mac-debugging-a-Silverlight-app-using-Visual-Studio-2008.aspx&lt;/a&gt;&lt;/p&gt;   &lt;/blockquote&gt; &lt;/blockquote&gt;  &lt;p&gt;So that I’ll do. Confusing information is all over the place, and I’d rather point someone in the right direction.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:24f2f677-576f-4d0b-8cec-3e9e69d0b77e" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/silverlight" rel="tag"&gt;silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/web+development" rel="tag"&gt;web development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/debugging" rel="tag"&gt;debugging&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=GMD5pBBbJPU:peLJ_9iH9Ro:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=GMD5pBBbJPU:peLJ_9iH9Ro:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=GMD5pBBbJPU:peLJ_9iH9Ro:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=GMD5pBBbJPU:peLJ_9iH9Ro:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=GMD5pBBbJPU:peLJ_9iH9Ro:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=GMD5pBBbJPU:peLJ_9iH9Ro:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=GMD5pBBbJPU:peLJ_9iH9Ro:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/GMD5pBBbJPU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/GMD5pBBbJPU/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (martinhn)</author><comments>http://www.dnknormark.net/post/Silverlight-20-provides-better-remote-debugging-experience.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=964a13f1-ff2f-4b55-afda-963207ac5354</guid><pubDate>Sun, 26 Oct 2008 01:25:04 +0200</pubDate><category>Silverlight</category><dc:publisher>martinhn</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=964a13f1-ff2f-4b55-afda-963207ac5354</pingback:target><slash:comments>2</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=964a13f1-ff2f-4b55-afda-963207ac5354</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Silverlight-20-provides-better-remote-debugging-experience.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=964a13f1-ff2f-4b55-afda-963207ac5354</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=964a13f1-ff2f-4b55-afda-963207ac5354</feedburner:origLink></item><item><title>Windows Live Development Part 1 - Authenticating users via Windows Live ID</title><description>&lt;p&gt;With so many online services out there, you nearly claim a new online identity somewhere every day. You tend to use the same username and password couple for all of them, but sometimes your preferred username is taken, or your password does not meet the sites' password policy. I reckon I have well over 100 online identities out there - I rely on the same 3-4 combinations of username and password, and it's really messy. In this blog post I'm going to cover how to authenticate users of an ASP.NET application against &lt;a href="http://dev.live.com/"&gt;Windows Live&lt;/a&gt;, using the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=24195B4E-6335-4844-A71D-7D395D20E67B&amp;amp;displaylang=en"&gt;SDK&lt;/a&gt; for &lt;a href="http://dev.live.com/liveID/default.aspx"&gt;Windows Live ID&lt;/a&gt;. I'm going use the built-in &lt;a href="http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx"&gt;ASP.NET Membership&lt;/a&gt; mechanism and go from there.&lt;/p&gt; &lt;p&gt;I could have gone the &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; way, but &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; already did an &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode25OpenIDEdition.aspx"&gt;example on OpenID&lt;/a&gt;, so I thought I'd try out Windows Live. &lt;a href="http://www.codinghorror.com"&gt;Jeff Atwood&lt;/a&gt; asked the question, if we &lt;a href="http://www.codinghorror.com/blog/archives/001121.html"&gt;really need another username and password&lt;/a&gt; in the pursuit of the best authentication model for &lt;a href="http://www.stackoverflow.com"&gt;stackoverflow.com&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Conceptual idea of using Windows Live ID&lt;/h3&gt; &lt;p&gt;&lt;img style="margin: 5px 15px 0px 0px" border="0" alt="tmpF3A8" align="left" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/tmpF3A8_3.png" width="240" height="51"&gt;Windows Live ID, is the technology you should be quite familiar with when authenticating on Microsoft web sites, and Messenger. If you want to know more about what Windows Live ID is, take a look at &lt;a href="http://channel9.msdn.com/posts/Charles/Lynn-Ayres-What-is-Windows-Live-ID/"&gt;this video&lt;/a&gt; from &lt;a href="http://channel9.msdn.com"&gt;Channel9&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;When using Windows Live ID, you redirect the user to the Windows Live login-page, with a return URL specified. When the user authenticates, Windows Live will redirect the user back to your site, and delivering a user id and a token. Here's an overview of how it looks:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/image_2.png" target="_blank"&gt;&lt;img alt="image" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/image_thumb.png" width="550" height="372"&gt;&lt;/a&gt; &lt;/p&gt; &lt;h3&gt;Getting your application ID to use Windows Live ID&lt;/h3&gt; &lt;p&gt;To get started using Windows Live ID, first of all you need an application ID. Basically you need to sign up for one, and register your application. Go to &lt;a title="https://msm.live.com/app/default.aspx" href="https://msm.live.com/app/default.aspx"&gt;https://msm.live.com/app/default.aspx&lt;/a&gt; and click 'Register an Application'. (You can find Microsoft's guide to this here: &lt;a title="http://msdn.microsoft.com/en-us/library/cc287659.aspx" href="http://msdn.microsoft.com/en-us/library/cc287659.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc287659.aspx&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/tmpF3F5_2.png" target="_blank"&gt;&lt;img alt="tmpF3F5" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/tmpF3F5_thumb.png" width="550" height="482"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Leave Domain Name blank. Save your self-chosen Secret Key for later use, and submit the form. When you see the confirmation page, your application ID is shown. Copy that, as we're going to use it later.&lt;/p&gt; &lt;p&gt;In the return URL field, type the URL of your application followed by a name of a page to handle the Windows Live ID communication, like &lt;a href="http://localhost/demoapp/webauth-handler.aspx"&gt;http://localhost/demoapp/webauth-handler.aspx&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Download and install Windows Live ID Web Authentication SDK&lt;/h3&gt; &lt;p&gt;Microsoft has made it quite easy for ASP.NET developers to get started, by providing an SDK. Download it here: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=24195B4E-6335-4844-A71D-7D395D20E67B&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=24195B4E-6335-4844-A71D-7D395D20E67B&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=24195B4E-6335-4844-A71D-7D395D20E67B&amp;amp;displaylang=en&lt;/a&gt; and install the SDK. By default it is installed here: C:\Program Files\Windows Live ID\WebAuth&lt;/p&gt; &lt;p&gt;From the SDK we need a class called WindowsLiveLogin, located in the App_Code folder of the sample. Keep this file in mind for a few seconds.&lt;/p&gt; &lt;h3&gt;Start coding - create a new website&lt;/h3&gt; &lt;p&gt;Open Visual Studio 2005/2008 and create a new ASP.NET website the way you want it. First we will add the WindowsLiveLogin.cs file to our App_Code folder. (C:\Program Files\Windows Live ID\WebAuth\Sample\App_Code\WindowsLiveLogin.cs).&lt;/p&gt; &lt;p&gt;Leave the default.aspx page, and put the following HTML in the markup:&lt;/p&gt; &lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; height: 333px; background-color: #f4f4f4"&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Windows Live&lt;span style="color: #ff0000"&gt;&amp;amp;trade;&lt;/span&gt; ID&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;iframe&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="WebAuthControl"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="WebAuthControl"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://login.live.com/controls/WebAuth.htm?appid=&amp;lt;%=AppId%&amp;gt;&amp;amp;style=font-size%3A+10pt%3B+font-family%3A+verdana%3B+background%3A+white%3B"&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="80px"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="20px"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;marginwidth&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;marginheight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;align&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="middle"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;frameborder&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="0"&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;scrolling&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="no"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;iframe&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="background-color: #ffff00"&gt;&amp;lt;%&lt;/span&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (UserId == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;      { &lt;/pre&gt;&lt;span style="background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    This application does not know who you are! Click the &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Sign in&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; link above.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="background-color: #ffff00"&gt;&amp;lt;%&lt;/span&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt;  }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;      &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;      { &lt;/pre&gt;&lt;span style="background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    Now this application knows that you are the user with ID = "&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #ffff00"&gt;&amp;lt;%&lt;/span&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; =UserId&lt;/pre&gt;&lt;span style="background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;".&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="background-color: #ffff00"&gt;&amp;lt;%&lt;/span&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt;  } &lt;/pre&gt;&lt;span style="background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And this piece of code in its code-behind class.&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; WindowsLive;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DefaultPage : System.Web.UI.Page
{
  &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; LoginCookie = &lt;span style="color: #006080"&gt;"webauthtoken"&lt;/span&gt;;

  &lt;span style="color: #008000"&gt;// Initialize the WindowsLiveLogin class.&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; WindowsLiveLogin wll = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WindowsLiveLogin(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);
  
  &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; AppId = wll.AppId;
  &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; UserId;

  &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
  {
    HttpRequest req = HttpContext.Current.Request;
    HttpApplicationState app = HttpContext.Current.Application;

    HttpCookie loginCookie = req.Cookies[LoginCookie];

    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (loginCookie != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
    {
      &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; token = loginCookie.Value;

      WindowsLiveLogin.User user = wll.ProcessToken(token);

      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (user != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
      {
        UserId = user.Id;
      }
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Default.aspx will work as a login page. Users click the Sign-in button, and is redirected to Windows Live. When they authenticate, they're redirected back to our handler page, that we will now create...&lt;/p&gt;
&lt;p&gt;Create a new aspx page, and name it webauth-handler.aspx. Recall that this was the page we provided as the return URL when we registered the application at Windows Live.&lt;/p&gt;
&lt;p&gt;This page will serve as the handler page for the user, when Windows Live redirects back to your site. Windows Live will post authentication specific values for you to use. Because this page is never seen by a user (we will send the user back where they began), we can simply remove all the markup.&lt;/p&gt;
&lt;p&gt;Put the following code in your code-behind class for webauth-handler.aspx.&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; WindowsLive;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; HandlerPage : System.Web.UI.Page
{
  &lt;span style="color: #008000"&gt;// Relative path to the login- and logoutpage.&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; LoginPage = &lt;span style="color: #006080"&gt;"default.aspx"&lt;/span&gt;;
  &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; LogoutPage = &lt;span style="color: #006080"&gt;"default.aspx"&lt;/span&gt;;
  &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; LoginCookie = &lt;span style="color: #006080"&gt;"webauthtoken"&lt;/span&gt;;
  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DateTime ExpireCookie = DateTime.Now.AddYears(-10);
  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; DateTime PersistCookie = DateTime.Now.AddYears(10);

  &lt;span style="color: #008000"&gt;// Initialize the WindowsLiveLogin class.&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; WindowsLiveLogin wll = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WindowsLiveLogin(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);

  &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
  {
    HttpRequest request = HttpContext.Current.Request;
    HttpResponse response = HttpContext.Current.Response;
    HttpApplicationState application = HttpContext.Current.Application;

    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; action = request[&lt;span style="color: #006080"&gt;"action"&lt;/span&gt;];

    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (action == &lt;span style="color: #006080"&gt;"logout"&lt;/span&gt;)
    {
      HttpCookie loginCookie = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HttpCookie(LoginCookie);
      loginCookie.Expires = ExpireCookie;
      response.Cookies.Add(loginCookie);
      response.Redirect(LogoutPage);
      response.End();
    }
    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (action == &lt;span style="color: #006080"&gt;"clearcookie"&lt;/span&gt;)
    {
      HttpCookie loginCookie = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HttpCookie(LoginCookie);
      loginCookie.Expires = ExpireCookie;
      response.Cookies.Add(loginCookie);

      &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; type;
      &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] content;
      wll.GetClearCookieResponse(&lt;span style="color: #0000ff"&gt;out&lt;/span&gt; type, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; content);
      response.ContentType = type;
      response.OutputStream.Write(content, 0, content.Length);

      response.End();
    }
    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (action == &lt;span style="color: #006080"&gt;"login"&lt;/span&gt;)
    {
      HttpCookie loginCookie = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HttpCookie(LoginCookie);

      WindowsLiveLogin.User user = wll.ProcessLogin(request.Form);

      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (user != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
      {
        loginCookie.Value = user.Token;

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (user.UsePersistentCookie)
        {
          loginCookie.Expires = PersistCookie;
        }
      }
      &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
      {
        loginCookie.Expires = ExpireCookie;
      }

      response.Cookies.Add(loginCookie);
      response.Redirect(LoginPage);
      response.End();
    }
    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
    {
      response.Redirect(LoginPage);
      response.End();
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;The first login test&lt;/h3&gt;
&lt;p&gt;Now we've got everything setup as we should, and it should be possible to login using Windows Live. View the default.aspx page in your favorite browser, and let's try.&lt;/p&gt;
&lt;p&gt;First you will see out login page:&lt;br&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/tmp9D6_2.png"&gt;&lt;img alt="tmp9D6" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/tmp9D6_thumb.png" width="547" height="139"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click the Sign in link, which will take you to Windows Live:&lt;br&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/wlive_signin_2.jpg"&gt;&lt;img alt="wlive_signin" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/wlive_signin_thumb.jpg" width="547" height="312"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Sign in with your Windows Live ID, and you will return to our login page - which will now welcome you and show your user ID:&lt;br&gt;&lt;a href="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/wlive_signin_4.jpg"&gt;&lt;img alt="wlive_signin" src="http://www.dnknormark.net/image.axd?picture=WindowsLiveWriter/WindowsLiveDevelopmentPart1Authenticatio_130BF/wlive_signin_thumb_1.jpg" width="547" height="310"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now your user has authenticated against Windows Live, using the Windows Live ID. Now it's up to you to handle the user's Windows Live ID, which is what I'm going to blog about in part 2 of the Windows Live Development series here...&lt;/p&gt;&lt;br&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.dnknormark.net/post/Windows-Live-Development-Part-1---Authenticating-users-via-Windows-Live-ID.aspx&amp;amp;title=Windows Live Development Part 1 - Authenticating users via Windows Live ID"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.dnknormark.net/post/Windows-Live-Development-Part-1---Authenticating-users-via-Windows-Live-ID.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=hFC56v1Iq1g:Cx0ZH2b2Rwk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=hFC56v1Iq1g:Cx0ZH2b2Rwk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=hFC56v1Iq1g:Cx0ZH2b2Rwk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=hFC56v1Iq1g:Cx0ZH2b2Rwk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=hFC56v1Iq1g:Cx0ZH2b2Rwk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=hFC56v1Iq1g:Cx0ZH2b2Rwk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=hFC56v1Iq1g:Cx0ZH2b2Rwk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/hFC56v1Iq1g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/hFC56v1Iq1g/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/Windows-Live-Development-Part-1-Authenticating-users-via-Windows-Live-ID.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=5cf5ddea-f94c-4dca-bde5-270ea91a316d</guid><pubDate>Thu, 19 Jun 2008 23:01:34 +0200</pubDate><category>ASP.NET</category><category>C#</category><category>Windows Live</category><category>Windows Live Development</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=5cf5ddea-f94c-4dca-bde5-270ea91a316d</pingback:target><slash:comments>12</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=5cf5ddea-f94c-4dca-bde5-270ea91a316d</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Windows-Live-Development-Part-1-Authenticating-users-via-Windows-Live-ID.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=5cf5ddea-f94c-4dca-bde5-270ea91a316d</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=5cf5ddea-f94c-4dca-bde5-270ea91a316d</feedburner:origLink></item><item><title>Designing for Internationalization</title><description>&lt;p&gt;Web sites and Web Applications today, are very often exposed beyond the borders of your home country, and therefore users speak different languages, and has a different currency, date- and time formats etc. ASP.NET provides you with an entire namespace for handling things like this. That is the &lt;a href="http://msdn.microsoft.com/en-us/library/system.globalization.aspx" target="_blank"&gt;System.Globalization&lt;/a&gt; namespace, where you will find a lot of classes for handling your every day globalization tasks. I'm not going to cover anything in this namespace now, if you want to get your hands dirty take a look at this video: &lt;a title="http://asp.net/learn/videos/video-40.aspx" href="http://asp.net/learn/videos/video-40.aspx"&gt;http://asp.net/learn/videos/video-40.aspx&lt;/a&gt; where you will see how to use local and global resources for your application.&lt;/p&gt; &lt;p&gt;Using a global resource file for a place to store display text on buttons, labels, validation controls etc. is fine. But if you have an e-commerce site, selling products in multiple regions with different languages, you need an extra level. That level is a way to globalize e.g. the name and description of your product. When a user changes language, the name and description of your "display product details page" should change accordingly.&lt;/p&gt; &lt;p&gt;For me, the ideal solution should not result in extra database columns like name_us, name_da, name_es. This would be a very static solution, as you would have to change your database whenever a new language is added to your application. Nor should it require extra tables, so you need to join like hell, when you need to select a product.&lt;/p&gt; &lt;p&gt;I've decided to store e.g. the Name values as XML in the database, and parse that XML into a Dictionary&amp;lt;string, string&amp;gt; property on my Product object, with the key of the Dictionary being the language code (en-US for US English). To me this seems to work just fine. My database design is not getting more complex, and I can get and set values quite easily.&lt;/p&gt; &lt;p&gt;The XML string that goes into my ProductName column in the database table, looks like this:&lt;/p&gt; &lt;p&gt;&amp;lt;cultures&amp;gt;&amp;lt;culture code="en-us"&amp;gt;Logitech SmartCam 124&amp;lt;/culture&amp;gt;&amp;lt;/cultures&amp;gt;&lt;/p&gt; &lt;p&gt;On my Product object, the Name property is a Dictionary:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; _Name;

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; Name
{
  get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _Name; }
  set
  {
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_Name != &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) MarkDirty(&lt;span style="color: #006080"&gt;"Name"&lt;/span&gt;);
    _Name = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;
  }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When I need to get the US English value of the Product.Name property, I call:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;p.Name[&lt;span style="color: #006080"&gt;"en-us"&lt;/span&gt;]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get a Dictionary from my XML, I use this helper method:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; GetDictionary(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; xml)
{
  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(xml))
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;(owner);
    
  XmlDocument doc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XmlDocument();
  doc.LoadXml(xml);
    
  Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; dic = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;();

  &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (XmlNode node &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; doc.DocumentElement)
  {
    dic.Add(node.Attributes[&lt;span style="color: #006080"&gt;"code"&lt;/span&gt;].Value, node.InnerText);
  }

  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; dic;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And when I want to update my database, after I change the Name of the Product, I convert to Dictionary to an XML string using this helper method:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetXmlDocument(Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; dic)
{
  XmlDocument doc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XmlDocument();
  XmlNode docElement = doc.CreateNode(XmlNodeType.Element, &lt;span style="color: #006080"&gt;"cultures"&lt;/span&gt;, &lt;span style="color: #006080"&gt;""&lt;/span&gt;);

  &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; dic.Keys)
  {
    XmlNode node = doc.CreateNode(XmlNodeType.Element, &lt;span style="color: #006080"&gt;"culture"&lt;/span&gt;, &lt;span style="color: #006080"&gt;""&lt;/span&gt;);
    XmlAttribute att = doc.CreateAttribute(&lt;span style="color: #006080"&gt;"code"&lt;/span&gt;);
    att.Value = key;
    node.Attributes.Append(att);

    node.InnerText = dic[key];

    docElement.AppendChild(node);
  }

  doc.AppendChild(docElement);

  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; doc.OuterXml;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you need more information on this huge topic, take a look at the ASP.NET Wiki: &lt;a title="http://wiki.asp.net/page.aspx/55/internationalization/" href="http://wiki.asp.net/page.aspx/55/internationalization/"&gt;http://wiki.asp.net/page.aspx/55/internationalization/&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=tDLD3puQNiw:eWek0fWFUlg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=tDLD3puQNiw:eWek0fWFUlg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=tDLD3puQNiw:eWek0fWFUlg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=tDLD3puQNiw:eWek0fWFUlg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=tDLD3puQNiw:eWek0fWFUlg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=tDLD3puQNiw:eWek0fWFUlg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=tDLD3puQNiw:eWek0fWFUlg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/tDLD3puQNiw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/tDLD3puQNiw/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/Designing-for-Internationalization.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=98726a15-4956-485c-8abe-8fff14dfec00</guid><pubDate>Tue, 10 Jun 2008 20:17:05 +0200</pubDate><category>.NET</category><category>C#</category><category>Internationalization</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=98726a15-4956-485c-8abe-8fff14dfec00</pingback:target><slash:comments>2</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=98726a15-4956-485c-8abe-8fff14dfec00</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Designing-for-Internationalization.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=98726a15-4956-485c-8abe-8fff14dfec00</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=98726a15-4956-485c-8abe-8fff14dfec00</feedburner:origLink></item><item><title>ASP.NET Server Control: FeedList - List most recent items from an RSS feed as links</title><description>&lt;p&gt;RSS feeds is everywhere, and rightly so. Just about any modern browser, e-mail client, search engine or mobile phone is compliant with the RSS technology, and it gives web developers an easy and very convenient way to share and consume content across the web. From time to time I need to show a list of recent items form an RSS feed. This is a very easy thing to do, and I always end up copying the same usercontrol around, which becomes nothing but a mess! Eventually I need to change a few things, which means I get different versions of the same control spread throughout my projects.&lt;/p&gt; &lt;p&gt;This mess has got to stop, and from now on I'll put all my common controls in a class library project, which I can reference from all the other projects.&lt;/p&gt; &lt;p&gt;Back to my RSS feed reader - this is the first control I've made into a server control, from one of my many usercontrols around the projects folder. The control downloads the XML at the Url of the RSS feed, and renders a list of links. The controls contains a few properties:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;FeedUrl: The Url of the RSS feed to download  &lt;li&gt;NumberOfItems: The number of items which should be rendered. Defaults to 5 if none is specified.  &lt;li&gt;CssClass (Part of the WebControl class, from which FeedList derives): Use this so you have style the control from CSS.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;The code&lt;/h3&gt; &lt;p&gt;It really is straight forward. Below is the method that renders the links.&lt;/p&gt; &lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 300px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RenderFeedItems(HtmlTextWriter writer)
{
  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(FeedUrl))
  {
    XmlDocument doc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XmlDocument();
    doc.Load(FeedUrl);

    XmlNodeList items = doc.DocumentElement.SelectNodes(&lt;span style="color: #006080"&gt;"channel/item"&lt;/span&gt;);

    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (items != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
    {
      &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; bounce = NumberOfItems;
      &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (items.Count &amp;lt; NumberOfItems)
        bounce = items.Count;

      &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; bounce; i++)
      {
        XmlNode titleNode = items[i].SelectSingleNode(&lt;span style="color: #006080"&gt;"title"&lt;/span&gt;);
        XmlNode urlNode = items[i].SelectSingleNode(&lt;span style="color: #006080"&gt;"link"&lt;/span&gt;);
        XmlNode pubDateNode = items[i].SelectSingleNode(&lt;span style="color: #006080"&gt;"pubDate"&lt;/span&gt;);

        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; title = String.Empty;
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; url = String.Empty;
        DateTime pubDate = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DateTime();

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (titleNode != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
          title = titleNode.InnerText;

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (urlNode != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
          url = urlNode.InnerText;

        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pubDateNode != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
          DateTime.TryParse(pubDateNode.InnerText, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; pubDate);

        writer.RenderBeginTag(HtmlTextWriterTag.Li);

        writer.AddAttribute(HtmlTextWriterAttribute.Href, url);
        writer.AddAttribute(HtmlTextWriterAttribute.Title, title);
        writer.RenderBeginTag(HtmlTextWriterTag.A);
        writer.Write(title);
        writer.RenderEndTag();

        writer.RenderEndTag();
      }
    }
    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
    {
      RenderErrorMessage(writer, String.Format(&lt;span style="color: #006080"&gt;"No RSS-feed items found at: {0}"&lt;/span&gt;, FeedUrl));
    }
  }
  &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
  {
    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;"FeedUrl cannot be empty!"&lt;/span&gt;);
  }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To use the control, put it in your website's App_Code folder, and add the following to the &amp;lt;controls&amp;gt; collection of your &amp;lt;pages&amp;gt; section in web.config:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;lt;add tagPrefix=&lt;span style="color: #006080"&gt;"dnknormark"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080"&gt;"dnknormark"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should make your &amp;lt;pages&amp;gt; section look like this one:&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;lt;pages&amp;gt;
  &amp;lt;controls&amp;gt;
    &amp;lt;add tagPrefix=&lt;span style="color: #006080"&gt;"dnknormark"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;=&lt;span style="color: #006080"&gt;"dnknormark"&lt;/span&gt; /&amp;gt;
  &amp;lt;/controls&amp;gt;
&amp;lt;/pages&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;And to put it on an aspx page, and show the latest 5 items from this blog, add this line to the page:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;lt;dnknormark:FeedList ID=&lt;span style="color: #006080"&gt;"lstFeeds"&lt;/span&gt; runat=&lt;span style="color: #006080"&gt;"server"&lt;/span&gt; CssClass=&lt;span style="color: #006080"&gt;"feedList"&lt;/span&gt; &lt;br&gt;NumberOfItems=&lt;span style="color: #006080"&gt;"5"&lt;/span&gt; FeedUrl=&lt;span style="color: #006080"&gt;"http://www.dnknormark.net/syndication.axd"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use it as you'd like. Feel free to change it, the way you need.&lt;/p&gt;
&lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; padding-left: 0px; border-top: #dde5e9 1px solid; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginheight="0" src="http://cid-146a3db7b364e824.skydrive.live.com/embedrowdetail.aspx/dnknormark.net/FeedList.cs" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.dnknormark.net/post/ASPNET-Server-Control-FeedList---List-most-recent-items-from-an-RSS-feed-as-links.aspx&amp;amp;title=ASP.NET Server Control: FeedList - List most recent items from an RSS feed as links"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.dnknormark.net/post/ASPNET-Server-Control-FeedList---List-most-recent-items-from-an-RSS-feed-as-links.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=oGHKOZmsjdM:vTtRpGXy4ao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=oGHKOZmsjdM:vTtRpGXy4ao:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=oGHKOZmsjdM:vTtRpGXy4ao:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=oGHKOZmsjdM:vTtRpGXy4ao:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=oGHKOZmsjdM:vTtRpGXy4ao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=oGHKOZmsjdM:vTtRpGXy4ao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=oGHKOZmsjdM:vTtRpGXy4ao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/oGHKOZmsjdM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/oGHKOZmsjdM/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/ASPNET-Server-Control-FeedList-List-most-recent-items-from-an-RSS-feed-as-links.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=28dc0ac5-bdcc-43d3-857f-2bdd4ea502a2</guid><pubDate>Mon, 21 Apr 2008 21:30:38 +0200</pubDate><category>ASP.NET</category><category>Server Controls</category><category>Web development</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=28dc0ac5-bdcc-43d3-857f-2bdd4ea502a2</pingback:target><slash:comments>0</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=28dc0ac5-bdcc-43d3-857f-2bdd4ea502a2</trackback:ping><wfw:comment>http://www.dnknormark.net/post/ASPNET-Server-Control-FeedList-List-most-recent-items-from-an-RSS-feed-as-links.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=28dc0ac5-bdcc-43d3-857f-2bdd4ea502a2</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=28dc0ac5-bdcc-43d3-857f-2bdd4ea502a2</feedburner:origLink></item><item><title>Adding a Website to IIS7 programmatically</title><description>&lt;p&gt;Some time ago, I blogged about &lt;a href="http://www.dnknormark.net/post/Adding-an-Application-Pool-to-IIS7-programmatically.aspx"&gt;Adding an Application Pool to IIS7 programmatically&lt;/a&gt;. The result was a new Application Pool, that uses the Integrated Pipeline in IIS7.&lt;/p&gt; &lt;p&gt;In this post I will show you how to add a new Website, that uses the Application Pool from the other blog post.&lt;/p&gt; &lt;p&gt;I've loaded the Console Application I used to add the Application Pool, and moved the logic from Main to a method called AddApplicationPool, to split it up nicely. It is actually even easier to add a website programmatically. Below is the code for doing just that:&lt;/p&gt; &lt;div style="border-right: gray 1px solid; padding-right: 4px; padding-left: 4px; font-size: 8pt; border-top: gray 1px solid; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; height: 283px; background-color: #f4f4f4"&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, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AddWebSite()
{
  ServerManager mgr = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ServerManager();

  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(&lt;span style="color: #006080"&gt;@"c:\inetpub\wwwroot\iis7test"&lt;/span&gt;))
  {
    Directory.CreateDirectory(&lt;span style="color: #006080"&gt;@"c:\inetpub\wwwroot\iis7test"&lt;/span&gt;);
  }

  &lt;span style="color: #008000"&gt;// Add a new Site to the server, configured to use our the iis7test home directory.&lt;/span&gt;
  Site site = mgr.Sites.Add(&lt;span style="color: #006080"&gt;"MyWebSite"&lt;/span&gt;, &lt;span style="color: #006080"&gt;@"c:\inetpub\wwwroot\iis7test"&lt;/span&gt;, 80);
  
  &lt;span style="color: #008000"&gt;// Set the application pool name of the site, to use the MyAppPool application pool.&lt;/span&gt;
  site.ApplicationDefaults.ApplicationPoolName = &lt;span style="color: #006080"&gt;"MyAppPool"&lt;/span&gt;;

  &lt;span style="color: #008000"&gt;// Clear all bindings.&lt;/span&gt;
  site.Bindings.Clear();

  &lt;span style="color: #008000"&gt;// Make the site listen to incoming HTTP requests using host header iis7test, on port 80.&lt;/span&gt;
  site.Bindings.Add(&lt;span style="color: #006080"&gt;"*:80:iis7test"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"http"&lt;/span&gt;);
  
  &lt;span style="color: #008000"&gt;// Set auto start to true.&lt;/span&gt;
  site.ServerAutoStart = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;

  &lt;span style="color: #008000"&gt;// Commit the changes&lt;/span&gt;
  mgr.CommitChanges();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice how we add Bindings to the website. Bindings is the information that tells IIS7 when to serve our website. We use this string to configure bindings: *:80:iis7test. The first * tells IIS to listen on all IP addresses on your system. 80 is the port number, and iis7test is the host header value for this site.&lt;/p&gt;
&lt;p&gt;To browse our website, we need to add iis7test to the computers hosts file (located in %WINDIR%\System32\Drivers\etc), and point it to 127.0.0.1.&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dnknormark.net/post/Adding-a-Website-to-IIS7-programmatically.aspx&amp;amp;title=Adding a Website to IIS7 programmatically"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dnknormark.net/post/Adding-a-Website-to-IIS7-programmatically.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=jSi4H8O8o6I:GJF4E-HJZiU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=jSi4H8O8o6I:GJF4E-HJZiU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=jSi4H8O8o6I:GJF4E-HJZiU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=jSi4H8O8o6I:GJF4E-HJZiU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=jSi4H8O8o6I:GJF4E-HJZiU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?i=jSi4H8O8o6I:GJF4E-HJZiU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/dnknormark?a=jSi4H8O8o6I:GJF4E-HJZiU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dnknormark?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dnknormark/~4/jSi4H8O8o6I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/dnknormark/~3/jSi4H8O8o6I/post.aspx</link><author>mn.nospam@nospam.dnknormark.net (MartinHN)</author><comments>http://www.dnknormark.net/post/Adding-a-Website-to-IIS7-programmatically.aspx#comment</comments><guid isPermaLink="false">http://www.dnknormark.net/post.aspx?id=9c4df206-f4b1-4e41-9f43-1043ed27f2af</guid><pubDate>Wed, 16 Apr 2008 19:32:06 +0200</pubDate><category>C#</category><category>IIS7</category><dc:publisher>MartinHN</dc:publisher><pingback:server>http://www.dnknormark.net/pingback.axd</pingback:server><pingback:target>http://www.dnknormark.net/post.aspx?id=9c4df206-f4b1-4e41-9f43-1043ed27f2af</pingback:target><slash:comments>4</slash:comments><trackback:ping>http://www.dnknormark.net/trackback.axd?id=9c4df206-f4b1-4e41-9f43-1043ed27f2af</trackback:ping><wfw:comment>http://www.dnknormark.net/post/Adding-a-Website-to-IIS7-programmatically.aspx#comment</wfw:comment><wfw:commentRss>http://www.dnknormark.net/syndication.axd?post=9c4df206-f4b1-4e41-9f43-1043ed27f2af</wfw:commentRss><feedburner:origLink>http://www.dnknormark.net/post.aspx?id=9c4df206-f4b1-4e41-9f43-1043ed27f2af</feedburner:origLink></item></channel>
</rss>
