<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>tsJensen.com</title>
    <link>http://www.tsjensen.com/blog/</link>
    <description />
    <language>en-us</language>
    <copyright>Tyler Jensen</copyright>
    <lastBuildDate>Sun, 15 Nov 2009 22:42:06 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8139.823</generator>
    <managingEditor>tyler@tsjensen.com</managingEditor>
    <webMaster>tyler@tsjensen.com</webMaster>
    <geo:lat>40.230954</geo:lat><geo:long>-111.680067</geo:long><image><link>http://www.tsjensen.com/blog/</link><url>http://www.tsjensen.com/images/tsjensen.gif</url><title>tsJensen</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/tsjensen" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=6162ea94-2509-40f7-a63c-70b00c1fa3e9</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,6162ea94-2509-40f7-a63c-70b00c1fa3e9.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,6162ea94-2509-40f7-a63c-70b00c1fa3e9.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6162ea94-2509-40f7-a63c-70b00c1fa3e9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Windows Azure Tools SDK (November 2009) Refactor or Restart?</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,6162ea94-2509-40f7-a63c-70b00c1fa3e9.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/22AbkOXnKtk/Windows+Azure+Tools+SDK+November+2009+Refactor+Or+Restart.aspx</link>
      <pubDate>Sun, 15 Nov 2009 22:42:06 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
The 1.0 release of Windows Azure SDK is now available. Download and read about what’s&#xD;
new &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&amp;amp;displaylang=en"&gt;here&lt;/a&gt;.&#xD;
Sadly, the AspProviders sample project was not included. I spent a few hours trying&#xD;
to bandage it up, but it was a hopeless cause. If a new AspProviders sample is not&#xD;
soon forthcoming, it will be easier to write one from scratch using the new SDK and&#xD;
the new project templates.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
When I tried to run my old project, after modifying some references to match those&#xD;
of a fresh project created with the new Visual Studio templates, the first thing that&#xD;
popped was a new local storage database script dialog result:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/WindowsAzureToolsSDKNovember2009Refactor_D9BB/az-nov09-01_2.png"&gt;&#xD;
            &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="az-nov09-01" border="0" alt="az-nov09-01" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/WindowsAzureToolsSDKNovember2009Refactor_D9BB/az-nov09-01_thumb.png" width="488" height="376"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;  &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’ve not explored them in detail but there are several new tables, some stored procedures&#xD;
and a few user defined functions in the new dev storage database.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I clicked okay and before I got my next error, I noticed the new baloon dialog name&#xD;
for the dev fabric, Windows Azure Simulation Environment:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/WindowsAzureToolsSDKNovember2009Refactor_D9BB/az-nov09-02_2.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="az-nov09-02" border="0" alt="az-nov09-02" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/WindowsAzureToolsSDKNovember2009Refactor_D9BB/az-nov09-02_thumb.png" width="387" height="92"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I also compared the csCFG and and csDEF config files for the Azure cloud service project.&#xD;
The XML namespace is the same and as near as I can tell there are no changes there.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The next thing I noticed was a new class in the web role of the new project template.&#xD;
Seems we now have a “Windows Service”-like OnStart and RoleEnironmentChanging set&#xD;
of startup and status change event handlers. This will be highly useful for web role&#xD;
applications that may have resource cleanup needs.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="brush: c-sharp;" name="code"&gt;public class WebRole : RoleEntryPoint&#xD;
{&#xD;
	public override bool OnStart()&#xD;
	{&#xD;
		DiagnosticMonitor.Start("DiagnosticsConnectionString");&#xD;
&#xD;
		// For information on handling configuration changes&#xD;
		// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.&#xD;
		RoleEnvironment.Changing += RoleEnvironmentChanging;&#xD;
&#xD;
		return base.OnStart();&#xD;
	}&#xD;
&#xD;
	private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)&#xD;
	{&#xD;
		// If a configuration setting is changing&#xD;
		if (e.Changes.Any(change =&amp;gt; change is RoleEnvironmentConfigurationSettingChange))&#xD;
		{&#xD;
			// Set e.Cancel to true to restart this role instance&#xD;
			e.Cancel = true;&#xD;
		}&#xD;
	}&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Another bit of great news is that the StorageClient goes from “sample” project to&#xD;
part of the release libraries. There were ample changes there which appear to have&#xD;
broken the AspProviders sample project severely. While that explains the missing AspProviders&#xD;
project disappointment, I do hope that it means the changes in the StorageClient namespace&#xD;
will make using Azure storage easier.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Much more to learn and blog about with the new release, but it looks as though I’ll&#xD;
need to start over on my “Aventure” sample. I’m glad that I don’t have loads of code&#xD;
to refactor to the new release. It makes starting over less painful. For those who&#xD;
have written large projects relying on the beta, all I can say is, “beta = subject&#xD;
to change.”&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=6162ea94-2509-40f7-a63c-70b00c1fa3e9"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=22AbkOXnKtk:Q839Ns-Su3s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/22AbkOXnKtk" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,6162ea94-2509-40f7-a63c-70b00c1fa3e9.aspx</comments>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/11/15/Windows+Azure+Tools+SDK+November+2009+Refactor+Or+Restart.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=52f313e4-c45a-4b0a-ac21-c8a6b841f2c8</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,52f313e4-c45a-4b0a-ac21-c8a6b841f2c8.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,52f313e4-c45a-4b0a-ac21-c8a6b841f2c8.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=52f313e4-c45a-4b0a-ac21-c8a6b841f2c8</wfw:commentRss>
      
      <title>OraHelper – An Oracle Version of the SqlHelper Class</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,52f313e4-c45a-4b0a-ac21-c8a6b841f2c8.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/n-25Uf67fbI/OraHelper+An+Oracle+Version+Of+The+SqlHelper+Class.aspx</link>
      <pubDate>Wed, 21 Oct 2009 15:05:51 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
A very long time ago, I wrote a little helper class clone of SqlHelper for Oracle&#xD;
which I called OraHelper. I haven’t looked at or touched the code in years, but I&#xD;
regularly get email asking where it’s gone to. It appears that the &lt;a href="http://www.asp.net"&gt;www.asp.net&lt;/a&gt; community&#xD;
gallery still refers to it but their link is broken. Rather than attempt to get them&#xD;
to fix the link, I’m posting it here.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Download &lt;a href="http://www.tsjensen.com/blog/content/binary/OraHelper.zip"&gt;OraHelper&#xD;
(12KB)&lt;/a&gt; here.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I don’t know how well this code works anymore. I’ve no Oracle database against which&#xD;
I can test it. I recall that one inquirer indicated that he wanted the code because&#xD;
he was limited to the .NET Framework 1.1. I found that rather sad to think about given&#xD;
how comfortable I’ve become with generics and lambdas of late.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For those of you who are doing .NET database access to Oracle, you may be helped even&#xD;
more by looking at &lt;a href="http://www.oracle.com/technology/tech/dotnet/index.html"&gt;Oracle’s&#xD;
.NET Developer Center&lt;/a&gt;. I can’t speak for the state of their current support. Perhaps&#xD;
there are readers that could post more informed comments on the subject here.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=52f313e4-c45a-4b0a-ac21-c8a6b841f2c8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=n-25Uf67fbI:V-QbmQrAI6k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/n-25Uf67fbI" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,52f313e4-c45a-4b0a-ac21-c8a6b841f2c8.aspx</comments>
      <category>Code</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/10/21/OraHelper+An+Oracle+Version+Of+The+SqlHelper+Class.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=0ccd0ced-18e1-4fe3-81e8-fd38fba4347f</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,0ccd0ced-18e1-4fe3-81e8-fd38fba4347f.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,0ccd0ced-18e1-4fe3-81e8-fd38fba4347f.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0ccd0ced-18e1-4fe3-81e8-fd38fba4347f</wfw:commentRss>
      
      <title>Building Enterprise Applications with Silverlight 3, .NET RIA Services and Windows Azure Part 1</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,0ccd0ced-18e1-4fe3-81e8-fd38fba4347f.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/0NLie9rkjyE/Building+Enterprise+Applications+With+Silverlight+3+NET+RIA+Services+And+Windows+Azure+Part+1.aspx</link>
      <pubDate>Mon, 19 Oct 2009 01:58:29 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
After spending last weekend working on and blogging about Silverlight 3 and .NET RIA&#xD;
services, I decided I’d look to build out a membership, profile and role provider&#xD;
that would use Windows Azure storage. Much to my delight, I stumbled into the AspProvidersDemo&#xD;
code that comes with the &lt;a href="http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=aa40f3e2-afc5-484d-b4e9-6a5227e73590&amp;amp;displaylang=en"&gt;Windows&#xD;
Azure SDK&lt;/a&gt; or perhaps the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=8D75D4F7-77A4-4ADF-BCE8-1B10608574BB&amp;amp;displaylang=en"&gt;Visual&#xD;
Studio 2008 Tools for Azure&lt;/a&gt;. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
No matter, you need them both to follow along with this post. If you have not already,&#xD;
you should look at my previous post and make sure you prepare your environment for&#xD;
Silverlight 3 in addition to signing up for your Azure account and installed the tools&#xD;
mentioned &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can &lt;a href="http://www.tsjensen.com/blog/content/binary/cloud1.zip"&gt;download&#xD;
the entire solution file (434KB)&lt;/a&gt; and skip to the momentous striking of your F5&#xD;
key if you like. Or you can follow along here and blunder through this adventure as&#xD;
I did. (I recommend cheating now and downloading the code.)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here’s the step-by-step details. I’ll try to spare the you excruciating minutiae and&#xD;
keep it as exciting as possible.     &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I started by creating a standard Cloud Service application called MyFilesCloudService&#xD;
with a web role called WebFilesRole. I then added a Silverlight Business Application&#xD;
called Adventure. Unfortunately, this template does not allow you to select the web&#xD;
role application to host the Silverlight app.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I removed the Adventure.Web application and in the web role’s project properties added&#xD;
the Silverlight app in the Silverlight Application tab. (ERROR: This turned out to&#xD;
be a problem which I solved by added a throwaway standard Silverlight app to the solution,&#xD;
selecting the WebFilesRole app as the host. I am still not certain why, but I’ll spare&#xD;
you the grisly details of experimentation with the web.config. If you haven’t already,&#xD;
this is a good place to stop and download the code.)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I copied the AspProviders and StorageClient projects from the Azure SDK demos folder&#xD;
into the solution directory and added them to the solution. I also copied the relevant&#xD;
sections from the web.config for the web role and the ServiceConfiguration.cscfg and&#xD;
ServiceDefinition.csdef files in cloud service project. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I hit F5 for kicks and get (via Event Viewer) an event 3007, “A compilation error&#xD;
has occurred.” Upon further digging I realize that the profile provider is configured&#xD;
to inherit it’s ProfileBase from UserProfile. The class is in the demo’s web role.&#xD;
Steal that too. Here it is as added to the web role in my project:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
using System;&#xD;
using System.Collections.Generic;&#xD;
using System.Linq;&#xD;
using System.Web;&#xD;
using System.Web.Profile;&#xD;
using System.Web.Security;&#xD;
&#xD;
namespace WebFilesRole&#xD;
{&#xD;
   public class UserProfile : ProfileBase&#xD;
   {&#xD;
      public static UserProfile GetUserProfile(string username)&#xD;
      {&#xD;
         return Create(username) as UserProfile;&#xD;
      }&#xD;
&#xD;
      public static UserProfile GetUserProfile()&#xD;
      {&#xD;
         return Create(Membership.GetUser().UserName) as UserProfile;&#xD;
      }&#xD;
&#xD;
&#xD;
      [SettingsAllowAnonymous(false)]&#xD;
      public string Country&#xD;
      {&#xD;
         get { return base["Country"] as string; }&#xD;
         set { base["Country"] = value; }&#xD;
      }&#xD;
&#xD;
      [SettingsAllowAnonymous(false)]&#xD;
      public string Gender&#xD;
      {&#xD;
         get { return base["Gender"] as string; }&#xD;
         set { base["Gender"] = value; }&#xD;
      }&#xD;
&#xD;
      [SettingsAllowAnonymous(false)]&#xD;
      public int Age&#xD;
      {&#xD;
         get { return (int)(base["Age"]); }&#xD;
         set { base["Age"] = value; }&#xD;
      }&#xD;
   }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I boldly hit F5 again and get this gem:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
Configuration Error &#xD;
&lt;br&gt;&#xD;
Initialization of data service structures (tables and/or blobs) failed!&lt;br&gt;&#xD;
The most probable reason for this is that the storage endpoints are not configured&#xD;
correctly.&lt;br&gt;&#xD;
Line 133: type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
A little searching and googling and I learn that I need to right-click on my cloud&#xD;
service application and select “Create Test Storage Tables.” I do it and bada-bing,&#xD;
I get this nice dialog and Output window text:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3RIA.NETProviderModelforAzure_10745/advent3_2.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="advent3" border="0" alt="advent3" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3RIA.NETProviderModelforAzure_10745/advent3_thumb.png" width="459" height="204"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
DevTableGen : Generating database 'MyFilesCloudService'&lt;br&gt;&#xD;
DevTableGen : Generating table 'Roles' for type 'Microsoft.Samples.ServiceHosting.AspProviders.RoleRow'&lt;br&gt;&#xD;
DevTableGen : Generating table 'Sessions' for type 'Microsoft.Samples.ServiceHosting.AspProviders.SessionRow'&lt;br&gt;&#xD;
DevTableGen : Generating table 'Membership' for type 'Microsoft.Samples.ServiceHosting.AspProviders.MembershipRow'&lt;br&gt;&#xD;
===== Create test storage tables succeeded =====&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
Aha! I go examine my local SQL Server instance and sure enough, there’s a new DB called&#xD;
MyFilesCloudService with some interesting tables. You can take at look at your own&#xD;
when you’ve read far enough along here to learn to click that “Create Test Storage&#xD;
Tables” magic context menu item too.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So I experiment a little and create a couple of test tables like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
using System;&#xD;
using System.Collections.Generic;&#xD;
using System.Linq;&#xD;
using System.Web;&#xD;
using Microsoft.Samples.ServiceHosting.StorageClient;&#xD;
&#xD;
namespace WebFilesRole&#xD;
{&#xD;
   public class MyTestDataServiceContext : TableStorageDataServiceContext&#xD;
   {&#xD;
      public IQueryable&lt;MyTestRow&gt;&#xD;
Roles { get { return this.CreateQuery&lt;MyTestRow&gt;&#xD;
("MyTest"); } } } public class MyTestRow : TableStorageEntity { public string MyTestName&#xD;
{ get; set; } } }&#xD;
&lt;/MyTestRow&gt;&lt;/MyTestRow&gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Note the nice and easy TableStorageEntity and it’s TableStorageDataServiceContext.&#xD;
Just don’t make the mistake I did and forget to name the property something unique.&#xD;
I tried Roles (yeah, a copy/past error) and got a nasty message like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
No table generated for property 'Roles' of class 'WebFilesRole.MyTestDataServiceContext'&#xD;
because the name matches (or differs only in case) from the name of a previously generated&#xD;
table&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
I add an AppInitializer class to make sure these tables get created in the cloud when&#xD;
run there. First, I add a bit of code to the Application_BeginRequest method in the&#xD;
Global.asax.cs (the one I just added but didn’t tell you about).&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
protected void Application_BeginRequest(object sender, EventArgs e)	&#xD;
{	&#xD;
   HttpApplication app = sender as HttpApplication;   &#xD;
   if (app != null)   &#xD;
   {   &#xD;
      HttpContext context = app.Context;   &#xD;
      AppInitializer.Initialize(context);   &#xD;
   }   &#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I then add the initializer class at the bottom of that same code file.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
internal static class AppInitializer&#xD;
{&#xD;
   static object lob = new object();&#xD;
   static bool alreadyInitialized = false;&#xD;
   public static void Initialize(HttpContext context)&#xD;
   {&#xD;
      if (alreadyInitialized) return;&#xD;
      lock (lob)&#xD;
      {&#xD;
         if (alreadyInitialized) return;&#xD;
         InitializeAppStartFirstRequest(context);&#xD;
         alreadyInitialized = true;&#xD;
      }&#xD;
   }&#xD;
&#xD;
   private static void InitializeAppStartFirstRequest(HttpContext context)&#xD;
   {&#xD;
      StorageAccountInfo account = StorageAccountInfo.GetDefaultTableStorageAccountFromConfiguration();&#xD;
      TableStorage.CreateTablesFromModel(typeof(Microsoft.Samples.ServiceHosting.AspProviders.MembershipRow));&#xD;
      TableStorage.CreateTablesFromModel(typeof(Microsoft.Samples.ServiceHosting.AspProviders.RoleRow));&#xD;
      TableStorage.CreateTablesFromModel(typeof(Microsoft.Samples.ServiceHosting.AspProviders.SessionRow));&#xD;
      TableStorage.CreateTablesFromModel(typeof(Room));&#xD;
   }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I then add some test code into the Default.aspx.cs which I won’t bore you with here.&#xD;
You can look at it in the downloaded solution. I got a weird error with the session&#xD;
test, but after a reboot, it went away, so I’ll chalk that up to the development fabric&#xD;
being a CTP.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now I want to get back to working Silverlight into the picture. I need to create an&#xD;
admin user for my test login, so I add some code to the AppInitializer class in the&#xD;
Global.asax.cs file like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
MembershipUser user = Membership.GetUser("admin");&#xD;
if (null == user)&#xD;
{&#xD;
   //create admin user&#xD;
   MembershipCreateStatus status = MembershipCreateStatus.Success;&#xD;
   Membership.CreateUser("admin", "admin", "admin@admin.com", "admin-admin", "admin", &#xD;
      true, Guid.NewGuid(), out status);&#xD;
&#xD;
   //add admin user to admin role&#xD;
   if (status == MembershipCreateStatus.Success)&#xD;
   {&#xD;
      if (!Roles.RoleExists("admin"))&#xD;
      {&#xD;
         Roles.CreateRole("admin");&#xD;
      }&#xD;
      Roles.AddUserToRole("admin", "admin");&#xD;
   }&#xD;
&#xD;
   //add profile data to admin user&#xD;
   UserProfile profile = UserProfile.Create("admin") as UserProfile;&#xD;
   profile.Age = 40;    //not my true age&#xD;
   profile.Country = "US";&#xD;
   profile.Gender = "M";&#xD;
   profile.Save();&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I look at the UserProfile class and know that the DomainService’s User class needs&#xD;
the same properties in order for the Silverlight RiaContext to know about them. I&#xD;
discovered in the metadata code the following comments in the UpdateUser method of&#xD;
the  System.Web.Ria.ApplicationServices.AuthenticationBase&amp;lt;T&amp;gt; base class&#xD;
used for the AuthenticationService domain service class:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
// Remarks:&#xD;
//     By default, the user is persisted to the System.Web.Profile.ProfileBase.&#xD;
//     In writing the user to the profile, the provider copies each property in&#xD;
//     T into the corresponding value in the profile. This behavior can be tailored&#xD;
//     by marking specified properties with the System.Web.Ria.ApplicationServices.ProfileUsageAttribute.&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I know now that I want the UserProfile and the User classes to have the same profile&#xD;
properties, so I add an interface above the UserProfile class like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
public interface IUserProfile	&#xD;
{	&#xD;
   string Country { get; set; }   &#xD;
   string Gender { get; set; }   &#xD;
   int Age { get; set; }   &#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And then add the same properties found in UserProfile to the User class in the AuthenticationService.cs&#xD;
file as follows:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
public class User : UserBase, IUserProfile   &#xD;
{   &#xD;
   // NOTE: Profile properties can be added for use in Silverlight application.   &#xD;
   // To enable profiles, edit the appropriate section of web.config file.   &#xD;
   &#xD;
   // public string MyProfileProperty { get; set; }   &#xD;
   &#xD;
   public string Country { get; set; }   &#xD;
   &#xD;
   public string Gender { get; set; }   &#xD;
   &#xD;
   public int Age { get; set; }   &#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
I try to run it and get the following error on the Silverlight app when I try to login&#xD;
using admin/admin: "The specified resource was not found." A little digging reveals&#xD;
that I need two things: first, some additions to the web.config file that I was missing,&#xD;
and second, the ServiceDefinition.csdef had to have it’s enableNativeCodeExecution&#xD;
set to true. Here’s the pieces:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: xml;"&gt;&#xD;
&amp;lt;!-- handlers and httpHandlers sections require the following additions --&amp;gt;&#xD;
&amp;lt;handlers&amp;gt;&#xD;
   &amp;lt;add name="DataService" verb="GET,POST" path="DataService.axd" type="System.Web.Ria.DataServiceFactory, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&amp;gt;		&#xD;
&amp;lt;/handlers&amp;gt;&#xD;
&#xD;
&amp;lt;httpHandlers&amp;gt;&#xD;
   &amp;lt;add path="DataService.axd" verb="GET,POST" type="System.Web.Ria.DataServiceFactory, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/&amp;gt;		&#xD;
&amp;lt;/httpHandlers&amp;gt;&#xD;
&#xD;
&amp;lt;!-- the ServiceDefinition.csdef gets the enableNativeCodeExecution set to true --&amp;gt;&#xD;
&amp;lt;WebRole name="WebFilesRole" enableNativeCodeExecution="true"&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Once those changes were made, I was able to run the Silverlight application, login&#xD;
using admin/admin and logout. Now one more item on the agenda for this post. I want&#xD;
to see the profile information we added in the AppInitializer code. So I modify the&#xD;
LoginControl.xaml and LoginControl.xaml.cs as follows.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: xml;"&gt;&#xD;
&amp;lt;StackPanel x:Name="logoutControls" Style="{StaticResource LoginPanelStyle}"&amp;gt;&#xD;
   &amp;lt;TextBlock Text="welcome " Style="{StaticResource WelcomeTextStyle}"/&amp;gt;&#xD;
   &amp;lt;TextBlock Text="{Binding Path=User.Name}" Style="{StaticResource WelcomeTextStyle}"/&amp;gt;&#xD;
      &amp;lt;TextBlock Text="  |  " Style="{StaticResource SpacerStyle}"/&amp;gt;&#xD;
      &amp;lt;TextBlock Text="" x:Name="ProfileText" Style="{StaticResource WelcomeTextStyle}"/&amp;gt;&#xD;
      &amp;lt;TextBlock Text="  |  " Style="{StaticResource SpacerStyle}"/&amp;gt;&#xD;
   &amp;lt;Button x:Name="logoutButton" Content="logout" Click="LogoutButton_Click" Style="{StaticResource LoginRegisterLinkStyle}" /&amp;gt;&#xD;
&amp;lt;/StackPanel&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
With the code behind changed like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
private void UpdateLoginState()	&#xD;
{	&#xD;
   if (RiaContext.Current.User.AuthenticationType == "Windows")   &#xD;
   {   &#xD;
      VisualStateManager.GoToState(this, "windowsAuth", true);   &#xD;
   }   &#xD;
   else //User.AuthenticationType == "Forms"   &#xD;
   {   &#xD;
      VisualStateManager.GoToState(this,    &#xD;
         RiaContext.Current.User.IsAuthenticated ? "loggedIn" : "loggedOut", true);   &#xD;
   &#xD;
      if (RiaContext.Current.User.IsAuthenticated)   &#xD;
      {   &#xD;
         this.ProfileText.Text = string.Format("age:{0}, country:{1}, gender:{2}",    &#xD;
            RiaContext.Current.User.Age,    &#xD;
            RiaContext.Current.User.Country,    &#xD;
            RiaContext.Current.User.Gender);   &#xD;
      }   &#xD;
   }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Now when I login, I get to look at something like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3RIA.NETProviderModelforAzure_10745/advent8_2.png"&gt;&#xD;
            &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="advent8" border="0" alt="advent8" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3RIA.NETProviderModelforAzure_10745/advent8_thumb.png" width="447" height="162"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Cool. In Part 2, I’ll modify the UserProfile to capture the data I want to keep in&#xD;
my Adventure application and complete the user registration changes to the Silverlight&#xD;
application as well as clean up and prepare the app for some real application development&#xD;
in follow-on posts.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you have any questions or ways to do this better, I’d love to hear from you.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=0ccd0ced-18e1-4fe3-81e8-fd38fba4347f"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=0NLie9rkjyE:dBVCdcuA3l4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/0NLie9rkjyE" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,0ccd0ced-18e1-4fe3-81e8-fd38fba4347f.aspx</comments>
      <category>Azure</category>
      <category>Code</category>
      <category>Silverlight</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/10/19/Building+Enterprise+Applications+With+Silverlight+3+NET+RIA+Services+And+Windows+Azure+Part+1.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=967c21b6-13a8-4385-94ba-f94893f8e347</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,967c21b6-13a8-4385-94ba-f94893f8e347.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,967c21b6-13a8-4385-94ba-f94893f8e347.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=967c21b6-13a8-4385-94ba-f94893f8e347</wfw:commentRss>
      <title>Silverlight 3 and .NET RIA Services Forms Security</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,967c21b6-13a8-4385-94ba-f94893f8e347.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/tUhQ_KC2ANM/Silverlight+3+And+NET+RIA+Services+Forms+Security.aspx</link>
      <pubDate>Mon, 12 Oct 2009 21:01:52 GMT</pubDate>
      <description>&lt;p&gt;
I finally carved out some time to experiment with Silverlight 3 and .NET RIA Services
over the weekend. Specifically I wanted to experiment with Forms security and how
one might secure a Silverlight "page" as well as the services on the server side along
with a custom membership, role and profile providers. Here's the result. 
&lt;p&gt;
&lt;strong&gt;Tools&lt;/strong&gt;
&lt;br&gt;
Before you follow along on your own machine, be sure that you have these: 
&lt;p&gt;
&lt;strong&gt;1. Visual Studio 2008 Pro &lt;/strong&gt;(&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=83c3a1ec-ed72-4a79-8961-25635db0192b&amp;amp;displaylang=en"&gt;Visual
Studio 2008 Professional Edition (90-day Trial)&lt;/a&gt;)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2. Visual Studio 2008 SP1 &lt;/strong&gt;(&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E&amp;amp;displaylang=en"&gt;Microsoft
Visual Studio 2008 Service Pack 1 (Installer)&lt;/a&gt;) 
&lt;p&gt;
&lt;strong&gt;3. Silverlight SDK &lt;/strong&gt;(&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&amp;amp;displaylang=en"&gt;Microsoft®
Silverlight™ 3 Tools for Visual Studio 2008 SP1&lt;/a&gt;) 
&lt;p&gt;
&lt;strong&gt;4. RIA Services July 2009 Preview &lt;/strong&gt;(&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&amp;amp;displaylang=en"&gt;Microsoft
.NET RIA Services July 2009 Preview&lt;/a&gt;) 
&lt;p&gt;
&lt;strong&gt;5. Download code for this post&lt;/strong&gt; (&lt;a href="http://www.tsjensen.com/blog/content/binary/DemoAgRia.zip"&gt;download
DemoAgRia.zip 427KB&lt;/a&gt;). 
&lt;p&gt;
Once you have the tools installed, you can start a new Visual Studio project from
the Silverlight projects types called Silverlight Business Application. Name yours
whatever you like. I've chosen DemoAgRia. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s1_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="s1" border="0" alt="s1" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s1_thumb_1.png" width="802" height="541"&gt;&lt;/a&gt; 
&lt;p&gt;
The project template creates a Silverlight and ASP.NET Web Application project and
populates them with a number of helpful artifacts to get us started. There are two
DomainService classes, one for authentication and one for user registration. These
services use the standard ASP.NET Membership, Role and Profile provider model. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s2_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="s2" border="0" alt="s2" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s2_thumb.png" width="373" height="584"&gt;&lt;/a&gt; 
&lt;p&gt;
You also get several "views" or Page and ChildWindow XAML controls with code-behind.
These files are a familiar construct to any classic ASP.NET developer. Of course XAML
is a whole new ballgame compared to the hodge podge of HTML. But rather than focus
on these page and child window objects, I will focus this post on the security aspects
of the app. 
&lt;p&gt;
While the project template sets authentication to "Forms" based authentication there
are no membership, role, or profile providers configured in the web.config. Since
I'm going to create some custom providers in order to just experiment with the mechanics
of security within the Silverlight and the web app, I'll just spin up some stub providers.
Here's the web.config sections (including the "Forms" authentication node) for them: 
&lt;/p&gt;
&lt;pre name="code" class="brush: xml;"&gt;
&amp;lt;authentication mode="Forms"/&gt;

&amp;lt;roleManager enabled="true" defaultProvider="AgRoleProvider"&gt;
  &amp;lt;providers&gt;
    &amp;lt;clear /&gt;
    &amp;lt;add name="AgRoleProvider" type="DemoAgRia.Web.AgRoleProvider" /&gt;
  &amp;lt;/providers&gt;
&amp;lt;/roleManager&gt;
&amp;lt;membership defaultProvider="AgMembershipProvider"&gt;
  &amp;lt;providers&gt;
    &amp;lt;clear /&gt;
    &amp;lt;add name="AgMembershipProvider" type="DemoAgRia.Web.AgMembershipProvider" /&gt;
  &amp;lt;/providers&gt;
&amp;lt;/membership&gt;
&amp;lt;profile enabled="true" defaultProvider="AgProfileProvider"&gt;
  &amp;lt;providers&gt;
    &amp;lt;clear /&gt;
    &amp;lt;add name="AgProfileProvider" type="DemoAgRia.Web.AgProfileProvider" /&gt;
  &amp;lt;/providers&gt;
  &amp;lt;properties&gt;
    &amp;lt;clear /&gt;
    &amp;lt;add name="PhoneNumber" /&gt;
    &amp;lt;add name="FullName" /&gt;
  &amp;lt;/properties&gt;
&amp;lt;/profile&gt;
&lt;/pre&gt;
&lt;p&gt;
Now I stub out the provider classes in the Providers folder of the web application.
I won't post the code here because the implementation provides dumb data or place
holders. Of course, a real set of providers, whether you use the AspSqlMembership
provider or role your own, will do real authentication and provide real role and profile
access. The stub membership class will authenticate any username and password to allow
us to just play with the happy path for now. 
&lt;p&gt;
Note the custom properties I've added to the profile provider above. These require
some custom code in two places. First, in the profile provider class and then in the
User class found in the AuthenticationService.cs file. Here's the code for both: 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;in AgProfileProvider.cs:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt;
public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, 
  SettingsPropertyCollection collection)
{
  string userName = context["UserName"].ToString(); //use this to look up real values for user

  SettingsPropertyValueCollection s = new SettingsPropertyValueCollection();
  foreach (SettingsProperty p in collection)
  {
    if (p.Name == "PhoneNumber") s.Add(new SettingsPropertyValue(p) { PropertyValue = "508.555.1212" });
    if (p.Name == "FullName") s.Add(new SettingsPropertyValue(p) { PropertyValue = "Tyler Jensen" });
    //NOTE: replace with real lookups
  }
  return s;
}
&lt;/pre

&lt;p&gt;&lt;strong&gt;in
AuthenticationService.cs:&lt;/strong&gt;&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt;
public class User : UserBase
{
  // NOTE: Profile properties can be added for use in Silverlight application.
  // To enable profiles, edit the appropriate section of web.config file.

  // public string MyProfileProperty { get; set; }
  public string FullName { get; set; }
  public string PhoneNumber { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;
Now to use these new profile provider properties, let's modify some XAML in the LoginControl.xaml
file so that rather than seeing the username of the logged in user, we'll see the
FullName and the PhoneNumber. 
&lt;p&gt;
Here's the existing XAML which we will modify:
&lt;/p&gt;
&lt;pre name="code" class="brush: xml;"&gt;
&amp;lt;StackPanel x:Name="logoutControls" Style="{StaticResource LoginPanelStyle}"&gt;
  &amp;lt;TextBlock Text="welcome " Style="{StaticResource WelcomeTextStyle}"/&gt;
  &amp;lt;TextBlock Text="{Binding Path=User.Name}" Style="{StaticResource WelcomeTextStyle}"/&gt;
  &amp;lt;TextBlock Text="  |  " Style="{StaticResource SpacerStyle}"/&gt;
  &amp;lt;Button x:Name="logoutButton" Content="logout" Click="LogoutButton_Click" Style="{StaticResource LoginRegisterLinkStyle}" /&gt;  
&amp;lt;/StackPanel&gt;
&lt;/pre&gt;
&lt;p&gt;
We now modify this XAML snippet to this:
&lt;/p&gt;
&lt;pre name="code" class="brush: xml;"&gt; 
&amp;lt;StackPanel x:Name="logoutControls" Style="{StaticResource LoginPanelStyle}"&gt;
  &amp;lt;TextBlock Text="welcome " Style="{StaticResource WelcomeTextStyle}"/&gt;
  &amp;lt;TextBlock Text="{Binding Path=User.FullName}" Style="{StaticResource WelcomeTextStyle}"/&gt;
  &amp;lt;TextBlock Text="  |  phone: " Style="{StaticResource SpacerStyle}"/&gt;
  &amp;lt;TextBlock Text="{Binding Path=User.PhoneNumber}" Style="{StaticResource WelcomeTextStyle}"/&gt;
  &amp;lt;TextBlock Text="  |  " Style="{StaticResource SpacerStyle}"/&gt;
  &amp;lt;Button x:Name="logoutButton" Content="logout" Click="LogoutButton_Click" Style="{StaticResource LoginRegisterLinkStyle}" /&gt;
&amp;lt;/StackPanel&gt;
&lt;/pre&gt;
&lt;p&gt;
Now lets add a DomainService for fecthing some data. Right click on the web application's
Services folder and select Add | New Item. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s3_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="s3" border="0" alt="s3" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s3_thumb.png" width="806" height="488"&gt;&lt;/a&gt; 
&lt;p&gt;
Of course, we don't have a data or object context class, so we don't have any to choose
from in the dialog. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s4_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="s4" border="0" alt="s4" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s4_thumb.png" width="452" height="602"&gt;&lt;/a&gt; 
&lt;p&gt;
Leave "Enable client access" checked. We want a proxy class to automatically be generated
from our service class on the server side. Just click OK and let's create our own
custom DomainService. 
&lt;p&gt;
Now you'll see something like this:
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt; 
namespace DemoAgRia.Web.Services
{
  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.ComponentModel.DataAnnotations;
  using System.Linq;
  using System.Web.Ria;
  using System.Web.Ria.Data;
  using System.Web.DomainServices;


  // TODO: Create methods containing your application logic.
  [EnableClientAccess()]
  public class DemoDataService : DomainService
  {
  }
}
&lt;/pre&gt;
&lt;p&gt;
I'll put it into the root of the namespace by lopping off the ".Services" in the namespace
declaration. This is just a convenience to me. You can do with it what you like. 
&lt;p&gt;
Now let's add a couple of simplistic methods. Be sure to decorate them with the ServiceOperation
attribute or the build process will not autogenerate the DemoDataContext class and
proxy class in the Silverlight client app.
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt; 
[EnableClientAccess()]
public class DemoDataService : DomainService
{
  [ServiceOperation]
  public string GetApplicationName()
  {
    return "Demo Ag Ria";
  }

  [ServiceOperation]
  public string GetApplicationAddress()
  {
    return "http://www.demoagria.com";
  }
}
&lt;/pre&gt;
&lt;p&gt;
To use the DemoDataService on the client, let's try the following code in the Home.xaml.cs
file. Note the two additional using statements and take special note that all calls
to the server are asynchronous:
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt; 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.IO;
using DemoAgRia.Web;
using System.Windows.Ria.Data;

namespace DemoAgRia
{
  public partial class Home : Page
  {
    public Home()
    {
      InitializeComponent();
    }

    // Executes when the user navigates to this page.
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
      DemoDataContext ddc = new DemoDataContext();
      InvokeOperation&amp;lt;string&gt; invAddress = ddc.GetApplicationAddress();
      invAddress.Completed += new EventHandler(invAddress_Completed);
      
      InvokeOperation&amp;lt;string&gt; invAppName = ddc.GetApplicationName();
      invAppName.Completed += new EventHandler(invAppName_Completed);
    }

    void invAppName_Completed(object sender, EventArgs e)
    {
      InvokeOperation&amp;lt;string&gt; op = sender as InvokeOperation&amp;lt;string&gt;;
      string appName = op.Value;
      this.ContentText.Text += string.Format("{0}app name: {1}", Environment.NewLine, appName);
    }

    void invAddress_Completed(object sender, EventArgs e)
    {
      InvokeOperation&amp;lt;string&gt; op = sender as InvokeOperation&amp;lt;string&gt;;
      string address = op.Value;
      this.ContentText.Text += string.Format("{0}address: {1}", Environment.NewLine, address);
    }

  }
}
&lt;/pre&gt;
&lt;p&gt;
If you F5 and run a debug test, you'll note that the text in the Home page gets modified
as expected. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s5_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="s5" border="0" alt="s5" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s5_thumb.png" width="341" height="216"&gt;&lt;/a&gt; 
&lt;p&gt;
Now let's add a RequiresAuthentication to the GetApplicationName method:
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt;
[ServiceOperation, RequiresAuthentication]
public string GetApplicationName()
{
  return "Demo Ag Ria";
}
&lt;/pre&gt;
&lt;p&gt;
Run the app again and you will notice that the GetApplicationName's InvokeOperation&amp;lt;string&amp;gt;
object's Value property is null. Now login and click the About page link and then
go back to the Home page link. Note that the text has maintained it's state. We're
not clearing it, but this time we've added text which includes the app name. 
&lt;p&gt;
&lt;a href="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s6_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="s6" border="0" alt="s6" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/Silverlight3.NETRIAServicesFormsSecurity_CDDD/s6_thumb.png" width="357" height="238"&gt;&lt;/a&gt; 
&lt;p&gt;
Now try modifying the GetApplicationAddress method like this:
&lt;/p&gt;
&lt;pre name="code" class="brush: c-sharp;"&gt;
[ServiceOperation, RequiresRoles("Supervisor")]
public string GetApplicationAddress()
{
  return "http://www.demoagria.com";
}
&lt;/pre&gt;
&lt;p&gt;
Since the stubbed role provider gives your logged in user the Admin and Analyst role,
you can run this and see that you are getting a null value for the operation. Now
change the role to "Admin" and try the same thing. This time when you login and come
back to the Home page you'll see what we'd expect. 
&lt;p&gt;
Getting this far was almost enough fun, but then I wondered how I would prevent a
user from navigating to a specific Silverlight page if they were not authenticated.
There are probably better ways, but here's the solution I arrived at after a little
fiddling. &lt;pre name="code" class="brush: c-sharp;"&gt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

namespace DemoAgRia
{
  public class PageSecurity
  {
    private Page page;
    private string url;

    public PageSecurity(Page page)
    {
      this.page = page;
    }

    public void Authenticate()
    {
      Authenticate(null);
    }

    public void Authenticate(string url)
    {
      this.url = url;
      if (!RiaContext.Current.User.IsAuthenticated)
      {
        ErrorWindow ew = new ErrorWindow("You must be logged in to view this page.", 
          "Using this page is not allowed unless you are logged in.");
        ew.Title = "Authentication Required";
        ew.IntroductoryText.Text = "Not Authenticated";
        ew.LabelText.Text = "Message";
        ew.Closed += new EventHandler(ew_Closed);
        ew.Show();
      }
    }

    void ew_Closed(object sender, EventArgs e)
    {
      if (null == url)
        this.page.NavigationService.GoBack();
      else
      {
        if (!url.StartsWith("/")) url = "/" + url;
        try
        {
          this.page.NavigationService.Navigate(new Uri(url, UriKind.Relative));
        }
        catch
        {
          this.page.NavigationService.GoBack(); 
        }
      }
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;
To test this code, I've added the following code to the About.xaml.cs code to see
how it plays. &lt;pre name="code" class="brush: c-sharp;"&gt;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
  PageSecurity ps = new PageSecurity(this);
  ps.Authenticate("Home");
}
&lt;/pre&gt;
&lt;p&gt;
Now all you have to do is download the code and you've got a headstart on Silverlight
and .NET RIA Services security. Let me know if you find any exciting improvements
or alternatives. &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=967c21b6-13a8-4385-94ba-f94893f8e347" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=tUhQ_KC2ANM:vOwsQT6MOd4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/tUhQ_KC2ANM" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,967c21b6-13a8-4385-94ba-f94893f8e347.aspx</comments>
      <category>Code</category>
      <category>Silverlight</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/10/12/Silverlight+3+And+NET+RIA+Services+Forms+Security.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=5dccbf33-6af1-4b51-8fdd-1835877ff517</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,5dccbf33-6af1-4b51-8fdd-1835877ff517.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,5dccbf33-6af1-4b51-8fdd-1835877ff517.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=5dccbf33-6af1-4b51-8fdd-1835877ff517</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Reliability Equals Simplicity</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,5dccbf33-6af1-4b51-8fdd-1835877ff517.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/LtmvF0o7FuI/Reliability+Equals+Simplicity.aspx</link>
      <pubDate>Thu, 10 Sep 2009 02:53:36 GMT</pubDate>
      <description>&lt;p&gt;
I am extremely impressed by the sage wisdom of Sir Charles Antony Richard Hoare's &lt;i&gt;The
Emperor's Old Clothes&lt;/i&gt; given at his acceptance of the Turing Award in 1980 and
subsequently published by the Association for Computing Machinery (ACM) in 1981. Here
are my favorite excerpts. I hope you will read the entire text using the link below.
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
"You know, you shouldn't trust us intelligent programmers. We can think up such good
arguments for convincing ourselves and each other of the utterly absurd."&lt;br /&gt;
...&lt;br /&gt;
"Programmers are always surrounded by complexity; we cannot avoid it. Our applications
are complex because we are ambitious to use our computers in ever more sophisticated
ways. Programming is complex because of the large number of conflicting objectives
for each of our programming projects. If our basic tool, the language in which we
design and code our programs, is also complicated, the language itself becomes part
of the problem rather than part of its solution."&lt;br /&gt;
...&lt;br /&gt;
"At first I hoped that such a technically unsound project would collapse but I soon
realized it was doomed to success. Almost anything in software can be implemented,
sold, and even used given enough determination. There is nothing a mere scientist
can say that will stand against the flood of a hundred million dollars. But there
is one quality that cannot be purchased in this way--and that is reliability. The
price of reliability is the pursuit of the utmost simplicity. It is a price which
the very rich find most hard to pay."&lt;br /&gt;
...&lt;br /&gt;
"The mistakes which have made in the last twenty years are being repeated today on
an even grander scale."&lt;br /&gt;
...&lt;br /&gt;
"If only we could learn the right lessons from the successes of the past, we would
not need to learn from our failures."&lt;br /&gt;
...&lt;br /&gt;
"To have our best advice ignored is the common fate of all who take on the role of
consultant, ever since Cassandra pointed out the dangers of bringing a wooden horse
within the walls of Troy."
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Emperor's Old Clothes&lt;/strong&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/C._A._R._Hoare"&gt;Sir Charles Antony Richard Hoare&lt;/a&gt;
&lt;br /&gt;
Creator of the Quicksort algorithm&lt;br /&gt;
1980 Turing Award Winner&lt;br /&gt;
&amp;copy; 1981 ACM 0001-0782/81/0200-0075
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.cs.yale.edu/homes/arvind/cs422/doc/hoare.pdf"&gt;Full text here in
PDF.&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Having accidentally browsed into this today, I reiterate the axiom that complexity
is the enemy of sound software development and hereby recommit to following the path
of simplification, learning more lessons from my successes to avoid more failures
and to sometimes keeping my best advice to myself.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=5dccbf33-6af1-4b51-8fdd-1835877ff517" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=LtmvF0o7FuI:YmGrpkezioo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/LtmvF0o7FuI" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,5dccbf33-6af1-4b51-8fdd-1835877ff517.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/09/10/Reliability+Equals+Simplicity.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=ef18048e-e87a-4467-b5f0-ace8ca3e4753</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,ef18048e-e87a-4467-b5f0-ace8ca3e4753.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,ef18048e-e87a-4467-b5f0-ace8ca3e4753.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ef18048e-e87a-4467-b5f0-ace8ca3e4753</wfw:commentRss>
      
      <title>Enum to Dictionary with Description Attribute Reflection</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,ef18048e-e87a-4467-b5f0-ace8ca3e4753.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/GJxNAUcJaxM/Enum+To+Dictionary+With+Description+Attribute+Reflection.aspx</link>
      <pubDate>Fri, 28 Aug 2009 03:15:44 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
A week ago in a misguided attempt to make things easier, I created something like&#xD;
the following code. My mistake was not in creating the code necessarily, but in applying&#xD;
it to data driven auto generated enums. If you have those, don’t use this.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you have nice, well behaved static enums wandering around your code and you wish&#xD;
you had a nice way to convert that enum to a usable Dictionary&amp;lt;int, string&amp;gt;,&#xD;
then you’ve come to the right place. So dress up that drab enum with a Description&#xD;
attribute like you see below and call &lt;strong&gt;&lt;font face="Courier New"&gt;EnumConverter.ConvertToDictionary&amp;lt;&lt;font color="#0000ff"&gt;DrabEnum&lt;/font&gt;&amp;gt;();&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And let me know how it works out.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="brush: c-sharp;"&gt;&#xD;
using System;&#xD;
using System.Collections.Generic;&#xD;
using System.ComponentModel;&#xD;
using System.Linq;&#xD;
using System.Data.Linq;&#xD;
using System.Text;&#xD;
using System.Reflection;&#xD;
using System.Collections;&#xD;
&#xD;
namespace FunStuff&#xD;
{&#xD;
  public enum FunEnum&#xD;
  {&#xD;
    [Description("Happy Enum")]&#xD;
    Happy = 1,&#xD;
&#xD;
    [Description("Sad Enum")]&#xD;
    Sad = 2&#xD;
  }&#xD;
&#xD;
&#xD;
  public static class EnumConverter&#xD;
  {&#xD;
    private static object lo = new object(); //used for locking access to the Cache&#xD;
    private static Dictionary&amp;lt;Type, Dictionary&amp;lt;int, string&amp;gt;&amp;gt; enumStore = &#xD;
      new Dictionary&amp;lt;Type, Dictionary&amp;lt;int, string&amp;gt;&amp;gt;();&#xD;
&#xD;
    /// &amp;lt;summary&amp;gt;&#xD;
    /// Returns thread safe copy of enum value and name dictionary. Where Description &amp;lt;br /&amp;gt;&#xD;
    /// attribute exists, returns the description value.&#xD;
    /// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    public static Dictionary&amp;lt;int, string&amp;gt; ConvertToDictionary&amp;lt;T&amp;gt;() where T : IComparable&#xD;
    {&#xD;
      lock (lo)&#xD;
      {&#xD;
        Type t = typeof(T);&#xD;
        if (!t.IsEnum) throw new ArgumentException("T must be an enum.");&#xD;
        if (!enumStore.ContainsKey(t)) enumStore.Add(t, Load(t));&#xD;
        return new Dictionary&amp;lt;int, string&amp;gt;(enumStore[t]);&#xD;
      }&#xD;
    }&#xD;
&#xD;
    private static Dictionary&amp;lt;int, string&amp;gt; Load(Type t)&#xD;
    {&#xD;
      Dictionary&amp;lt;int, string&amp;gt; list = new Dictionary&amp;lt;int, string&amp;gt;();&#xD;
      foreach (MemberInfo m in t.GetMembers())&#xD;
      {&#xD;
        if (m.MemberType == MemberTypes.Field &amp;amp;&amp;amp; m.Name != "value__")&#xD;
        {&#xD;
          string label = m.Name;&#xD;
          foreach (var att in m.GetCustomAttributes(false))&#xD;
          {&#xD;
            DescriptionAttribute da = att as DescriptionAttribute;&#xD;
            if (null != da)&#xD;
            {&#xD;
              if (da.Description.Length &amp;gt; 0)&#xD;
              {&#xD;
                label = da.Description;&#xD;
              }&#xD;
            }&#xD;
          }&#xD;
          int id = Convert.ToInt32(System.Enum.Parse(t, m.Name));&#xD;
          list.Add(id, label);&#xD;
        }&#xD;
      }&#xD;
      return list;&#xD;
    }&#xD;
  }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=ef18048e-e87a-4467-b5f0-ace8ca3e4753"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=GJxNAUcJaxM:04IpL3_3N1I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/GJxNAUcJaxM" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,ef18048e-e87a-4467-b5f0-ace8ca3e4753.aspx</comments>
      <category>Code</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/08/28/Enum+To+Dictionary+With+Description+Attribute+Reflection.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=239f43bd-0088-41fa-8206-b7647c224eac</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,239f43bd-0088-41fa-8206-b7647c224eac.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,239f43bd-0088-41fa-8206-b7647c224eac.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=239f43bd-0088-41fa-8206-b7647c224eac</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Windows 7 Repave Checklist</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,239f43bd-0088-41fa-8206-b7647c224eac.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/lMXmgbWfMYU/Windows+7+Repave+Checklist.aspx</link>
      <pubDate>Mon, 27 Jul 2009 22:30:03 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
In anticipation of repaving my Vista x64 machine with Windows 7 after the &lt;a href="http://blogs.msdn.com/msdnsubscriptions/archive/2009/07/22/when-will-subscribers-get-windows-7-rtm-august-6th.aspx"&gt;MSDN&#xD;
release on August 6&lt;/a&gt;, I’ve prepared my wish list of hardware upgrades I’d like&#xD;
to do at the same time I pave the machine with the new OS.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Should the family financial officer (FFO) decline to approve my purchase request,&#xD;
I’ll at least sneak in the SSD purchase.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Update &lt;/strong&gt;(new list, bigger appetite):&#xD;
&lt;/p&gt;&#xD;
        &lt;table border="0" cellspacing="0" cellpadding="2" width="450"&gt;&#xD;
          &lt;tbody&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
                &lt;strong&gt;Qty&lt;/strong&gt;&#xD;
              &lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
                &lt;strong&gt;Description&lt;/strong&gt;&#xD;
              &lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
                  &lt;strong&gt;Price&lt;/strong&gt;&#xD;
                &lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
2&lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
SUPER TALENT 12GB (3 x 4GB) 240-Pin DDR3 SDRAM DDR3 1333&lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
$ 739.98&#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
1&lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
ASUS Z8NA-D6C Dual LGA 1366 Intel 5500 ATX Dual Intel Xeon 5500 Series&lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
259.99&#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
2&lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
Intel Xeon E5520 Nehalem 2.26GHz LGA 1366 80W Quad-Core&lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
765.98&#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
1&lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
SUPER TALENT MasterDrive SX SAM56GM25S 2.5" 256GB SATA II MLC Internal SSD&lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
629.99&#xD;
&lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td valign="top" width="44"&gt;&#xD;
                &lt;strong&gt;Total&lt;/strong&gt;&#xD;
              &lt;/td&gt;&#xD;
              &lt;td valign="top" width="327"&gt;&#xD;
                &lt;strong&gt;&#xD;
                &lt;/strong&gt;&#xD;
              &lt;/td&gt;&#xD;
              &lt;td valign="top" width="77"&gt;&#xD;
                &lt;p align="right"&gt;&#xD;
                  &lt;strong&gt;$ 2,395.94&lt;/strong&gt;&#xD;
                &lt;/p&gt;&#xD;
              &lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
          &lt;/tbody&gt;&#xD;
        &lt;/table&gt;&#xD;
        &lt;p&gt;&#xD;
What plans do you have for your Windows 7 upgrade?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Drool….&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=239f43bd-0088-41fa-8206-b7647c224eac"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=lMXmgbWfMYU:p2uDhP1nfck:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/lMXmgbWfMYU" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,239f43bd-0088-41fa-8206-b7647c224eac.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/07/27/Windows+7+Repave+Checklist.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=875a73b4-8d99-4f0c-be1d-296086ba9643</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,875a73b4-8d99-4f0c-be1d-296086ba9643.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,875a73b4-8d99-4f0c-be1d-296086ba9643.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=875a73b4-8d99-4f0c-be1d-296086ba9643</wfw:commentRss>
      
      <title>Getting Started with Windows Azure</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,875a73b4-8d99-4f0c-be1d-296086ba9643.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/q2e9veAqpy0/Getting+Started+With+Windows+Azure.aspx</link>
      <pubDate>Tue, 21 Jul 2009 22:26:23 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Here’s the content of the most exciting email I’ve received lately (invite code redacted&#xD;
of course):&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;Thank you for your interest in Windows® Azure™. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;Your invitation code is xxxxx-xxxxx-xxxxx-xxxxx-xxxxx. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff"&gt;&#xD;
              &lt;font face="Courier New"&gt;You can now sign up for a Windows Azure&#xD;
account at &lt;/font&gt;&#xD;
              &lt;font face="Courier New"&gt;http://lx.azure.microsoft.com/fs&lt;/font&gt;&#xD;
              &lt;font face="Courier New"&gt;.&#xD;
Please keep this email in a safe place. &lt;/font&gt;&#xD;
            &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;This invitation to participate in the Windows&#xD;
Azure Community Technical Preview is subject to the following usage limits: &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;       &#xD;
Total compute usage: 2000 VM hours&lt;br&gt;&#xD;
        Cloud storage capacity: 50GB&lt;br&gt;&#xD;
        Total storage bandwidth: 20GB/day &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;During the CTP, we reserve the right to suspend&#xD;
your account activity (this does not imply we will delete your cloud storage) if you&#xD;
exceed these usage limits. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;Sincerely,&lt;br&gt;&#xD;
Windows Azure Platform Team &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;You have received this email because you&#xD;
registered as being interested in the Community Technology Preview (CTP) of Windows&#xD;
Azure. As a participant in the Windows Azure CTP program, you will continue to receive&#xD;
emails related to that program unless you end your participation by emailing azinvite@microsoft.com&#xD;
with “END PARTICIPATION” in the subject line. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;To ensure proper delivery of future updates&#xD;
please add azinvite@microsoft.com to your address book or safe-senders list. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;Microsoft respects your privacy. To learn&#xD;
more about Microsoft's privacy policy, please click here. &lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font color="#0000ff" face="Courier New"&gt;Microsoft Corporation&lt;br&gt;&#xD;
One Microsoft Way&lt;br&gt;&#xD;
Redmond, WA 98052&lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
I’m very excited to begin learning to develop against Azure in all my spare time.&#xD;
If I learn anything worthy of note here, I’ll share it. Just too many things to dabble&#xD;
in and too little time.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=875a73b4-8d99-4f0c-be1d-296086ba9643"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=q2e9veAqpy0:O2QTmdEb81w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/q2e9veAqpy0" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,875a73b4-8d99-4f0c-be1d-296086ba9643.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/07/21/Getting+Started+With+Windows+Azure.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=403887ab-b317-4901-8770-29deb0dd371a</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,403887ab-b317-4901-8770-29deb0dd371a.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,403887ab-b317-4901-8770-29deb0dd371a.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=403887ab-b317-4901-8770-29deb0dd371a</wfw:commentRss>
      
      <title>Will the Enterprise Adopt Silverlight 3 for LOB?</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,403887ab-b317-4901-8770-29deb0dd371a.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/lbs6Y1Uo6KE/Will+The+Enterprise+Adopt+Silverlight+3+For+LOB.aspx</link>
      <pubDate>Sun, 12 Jul 2009 20:59:43 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
With the release of Silverlight 3 on Friday, I’m wondering whether the enterprise&#xD;
(that mythical stereotype) will adopt Silverlight 3 for line of business (LOB) applications.&#xD;
The official “what’s new” section included the following items that I found very interesting:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;b&gt;Improving Rich Internet Application Productivity. &lt;/b&gt;New features include: &#xD;
&lt;/p&gt;&#xD;
          &lt;ul&gt;&#xD;
            &lt;li&gt;&#xD;
              &lt;b&gt;60+ controls with source code : &lt;/b&gt;Silverlight 3 is packed with over 60 high-quality,&#xD;
fully skinnable and customizable out-of-the-box controls such as charting and media,&#xD;
new layout containers such as dock and viewbox, and controls such as autocomplete,&#xD;
treeview and datagrid. The controls come with nine professional designed themes and&#xD;
the source code can be modified/recompiled or utilized as-is. Other additions include&#xD;
multiple selection in listbox controls, file save dialog making it easier to write&#xD;
files, and support for multiple page applications with navigation. &#xD;
&lt;/li&gt;&#xD;
            &lt;li&gt;&#xD;
              &lt;b&gt;Deep Linking.&lt;/b&gt; Silverlight 3 includes support for deep linking, which enables&#xD;
bookmarking a page within a RIA. &#xD;
&lt;/li&gt;&#xD;
            &lt;li&gt;&#xD;
              &lt;b&gt;Search Engine Optimization (SEO).&lt;/b&gt; Silverlight 3 enables users to solve the&#xD;
SEO-related challenges posed by RIAs.&lt;b&gt;&lt;/b&gt;By utilizing business objects on the&#xD;
server, together with ASP.NET controls and site maps, users can automatically mirror&#xD;
database-driven RIA content into HTML that is easily indexed by the leading search&#xD;
engines. &#xD;
&lt;/li&gt;&#xD;
            &lt;li&gt;&#xD;
              &lt;b&gt;Enhanced Data Support &lt;/b&gt;Silverlight 3 delivers: &#xD;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Element to Element binding : &lt;/b&gt;UI designers use binding between two UI properties&#xD;
to create compelling UI experiences. Silverlight now enables property binding to CLR&#xD;
objects and other UI components via XAML, for instance binding a slider value to the&#xD;
volume control of a media player. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Data Forms. &lt;/b&gt;The Data Form control provides support for layout of fields, validation,&#xD;
updating and paging through data. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;New features for data validation&lt;/b&gt; which automatically catch incorrect input&#xD;
and warn the user with built-in validation controls. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Support for business objects&lt;/b&gt; on both client and server with n-Tier data support.&#xD;
Easily load, sort, filter and page data with added support for working with data.&#xD;
Includes a new built-in CollectionView to perform a set of complex operations against&#xD;
server side data. A new set of .NET RIA services supports these features on the server. &#xD;
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&#xD;
            &lt;li&gt;&#xD;
              &lt;b&gt;Improved performance, &lt;/b&gt;through: &#xD;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Application library caching&lt;/b&gt;,&lt;b&gt;&lt;/b&gt;which reduces the size of applications&#xD;
by caching framework on the client in order to improve rendering performance. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enhanced Deep Zoom&lt;/b&gt;, allows users to fluidly navigate through larger image collections&#xD;
by zooming.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Binary XML&lt;/b&gt; allows communication with the server to be compressed, greatly increasing&#xD;
the speed at which data can be exchanged. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Local Connection &lt;/b&gt;This feature allows communication between two Silverlight&#xD;
applications on the client-side without incurring a server roundtrip: for instance&#xD;
a chart in one control can communicate with a datagrid in another. &#xD;
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&#xD;
          &lt;/ul&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
I’ve just downloaded the bits and will begin exploring the new controls and just how&#xD;
easy it is or is not to build applications. My only criteria at the moment is whether&#xD;
or not the applications are as easy to build as a Windows Forms application. Obviously&#xD;
there are far more important evaluation criteria, but I’m wondering whether my stated&#xD;
criteria here will be the more common question raised in the enterprise. That is,&#xD;
can we build apps faster, easier, better with this? If not, I’m not sure the enterprise&#xD;
will get too awfully excited about it unless a clear case can be made for replacing&#xD;
the often time consuming, error prone web application development process with a simpler&#xD;
Silverlight 3 development process. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One way or another, I’m excited about Silverlight 3 and eager to dive in and have&#xD;
some fun.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=403887ab-b317-4901-8770-29deb0dd371a"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=lbs6Y1Uo6KE:DNFASMgaTm4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/lbs6Y1Uo6KE" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,403887ab-b317-4901-8770-29deb0dd371a.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/07/12/Will+The+Enterprise+Adopt+Silverlight+3+For+LOB.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=ceea2820-a161-454d-88fe-99c3c98e67fa</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,ceea2820-a161-454d-88fe-99c3c98e67fa.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,ceea2820-a161-454d-88fe-99c3c98e67fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ceea2820-a161-454d-88fe-99c3c98e67fa</wfw:commentRss>
      
      <title>Favorite Win 7 RC Feature</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,ceea2820-a161-454d-88fe-99c3c98e67fa.aspx</guid>
      <link>http://feedproxy.google.com/~r/tsjensen/~3/9YvJ178_jgs/Favorite+Win+7+RC+Feature.aspx</link>
      <pubDate>Sat, 02 May 2009 21:20:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Here’s my favorite feature’s of Windows 7 release candidate right after install into&#xD;
a VMware virtual machine.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="win7rc" border="0" alt="win7rc" src="http://www.tsjensen.com/blog/content/binary/WindowsLiveWriter/FavoriteWin7RCFeature_D789/win7rc_3.png" width="423" height="536"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=ceea2820-a161-454d-88fe-99c3c98e67fa"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tsjensen?a=9YvJ178_jgs:11Cr3KBHhfA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tsjensen?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/9YvJ178_jgs" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,ceea2820-a161-454d-88fe-99c3c98e67fa.aspx</comments>
    <feedburner:origLink>http://www.tsjensen.com/blog/2009/05/02/Favorite+Win+7+RC+Feature.aspx</feedburner:origLink></item>
  </channel>
</rss>
