<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jim O'Neil's Blog : ASP.NET</title><link>http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx</link><description>Tags: ASP.NET</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>PHP Elite Web Optimization Event – Dec. 9th</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/16/php-elite-web-optimization-event-dec-9th.aspx</link><pubDate>Mon, 16 Nov 2009 13:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922652</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9922652.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9922652</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.navisite.com"&gt;&lt;img style="border-right-width: 0px; margin: 5px 0px 5px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NaviSite" border="0" alt="NaviSite" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/PHPEliteWebOptimizationEventDec.9th_B509/image_3.png" width="139" height="55" /&gt;&lt;/a&gt; Microsoft and &lt;a href="http://navisite.com/"&gt;NaviSite&lt;/a&gt; are co-hosting a free event at the &lt;a href="http://microsoftcambridge.com"&gt;New England Research and Development (NERD) Center&lt;/a&gt; in Cambridge on December 9th, from 10 to 6.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 10px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="php-med-trans" border="0" alt="php-med-trans" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/PHPEliteWebOptimizationEventDec.9th_B509/php-med-trans_3.png" width="95" height="51" /&gt; During the day, you’ll get to hear about what’s new in the Microsoft Web Platform, including IIS, PHP on Windows,&amp;#160; the &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt;, and development and design tools like &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt; and &lt;a href="http://www.microsoft.com/expression/"&gt;Expression Studio&lt;/a&gt;.&amp;#160; NaviSite will also discuss their various hosting options and their involvement with the &lt;a href="http://websitespark.com"&gt;WebsiteSpark&lt;/a&gt; program.&lt;/p&gt;  &lt;p&gt;You can register for the event at &lt;a title="http://microsoftandnavisite.eventbrite.com/" href="http://microsoftandnavisite.eventbrite.com/"&gt;http://microsoftandnavisite.eventbrite.com/&lt;/a&gt;.&amp;#160; All attendees will be entered into a drawing to win one of the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Copy of Windows 7 &lt;/li&gt;    &lt;li&gt;XBox 360 Elite &lt;/li&gt;    &lt;li&gt;Zune HD &lt;/li&gt;    &lt;li&gt;8GB Zune &lt;/li&gt;    &lt;li&gt;FREE NaviSite Managed Hosting for 60 days &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922652" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Web+Platform/default.aspx">Web Platform</category></item><item><title>Introducing WebsiteSpark (and more)</title><link>http://blogs.msdn.com/jimoneil/archive/2009/09/24/introducing-websitespark-and-more.aspx</link><pubDate>Thu, 24 Sep 2009 21:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9898994</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9898994.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9898994</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 5px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/IntroducingWebsiteSparkandmore_9CE7/image_3.png" width="205" height="76" /&gt; Today, Microsoft announced the &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt; program, which continues the tradition established by &lt;a href="https://www.dreamspark.com/"&gt;DreamSpark&lt;/a&gt; and &lt;a href="http://www.microsoft.com/bizspark/"&gt;BizSpark&lt;/a&gt; to provide web application developers and designers access to tools, training, and hosting providers to support their solutions.&lt;/p&gt;  &lt;p&gt;Full program details and application procedures can be found &lt;a href="http://www.microsoft.com/web/websitespark/ShowItem.aspx?LocalizedItemId=7177"&gt;here&lt;/a&gt;; here are some of the highlights:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Access to the Marketplace and &lt;a href="http://www.microsoft.com/web/gallery/default.aspx"&gt;Web App Gallery&lt;/a&gt;, where customers can find participating WebsiteSpark developers, and developers and designers can showcase their own applications. &lt;/li&gt;    &lt;li&gt;Support services, including online training, access to MSDN managed newsgroups, and two professional support incidents via Microsoft. &lt;/li&gt;    &lt;li&gt;Free copies of development tools and server licenses:      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/products/professional/default.mspx"&gt;Visual Studio Professional&lt;/a&gt; (up to 3 licenses) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.microsoft.com/expression/products/Studio_Overview.aspx"&gt;Expression Studio&lt;/a&gt; (1 license) and &lt;a href="http://www.microsoft.com/expression/products/Web_Overview.aspx"&gt;Expression Web&lt;/a&gt; (up to 2 licenses) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.microsoft.com/windowsserver2008/en/us/2008-web.aspx"&gt;Windows Web Server 2008/R2&lt;/a&gt; (with production licenses for up to four processors) &lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/web.aspx"&gt;SQL Server 2008 Web Edition&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Eligibility requirements are as follows&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A professional firm of 10 or fewer members whose primary business activity is Web development and design services. &lt;/li&gt;    &lt;li&gt;For continued participation in the program (which may last up to three years), the company must deploy a public-facing website within six-months of enrolling in WebsiteSpark. &lt;/li&gt;    &lt;li&gt;A $100 fee (no typos there!) when the company &lt;em&gt;exits&lt;/em&gt; the program; there are &lt;strong&gt;no upfront costs&lt;/strong&gt; to WebsiteSpark. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Coincident with the launch of WebsiteSpark, Microsoft has also updated the &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt;, a free download utility that provides access to and automatic installation and configuration of a host of Microsoft and open source web technologies, including &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://silverlight.net"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://www.microsoft.com/express/sql/Default.aspx"&gt;SQL Server Express&lt;/a&gt;, &lt;a href="http://www.microsoft.com/web/gallery/WordPress.aspx"&gt;WordPress&lt;/a&gt;, &lt;a href="http://www.microsoft.com/web/gallery/AcquiaDrupal.aspx"&gt;Acquia Drupal&lt;/a&gt;, &lt;a href="http://windows.php.net/"&gt;PHP&lt;/a&gt;, &lt;a href="http://www.microsoft.com/web/gallery/Umbraco.aspx"&gt;Umbraco&lt;/a&gt;, and more.&amp;#160; &lt;/p&gt;  &lt;p&gt;If all this looks great, but you don’t know where to start, check out the &lt;a href="http://www.asp.net/learn"&gt;ASP.NET Learn site&lt;/a&gt;, and specifically the great set of new videos from &lt;a href="http://misfitgeek.com/"&gt;Joe Stagner&lt;/a&gt; on general ASP.NET and getting started on your development trek with either Visual Studio or Microsoft’s free IDE for Web application developers, &lt;a href="http://www.microsoft.com/express/vwd/"&gt;Visual Web Developer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For more information on WebsiteSpark, the Microsoft Web Platform Installer, and web technologies in general, visit the &lt;a href="http://www.microsoft.com/web"&gt;Microsoft /web&lt;/a&gt; site.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9898994" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>NerdDinner On Azure – Take 2</title><link>http://blogs.msdn.com/jimoneil/archive/2009/07/27/nerddinner-on-azure-take-2.aspx</link><pubDate>Tue, 28 Jul 2009 04:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9848506</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9848506.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9848506</wfw:commentRss><description>&lt;p&gt;At last week’s &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/06/02/greater-buffalo-it-dev-day-july-21st.aspx" target="_blank"&gt;Greater Buffalo IT/Dev Day&lt;/a&gt;, I did an overview of the &lt;a href="http://www.microsoft.com/azure/default.mspx" target="_blank"&gt;Windows Azure Platform&lt;/a&gt; (the recently rebranded Azure Services Platform).&amp;#160; Rather than do a tired “Hello World” example, I thought it would be more interesting to talk about a more substantial application, so &lt;a href="http://nerddinner.com/" target="_blank"&gt;NerdDinner&lt;/a&gt; came to mind.&amp;#160; The fact that it’s a great application to talk about &lt;a href="http://www.asp.net/mvc/" target="_blank"&gt;ASP.NET MVC&lt;/a&gt; was just a plus, and although we didn’t focus on MVC, the context of the talk highlighted the fact that an ASP.NET MVC application at some level is “just another .NET web app”.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://cid-cd719ef6510408a8.skydrive.live.com/browse.aspx/Buffalo%20IT-Dev%20Day/Azure" target="_blank"&gt;sample code I used&lt;/a&gt; is available on my SkyDrive, but I wanted to give a little bit of insight into how it was developed, as well as give credit where credit is due.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/mpapas" target="_blank"&gt;Michael Papasevastos&lt;/a&gt;, a colleague at Microsoft, did most of the work!&amp;#160; Back in June &lt;a href="http://blogs.msdn.com/mpapas/archive/2009/06/25/nerddinner-on-azure.aspx" target="_blank"&gt;he blogged&lt;/a&gt; about the steps he took to port NerdDinner to Azure, and he made the &lt;a href="http://blogs.msdn.com/mpapas/attachment/9804106.ashx" target="_blank"&gt;source code available&lt;/a&gt; as well.&lt;/p&gt;  &lt;p&gt;To that starting point, I made a few modifications.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rebranding&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://nerdbytes.cloudapp.net"&gt;&lt;img style="border-right-width: 0px; margin: 0px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NerdBytes" border="0" alt="NerdBytes" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NerdDinnerOnAzureTake2_E155/logo_3.png" width="126" height="45" /&gt;&lt;/a&gt;I rebranded the application to NerdBytes, in part to eliminate confusion among the various tweaks that folks have made to NerdDinner, and also since &lt;a href="http://nerddinner.cloudapp.net/" target="_blank"&gt;nerddinner.cloudapp.net&lt;/a&gt; was already claimed by Michael’s app!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Azure Table Storage changes&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I noticed an issue in Michael’s choice of PartitionKey and RowKey for &lt;a href="http://msdn.microsoft.com/en-us/library/dd179338.aspx" target="_blank"&gt;Azure Table Storage&lt;/a&gt;.&amp;#160; The scheme he proposes doesn’t handle multiple dinners at the same date and time (the RSVPs used only the date and time of the event as the foreign key).&amp;#160; That was easily handled via the introduction of GUIDs and minor changes to the existing code.&amp;#160; So, in my implementation I use:&lt;/p&gt;    &lt;table border="1" cellspacing="0" cellpadding="3"&gt;&lt;tbody&gt;       &lt;tr bgcolor="#777777"&gt;         &lt;td valign="top" width="83"&gt;Entity&lt;/td&gt;          &lt;td valign="top" width="136"&gt;PartitionKey&lt;/td&gt;          &lt;td valign="top" width="180"&gt;RowKey&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="83"&gt;Dinner&lt;/td&gt;          &lt;td valign="top" width="136"&gt;GUID&lt;/td&gt;          &lt;td valign="top" width="180"&gt;“Host:” + host’s user ID&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="83"&gt;RSVP&lt;/td&gt;          &lt;td valign="top" width="136"&gt;GUID (from Dinner)&lt;/td&gt;          &lt;td valign="top" width="180"&gt;attendee user ID&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;Wondering why I preface the RowKey of Dinner with the text &amp;quot;&lt;strong&gt;Host:&lt;/strong&gt;&amp;quot;? When you host a dinner, the business logic is to automatically include a RSVP for yourself.&amp;#160; So, presume that Dinner’s RowKey were just the host’s user id.&amp;#160; If that were the case, we’d&amp;#160; now have a record in Dinner and a record in RSVP with exactly the same PartitionKey and RowKey combination.&amp;#160; &lt;/p&gt;    &lt;p&gt;In development storage, it doesn’t immediately appear to be a big deal, because there Azure storage is ‘faked’ by using local relational database tables, and Dinner and RSVP are different tables.&amp;#160; In Azure storage though, there is no concept of schematized data, and every item is essentially a property bag uniquely identified by PartitionKey and RowKey.&amp;#160; Without the “&lt;strong&gt;Host:&lt;/strong&gt;” preface there would be a Dinner entity and an RSVP entity with the same key, and that is verboten, resulting in an exception (both in the Development Fabric and production).&amp;#160; Of course, this means that my design won’t support two dinners hosted by the same person at the same time, but since I haven’t yet figured out how to break the time-space continuum, it’s not an issue for me here.&lt;/p&gt;    &lt;p&gt;In this particular case, I’m not focusing on scalability per se, but &lt;a href="http://www.25hoursaday.com/weblog/2009/01/07/SomeThoughtsOnChoosingPartitionKeysInWindowsAzuresTableStorage.aspx" target="_blank"&gt;here’s an interesting look&lt;/a&gt; at how the choices of PartitionKey and RowKey can affect your application’s ability to scale.&amp;#160; In this case, I’m actually in lock-step with the post’s conclusions, since the GUID is the primary key.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Worker Role Addition&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The original implementation of NerdDinner is a fairly compact Web application, but for my demo, I really wanted to introduce a &lt;a href="http://msdn.microsoft.com/en-us/library/dd179341.aspx#Subheading1"&gt;worker role&lt;/a&gt; and use &lt;a href="http://msdn.microsoft.com/en-us/library/dd179363.aspx"&gt;Azure’s queue storage&lt;/a&gt; to communicate between it and the existing Web role.&amp;#160; To that end, I added a feature that e-mails the host of the dinner whenever a new RSVP has been recorded.&lt;/p&gt;    &lt;p&gt;To implement an e-mail agent in Azure, take a look at fellow ‘softie &lt;a href="http://blogs.msdn.com/davidlem/archive/2009/01/08/windows-azure-sending-smtp-emails.aspx" target="_blank"&gt;David Lempher’s blog article&lt;/a&gt;.&amp;#160; It’s pretty much what I &lt;strike&gt;stole&lt;/strike&gt; researched for my own implementation; I used my live.com account as the SMTP relay, and included the information as part of the &lt;code&gt;serviceConfiguration.cscfg&lt;/code&gt; file.&amp;#160; In code, I rely on the &lt;code&gt;RoleManager.GetConfiguration&lt;/code&gt; setting to access the SMTP account information, and since it’s in the configuration file, I can modify the settings in production via the Windows Azure Platform portal without bringing down my application.&lt;/p&gt;    &lt;p&gt;As I mentioned, to communicate between the Web role and worker role, I want to use &lt;a href="http://msdn.microsoft.com/en-us/library/dd179363.aspx"&gt;Azure queue storage&lt;/a&gt;.&amp;#160; Within the ASP.NET MVC Web role code (&lt;code&gt;RSVPController.cs&lt;/code&gt;), I added a call to a new method (line 12 below) to send an e-mail each time an RSVP is recorded.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Register(&lt;span class="kwrd"&gt;string&lt;/span&gt; partitionKey)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Dinner dinner = dinnerRepository.&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        GetDinner(partitionKey);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!dinnerRepository.IsUserRegistered&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        (dinner, User.Identity.Name))&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        RSVP rsvp = &lt;span class="kwrd"&gt;new&lt;/span&gt; RSVP(dinner.PartitionKey, &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            User.Identity.Name);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        dinnerRepository.AddRSVP(rsvp);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        dinnerRepository.Save();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        SendRsvpEmail(dinner, rsvp);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; Content(&lt;span class="str"&gt;&amp;quot;Thanks - we'll see you there!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&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;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Sending the e-mail” here really means putting a new message on a queue (one that my worker role is listening to).&amp;#160; Below is the implementation of &lt;code&gt;SendRsvpEmail&lt;/code&gt;.&amp;#160; The queue name I’ve selected here is ‘rsvps’, and the code for the first 10 lines or so is more or less boilerplate to get a handle to the queue and ensure it exists before posting messages to it.&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SendRsvpEmail(Dinner dinner, RSVP rsvp)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Boolean queueCreated = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    Boolean queueExists = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    QueueStorage queueStorage = QueueStorage.Create&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      (StorageAccountInfo.&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;       GetDefaultQueueStorageAccountFromConfiguration());&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    MessageQueue queue = queueStorage.GetQueue(&lt;span class="str"&gt;&amp;quot;rsvps&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    queueCreated = queue.CreateQueue(&lt;span class="kwrd"&gt;out&lt;/span&gt; queueExists);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (queueCreated || queueExists)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        String RsvpXml = &lt;span class="kwrd"&gt;new&lt;/span&gt; XDocument(&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;         &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;Rsvp&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;           &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;DinnerName&amp;quot;&lt;/span&gt;, dinner.Title),&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;           &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;DinnerDate&amp;quot;&lt;/span&gt;, dinner.EventDate),&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;           &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;Attendee&amp;quot;&lt;/span&gt;, rsvp.AttendeeName),&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;           &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;HostName&amp;quot;&lt;/span&gt;, dinner.HostedBy),&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;           &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;HostEmail&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;              membershipService.GetUserEmail(&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                 dinner.HostedBy))&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;           )&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        ).ToString();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        queue.PutMessage(&lt;span class="kwrd"&gt;new&lt;/span&gt; Message(RsvpXml));&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        RoleManager.WriteToLog(&lt;span class="str"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, RsvpXml);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;   }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;The format of the message put in the queue is XML, and I used LINQ to XML to include the name of the dinner, the date, the attendee name, host, and the email of the host in the message (lines 13-23).&amp;#160; The message then gets put onto the queue in line 25 and logged in the next line.&lt;/p&gt;

  &lt;p&gt;On the other end, my worker role is polling for new messages on the ‘rsvps’ queue, and when it finds one, begins processing it.&amp;#160; Here’s the code extracted from the polling loop of my worker role.&amp;#160; It’s as simple as pulling the message off the queue, reconstituting it from the XML (I declare a simple &lt;code&gt;DinnerDetails&lt;/code&gt; data transfer object to hold the information), and then calling the method in the worker role that actually sends the e-mail via the SMTP client (&lt;code&gt;SendEMail&lt;/code&gt;).&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Message msg = queue.GetMessage();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (msg != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;// message should be an XML document&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    XDocument msgXml = XDocument.Parse(&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      msg.ContentAsString());&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    RoleManager.WriteToLog(&lt;span class="str"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      msgXml.ToString());&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="rem"&gt;// parse out dinner details from XML message&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    DinnerDetails rsvp = &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;      (from m &lt;span class="kwrd"&gt;in&lt;/span&gt; msgXml.Descendants(&lt;span class="str"&gt;&amp;quot;Rsvp&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;      select &lt;span class="kwrd"&gt;new&lt;/span&gt; DinnerDetails()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;           DinnerName = m.Element(&lt;span class="str"&gt;&amp;quot;DinnerName&amp;quot;&lt;/span&gt;).Value,&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;           DinnerDate = m.Element(&lt;span class="str"&gt;&amp;quot;DinnerDate&amp;quot;&lt;/span&gt;).Value,&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;           Attendee = m.Element(&lt;span class="str"&gt;&amp;quot;Attendee&amp;quot;&lt;/span&gt;).Value,&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;           HostName = m.Element(&lt;span class="str"&gt;&amp;quot;HostName&amp;quot;&lt;/span&gt;).Value,&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;           HostEmail = m.Element(&lt;span class="str"&gt;&amp;quot;HostEmail&amp;quot;&lt;/span&gt;).Value&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    ).FirstOrDefault();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    &lt;span class="rem"&gt;// send e-mail&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    SendEMail(rsvp);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    &lt;span class="rem"&gt;// delete the message from the queue&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    queue.DeleteMessage(msg);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;Here’s the crux of the &lt;code&gt;SendEMail&lt;/code&gt; method; there’s a bit more error checking in &lt;a href="http://cid-cd719ef6510408a8.skydrive.live.com/self.aspx/Buffalo%20IT-Dev%20Day/Azure/NerdDinnerAzure.zip" target="_blank"&gt;the download&lt;/a&gt;.&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;SmtpClient client;&lt;/pre&gt;

    &lt;pre&gt;MailMessage message;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="rem"&gt;// set up SMTP Relay&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;client = &lt;span class="kwrd"&gt;new&lt;/span&gt; SmtpClient(SMTPHost, SMTPPort);&lt;/pre&gt;

    &lt;pre&gt;client.EnableSsl = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;client.Credentials = &lt;span class="kwrd"&gt;new&lt;/span&gt; NetworkCredential(&lt;/pre&gt;

    &lt;pre&gt;   SMTPAccount, SMTPPassword);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="rem"&gt;// populate new message&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;message = &lt;span class="kwrd"&gt;new&lt;/span&gt; MailMessage(&lt;/pre&gt;

    &lt;pre&gt;   &lt;span class="kwrd"&gt;new&lt;/span&gt; MailAddress(&lt;span class="str"&gt;&amp;quot;rsvp@nerdbytes.net&amp;quot;&lt;/span&gt;), &lt;/pre&gt;

    &lt;pre class="alt"&gt;   &lt;span class="kwrd"&gt;new&lt;/span&gt; MailAddress(rsvp.HostEmail));&lt;/pre&gt;

    &lt;pre&gt;message.Subject = &lt;span class="str"&gt;&amp;quot;NerdBytes RSVP&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;message.Body = rsvp.HostName + &lt;span class="str"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; +&lt;/pre&gt;

    &lt;pre&gt;    Environment.NewLine + Environment.NewLine +&lt;/pre&gt;

    &lt;pre class="alt"&gt;    rsvp.Attendee + &lt;span class="str"&gt;&amp;quot; has RSVP'd for '&amp;quot;&lt;/span&gt; + &lt;/pre&gt;

    &lt;pre&gt;    rsvp.DinnerName + &lt;span class="str"&gt;&amp;quot;' on &amp;quot;&lt;/span&gt; +&lt;/pre&gt;

    &lt;pre class="alt"&gt;    DateTime.Parse(rsvp.DinnerDate).ToShortDateString() +&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="str"&gt;&amp;quot; at &amp;quot;&lt;/span&gt; +   &lt;/pre&gt;

    &lt;pre class="alt"&gt;&amp;#160;&amp;#160;&amp;#160; DateTime.Parse(rsvp.DinnerDate).ToShortTimeString();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Now, in order to get the host's email address, I modified the Dinners controller (&lt;code&gt;DinnersController.cs&lt;/code&gt; in the ASP.NET MVC application/Web role) as well, so that the &lt;code&gt;IMembershipService&lt;/code&gt; was dependency-injected along with the Dinner repository service.&amp;#160; That necessitated a few additional code changes in the original port that Michael did.&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DinnersController : Controller {&lt;/pre&gt;

    &lt;pre&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    IDinnerRepository dinnerRepository;&lt;/pre&gt;

    &lt;pre&gt;    IMembershipService membershipService;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="rem"&gt;//&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Dependency Injection enabled constructors&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DinnersController()&lt;/pre&gt;

    &lt;pre&gt;        : &lt;span class="kwrd"&gt;this&lt;/span&gt;(&lt;span class="kwrd"&gt;new&lt;/span&gt; DinnerRepository(),&lt;/pre&gt;

    &lt;pre class="alt"&gt;               &lt;span class="kwrd"&gt;new&lt;/span&gt; AccountMembershipService())&lt;/pre&gt;

    &lt;pre&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DinnersController(IDinnerRepository repository,&lt;/pre&gt;

    &lt;pre&gt;       IMembershipService membership)&lt;/pre&gt;

    &lt;pre class="alt"&gt;    {&lt;/pre&gt;

    &lt;pre&gt;        dinnerRepository = repository;&lt;/pre&gt;

    &lt;pre class="alt"&gt;        membershipService = membership;&lt;/pre&gt;

    &lt;pre&gt;    }&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that was pretty much it.&amp;#160; Note, if you’re following along, the &lt;a href="http://nerddinner.codeplex.com/" target="_blank"&gt;NerdDinner project on CodePlex&lt;/a&gt; has advanced a bit since Michael worked on his port to Azure, so code may look a bit different, but the approach is the same.&lt;/p&gt;

&lt;p&gt;The other, and pretty major, thing to note is that all the work he did to set up Azure storage will largely be unnecessary once &lt;a href="http://www.microsoft.com/azure/sql.mspx" target="_blank"&gt;SQL Azure&lt;/a&gt; is available (late summer).&amp;#160; SQL Azure is essentially SQL Server in the cloud, and would allow me to store the NerdDinner data (and the ASP.NET membership database) in the cloud in the same relational format that the original authors used.&amp;#160; That alone would probably have cut out 2/3rds of the work (or more) for the original port to Azure.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Mobilizing NerdBytes&lt;/h1&gt;

&lt;p&gt;But there’s more… My other session at the &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/06/02/greater-buffalo-it-dev-day-july-21st.aspx" target="_blank"&gt;Greater Buffalo IT/Dev Day&lt;/a&gt; was on &lt;a href="http://cid-cd719ef6510408a8.skydrive.live.com/browse.aspx/Buffalo%20IT-Dev%20Day/Mobile" target="_blank"&gt;Windows Mobile Development&lt;/a&gt;.&amp;#160; While I spent most of the time there talking about and building Compact Framework applications, I wanted to touch on mobile for the web as well – including new features in “IE6 on 6”, widgets, and Silverlight.&amp;#160; For the IE6 aspect, what better way to show the features than the cloud adaptation of NerdDinner.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Desktop mode" border="0" alt="Desktop mode" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NerdDinnerOnAzureTake2_E155/image_5.png" width="180" height="240" /&gt; As you may know, Mobile IE has a Desktop and a Mobile rendering mode option.&amp;#160; When using the Desktop mode, Mobile IE sends the same user-agent string as the desktop version of IE, so you get a display something like that on the right – functional but not optimal for the device’s form factor.&lt;/p&gt;

&lt;p&gt;To improve the user experience, we need to introduce a different user-interface for those on mobile devices, one triggered by the “Mobile” mode of IE.&amp;#160; That’s where &lt;a href="http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx" target="_blank"&gt;this post by Scott Hanselman&lt;/a&gt; comes in.&amp;#160; He’d already done the work and checked it in… alas to a build that was &lt;em&gt;after&lt;/em&gt; what Michael had ported to Azure (which was my starting point).&amp;#160; Since I was committed to the Azure port, I &lt;strike&gt;cobbled together&lt;/strike&gt; incorporated Scott’s work to my existing code base, so what you get in the &lt;a href="http://cid-cd719ef6510408a8.skydrive.live.com/self.aspx/Buffalo%20IT-Dev%20Day/Azure/NerdDinnerAzure.zip"&gt;download&lt;/a&gt; is not quite what he blogged about.. but close.&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="514"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="NerdBytes home" border="0" alt="NerdBytes home" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NerdDinnerOnAzureTake2_E155/image_8.png" width="133" height="177" /&gt;&lt;/td&gt;

      &lt;td valign="top" width="146"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="NerdBytes list" border="0" alt="NerdBytes list" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NerdDinnerOnAzureTake2_E155/image_11.png" width="133" height="177" /&gt;&lt;/td&gt;

      &lt;td valign="top" width="233"&gt;
        &lt;br /&gt;To the left are a few screens from the mobile views of my NerdBytes&amp;#160; ASP.NET MVC application.&amp;#160; &lt;a href="http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx"&gt;Scott goes into details&lt;/a&gt; on the implementation, but it was cool to see how for the most part all that was affected in the implementation was the views, another testament to the separation-of-concerns philosophy espoused by ASP.NET MVC.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;By the way, I wandered on to a very helpful utility when doing the work with the mobile device.&amp;#160; Since my application was deployed to the cloud, waiting for the deployment (which can take several minutes) to see what the site looked like wasn’t very productive.&amp;#160; &lt;a href="http://www.enhanceie.com/ietoys/uapick.asp" target="_blank"&gt;Bayden UAPick&lt;/a&gt; is a very cool IE add-on that allows you to modify what user-agent string is sent by the browser.&amp;#160; So, for testing I could work with my Azure Development Fabric on my laptop and test with IE8, but use UAPick (which installs itself in IE as a menu item under Tools) to spoof the user-agent string sent by a mobile device (or other browsers for that matter) – like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="IE8 with Mobile UA String" border="0" alt="IE8 with Mobile UA String" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NerdDinnerOnAzureTake2_E155/image_16.png" width="407" height="325" /&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Well, that pretty much covers how I got to where I did.&amp;#160; &lt;a href="http://nerdbytes.cloudapp.net/"&gt;NerdBytes&lt;/a&gt; is live now, so if you want to test it out while looking over the code, feel free.&amp;#160; Or load it up yourself in your own little spot in the cloud – Windows Azure is still in CTP, and more importantly FREE!, until &lt;a href="http://www.microsoftpdc.com/" target="_blank"&gt;PDC&lt;/a&gt; in November.&amp;#160; Also, drop me a line if you’re running into trouble, I undoubtedly left out some critical detail in my overview here!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9848506" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MVC/default.aspx">MVC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Azure/default.aspx">Azure</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Windows+Mobile/default.aspx">Windows Mobile</category></item><item><title>ASP.NET Dynamic Data Preview 4 Available</title><link>http://blogs.msdn.com/jimoneil/archive/2009/05/07/asp-net-dynamic-data-preview-4-available.aspx</link><pubDate>Thu, 07 May 2009 17:37:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9593714</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9593714.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9593714</wfw:commentRss><description>&lt;p&gt;The latest preview release of ASP.NET Dynamic Data is now &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27026."&gt;available from CodePlex.&lt;/a&gt;&amp;#160; These previews give you insight into the feature set that will be available when .NET 4 is released; however, you can start using them &lt;em&gt;right now&lt;/em&gt; with .NET 3.5 SP1!&lt;/p&gt;  &lt;p&gt;I’ve done quite a few presentations on Dynamic Data (&lt;a href="http://channel9.msdn.com/posts/dpeeast/Northeast-Roadshow-ASPNET-Dynamic-Data/"&gt;check out my screen cast&lt;/a&gt; for a taste of what it can do), so I’m looking forward to playing with the new bits.&amp;#160; This drop is specifically focused on integrating the coolness of field templates and validation into your existing sites, which is really where the true potential of Dynamic Data lies.&lt;/p&gt;  &lt;p&gt;Here’s a blurb from &lt;a href="http://blogs.msdn.com/scothu/archive/2009/05/07/dynamic-data-preview-4-released.aspx"&gt;Scott Hunter’s blog post&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="" border="0" alt="" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/ASP.NETDynamicDataPreview4Available_9547/320px-Left_pointing_double_angle_quotation_mark_sh1_svg_3.png" width="40" height="44" /&gt;When we look back and see how people view Dynamic Data we regret that people immediately think of it as scaffolding of data. This is something that it does do, and I think it does a pretty good job at it. But Dynamic Data is a lot more then that, providing a new templating mechanism called Field Templates which allow the default markup for many of our built in data controls to be more easily customized. These field templates also support validation by default (something our rich data controls did not) which can be customized by adding metadata to data objects.&lt;/p&gt;  &lt;p&gt;In the past to enable Dynamic Data functionality in a web application the application needed to follow a couple of rules:&lt;/p&gt;  &lt;p&gt;- It had to have a data model such as Entity Framework or Linq to SQL&lt;/p&gt;  &lt;p&gt;- The data model had to be registered at startup in Global.asax&lt;/p&gt;  &lt;p&gt;- The DynamicData directory had to exist in the web application&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="" border="0" alt="" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/ASP.NETDynamicDataPreview4Available_9547/320px-Right_pointing_double_angle_quotation_mark_sh1_svg_3.png" width="40" height="44" /&gt; One of the new features this new preview release supports is adding field templates and validation to any ASP.NET web page without having to meet these requirements.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9593714" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Dynamic+Data/default.aspx">Dynamic Data</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Dynamic Data @ ASP.NET Professionals User Group</title><link>http://blogs.msdn.com/jimoneil/archive/2009/04/13/dynamic-data-asp-net-professionals-user-group.aspx</link><pubDate>Mon, 13 Apr 2009 16:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9545571</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9545571.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9545571</wfw:commentRss><description>&lt;p&gt;I’ll be presenting at the second meeting of the &lt;a href="http://neasp.net"&gt;ASP.NET Professionals User Group&lt;/a&gt; this coming Wednesday in Waltham.&amp;#160; &lt;a href="http://www.pluralsight.com/community/blogs/fritz/"&gt;Fritz Onion&lt;/a&gt; kicked things off last month with &lt;em&gt;“The Changing Face of ASP.NET,”&lt;/em&gt; an overview of what developers need to know before embarking on their next ASP.NET project.&amp;#160; This month we’ll take a deeper dive into one of the technologies Fritz touched on, namely ASP.NET Dynamic Data:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Dynamic Data: From Data to CRUD in Five Minutes (or so)&lt;/strong&gt;       &lt;br /&gt;      &lt;br /&gt;ASP.NET Dynamic Data, introduced with the .NET Framework 3.5 SP1, is a customizable, scaffolding framework for building data-driven ASP.NET web sites. Layering on top of data access technologies like LINQ to SQL and Entity Framework, you can build a CRUD (Create-Read-Update-Delete) site literally in minutes. Additionally, you can make use of new dynamic controls, page and control templates, and custom validation to extend your site far beyond the 'out-of-the-box' experience.&lt;/p&gt; &lt;/blockquote&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="376" align="center"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="83"&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="291"&gt;Wednesday, April 15, 2009&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="291"&gt;6:15 – 8:30 p.m          &lt;br /&gt;&lt;font size="1"&gt;(save doing your taxes for &lt;em&gt;after&lt;/em&gt; the meeting!)&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="83"&gt;&lt;strong&gt;Place&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="291"&gt;Microsoft          &lt;br /&gt;201 Jones Road           &lt;br /&gt;Waltham MA 02451&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;a href="http://neasp.net"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="New England ASP.NET Professionals User Group" border="0" alt="New England ASP.NET Professionals User Group" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/DynamicDataASP.NETProfessionalsUserGroup_AA9C/image_3.png" width="521" height="80" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9545571" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Dynamic+Data/default.aspx">Dynamic Data</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/User+Group/default.aspx">User Group</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>M-V-C is H-E-R-E</title><link>http://blogs.msdn.com/jimoneil/archive/2009/03/18/m-v-c-is-h-e-r-e.aspx</link><pubDate>Wed, 18 Mar 2009 20:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9485667</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9485667.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9485667</wfw:commentRss><description>&lt;p&gt;Here’s one of a number of cool announcements coming out of &lt;a href="http://2009.visitmix.com/"&gt;MIX 09&lt;/a&gt; going on now at the Venetian in Las Vegas.&amp;#160; The ASP.NET MVC (Model-View-Controller) Framework version 1.0 is now live.&amp;#160; This is the culmination of a pretty amazing exercise in transparent development in which multiple previews and release candidates were made available to the community, and an active dialog was maintained on the &lt;a href="http://www.asp.net/mvc"&gt;ASP.NET Web Site&lt;/a&gt; as well as by key bloggers &lt;a href="http://www.amazon.com/gp/product/0470384611?ie=UTF8&amp;amp;tag=scoblo04-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0470384611"&gt;&lt;img style="border-right-width: 0px; margin: 10px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Professional ASP.NET MVC" border="0" alt="Professional ASP.NET MVC" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/MVCisHERE_12737/image_3.png" width="89" height="112" /&gt;&lt;/a&gt;like &lt;a href="http://www.haacked.com"&gt;Phil Haack&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/scottgu"&gt;Scott Guthrie&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you didn’t have the chance to be part of the evolution of ASP.NET MVC, there’s a great set of tutorial resources on the &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET Web Site&lt;/a&gt;, including a training kit.&amp;#160; There’s also a &lt;strong&gt;&lt;a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf"&gt;free e-book tutorial&lt;/a&gt;&lt;/strong&gt; authored by Scott Guthrie.&amp;#160; This 185-page, soup-to-nuts walkthrough is actually chapter 1 of an upcoming book from Wrox Press: &lt;em&gt;&lt;a href="http://www.amazon.com/gp/product/0470384611?ie=UTF8&amp;amp;tag=scoblo04-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0470384611"&gt;Professional ASP.NET MVC 1.0&lt;/a&gt;&lt;/em&gt; (with co-authors &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt;, &lt;a href="http://blog.wekeroad.com/"&gt;Rob Conery&lt;/a&gt;, and &lt;a href="http://www.haacked.com"&gt;Phil Haack&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf"&gt;&lt;strong&gt;Download the e-book tutorial&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I just stumbled across the &lt;a href="http://girldeveloper.com/waxing-dev/asp-net-mvc-translated-for-the-web-forms-programmer-1-in-a-series/"&gt;first of a series of blog posts&lt;/a&gt; by Sara Chipps on MVC for the Web Forms programmer.&amp;#160; She does a great job of&amp;#160; ‘translating’ between the two technologies, which should help ease the anxiety!&amp;#160; Keep an eye on her blog as you start exploring ASP.NET MVC.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9485667" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MVC/default.aspx">MVC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MIX/default.aspx">MIX</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>TONIGHT! Inaugural Meeting of ASP.NET Professionals</title><link>http://blogs.msdn.com/jimoneil/archive/2009/03/16/tonight-inaugural-meeting-of-asp-net-professionals.aspx</link><pubDate>Mon, 16 Mar 2009 16:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9479482</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9479482.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9479482</wfw:commentRss><description>&lt;p&gt;Quick reminder: the first meeting of the newly formed &lt;a href="http://neasp.net"&gt;ASP.NET Professionals User Group&lt;/a&gt; takes place tonight at the Microsoft office at 201 Jones Road in Waltham.&amp;#160; The meeting runs from 6:15 to 8:30.&amp;#160; Regular meetings will occur on the 4th Tuesday of each month.&lt;/p&gt;  &lt;p&gt;Kicking off the new group tonight will be &lt;a href="http://neasp.net/Default.aspx"&gt;Fritz Onion speaking&lt;/a&gt; on &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;The Changing Face of ASP.NET Development&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Ajax, MVC, jQuery, DynamicData - things you should know before you start your next ASP.NET project.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/TONIGHTInauguralMeeting.NETProfessionals_C8D7/image_3.png" width="514" height="79" /&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9479482" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Dynamic+Data/default.aspx">Dynamic Data</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MVC/default.aspx">MVC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/User+Group/default.aspx">User Group</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Massachusetts/default.aspx">Massachusetts</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Get into the MIX09</title><link>http://blogs.msdn.com/jimoneil/archive/2009/03/04/get-into-the-mix09.aspx</link><pubDate>Wed, 04 Mar 2009 18:43:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9458609</guid><dc:creator>joneil</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9458609.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9458609</wfw:commentRss><description>&lt;p&gt;It’s exactly two weeks until &lt;a href="http://2009.visitmix.com/"&gt;MIX09&lt;/a&gt;, and here’s the scene from my home office window juxtaposed with one of the MIX09 venue.&amp;#160; Vegas is looking pretty good, huh?&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="5" align="center"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;a href="http://www.weather.com/weather/local/01720"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Will Winter never end?" border="0" alt="Will Winter never end?" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/GetintotheMIX09_96D1/DSCN0843_1.jpg" width="180" height="240" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;a href="http://www.venetian.com/"&gt;&lt;img style="border-right-width: 0px; margin: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="O solo mio!" border="0" alt="O solo mio!" src="http://newton.typepad.com/content/images/2007/03/23/venetian.jpg" width="288" height="237" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Weather aside, there’s a lot of other great things in store at this year’s edition of *the* conference focused on next generation web, rich internet applications, and the collaboration between developers and designers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://2009.visitmix.com/"&gt;&lt;img style="border-right-width: 0px; margin: 0px 15px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/GetintotheMIX09_96D1/image_3.png" width="240" height="54" /&gt;&lt;/a&gt; There’s nearly &lt;a href="https://content.visitmix.com/2009/sessions/?categories=Silverlight"&gt;30 sessions on Silverlight&lt;/a&gt; alone, including not one, not two, but three on what’s in store with Silverlight 3.&amp;#160; There’s quite a few on ASP.NET MVC as well (for which &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ee4b2e97-8a72-449a-82d2-2f720d421031&amp;amp;displaylang=en"&gt;RC2 was made available&lt;/a&gt; last night).&amp;#160; Add to that Azure, Live Services, UI/UX, and you’ve got about &lt;a href="https://content.visitmix.com/2009/sessions/"&gt;10 dozen sessions&lt;/a&gt; to choose from.&lt;/p&gt;  &lt;p&gt;Check out the MIX09 site and schedule your &lt;strike&gt;vacation&lt;/strike&gt; training now!&amp;#160; And if you can’t be there, join Chris, Bob, and me on the &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/02/16/northeast-roadshow-march-madness-edition.aspx"&gt;Northeast Roadshow&lt;/a&gt;.&amp;#160; We’ll actually be in Hartford and Augusta while MIX is going on.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9458609" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MVC/default.aspx">MVC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MIX/default.aspx">MIX</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>ASP.NET MVC Release Candidate 2</title><link>http://blogs.msdn.com/jimoneil/archive/2009/03/03/asp-net-mvc-release-candidate-2.aspx</link><pubDate>Wed, 04 Mar 2009 06:22:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9457922</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9457922.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9457922</wfw:commentRss><description>&lt;p&gt;Hot of the wire(less)… &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ee4b2e97-8a72-449a-82d2-2f720d421031&amp;amp;displaylang=en"&gt;Release Candidate 2 of the ASP.NET Model View Controller (MVC)&lt;/a&gt; framework is now available.&amp;#160; This brings the technology, which provides an alternative methodology for building ASP.NET web sites, one step closer to release.&amp;#160; ASP.NET MVC builds off of the .NET Framework 3.5 SP1 and requires Visual Studio 2008 SP1 or Visual Studio Web Developer 2008 SP1 to get the complete development experience.&lt;/p&gt;  &lt;p&gt;If you haven’t had a chance yet to see what ASP.NET MVC is all about, there’s also a great set of tutorials, videos, and sample applications at the &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC site&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9457922" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/MVC/default.aspx">MVC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Inaugural Meeting: New England ASP.NET Professionals</title><link>http://blogs.msdn.com/jimoneil/archive/2009/02/14/inaugural-meeting-new-england-asp-net-professionals.aspx</link><pubDate>Sat, 14 Feb 2009 20:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9422038</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9422038.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9422038</wfw:commentRss><description>&lt;P&gt;There’s a new user group in town.&amp;nbsp; Spearheaded by Dean Serrentino, the &lt;A href="http://neasp.net/" mce_href="http://neasp.net"&gt;New England ASP.NET Professionals Group&lt;/A&gt; will focus on practices for building web applications with ASP.NET and related technologies.&amp;nbsp; The group will be meeting regularly on the 4th Tuesday of each month at the Microsoft office at 201 Jones Road in Waltham, MA.&lt;/P&gt;
&lt;P&gt;To kick of the group, though, the first meeting will be &lt;STRONG&gt;Monday, March 16&lt;/STRONG&gt;, from 6:15 – 8:30 p.m., at the Jones Road facility.&amp;nbsp; Noted Pluralsight author, speaker, and all-round technology guy, &lt;A href="http://www.pluralsight.com/community/blogs/fritz/default.aspx" mce_href="http://www.pluralsight.com/community/blogs/fritz/default.aspx"&gt;Fritz Onion&lt;/A&gt;,&amp;nbsp; will be speaking on&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;“The Changing Face of ASP.NET Development: Things you should know before you start your next ASP.NET project”&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;It’s a great way to get involved from the beginning in this group, and the coverage of technologies like jQuery, ASP.NET MVC, Dynamic Data on the 16th is something you don’t want to miss.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9422038" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/User+Group/default.aspx">User Group</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Massachusetts/default.aspx">Massachusetts</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>