<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://galratner.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>.NET Development</title><link>http://galratner.com/blogs/net/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Debug Build: 40407.4157)</generator><item><title>Reloading a Razor WebGrid  after Ajax calls using a partial view</title><link>http://galratner.com/blogs/net/archive/2011/12/02/reloading-a-razor-webgrid-after-ajax-calls-using-a-partial-view.aspx</link><pubDate>Fri, 02 Dec 2011 00:19:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:196</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you are using Razor and MVC you probably make some use of the built in controls in System.Web.Helpers. WebGrid, located in the Helpers assembly, was created for WebMatrix&amp;rsquo;s Razor Web Pages and landed itself nicely to Razor views in MVC.&lt;br /&gt;WebGrid, much like ASP.NET&amp;rsquo;s ListView control, is designed to display a data driven HTML table on the screen. It has support for paging, sorting and column customization.&lt;br /&gt;In this article, we will be taking a quick look at loading a WebGrid with data, both as a part of a page and as a standalone AJAX call. AJAX calls can occur after a page load or sort change and as a part of the interaction of a user with the data on the grid.&lt;br /&gt;Let&amp;rsquo;s begin by making a view. The view will contain the body of the page rendered in the @RenderBody() section of the main layout. In our case the grid will reside in the index page and the index view will simply look like this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@model&amp;nbsp;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Deployments.Models.&lt;span style="color: #2b91af;"&gt;Deployment&lt;/span&gt;&amp;gt;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.Title&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Deployments"&lt;/span&gt;;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;}&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;ViewBag.Message&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.ActionLink(&lt;span style="color: #a31515;"&gt;"Request&amp;nbsp;Deployment"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"CreateDeployment"&lt;/span&gt;)
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.Partial(&lt;span style="color: #a31515;"&gt;"DeploymentList"&lt;/span&gt;,&amp;nbsp;Model)
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The Model is the data we wish to display and Html.Partial adds a partial view along with our grid.&lt;br /&gt;We will take a look at the data later. First let&amp;rsquo;s display our grid. The grid resided in a partial view named DeploymentList:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@model&amp;nbsp;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Deployments.Models.&lt;span style="color: #2b91af;"&gt;Deployment&lt;/span&gt;&amp;gt;
 
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;grid&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebGrid&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&amp;nbsp;rowsPerPage:&amp;nbsp;ViewBag.PageSize,&amp;nbsp;ajaxUpdateContainerId:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"deploymentsGrid"&lt;/span&gt;,&amp;nbsp;canSort:&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Bind(Model,&amp;nbsp;rowCount:&amp;nbsp;ViewBag.TotalRecords,&amp;nbsp;autoSortAndPage:&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;);
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;A key part of the grid is ajaxUpdateContainerId. It signals the grid what container to update after an AJAX call. &amp;ldquo;deploymentsGrid&amp;rdquo; is a div surrounding the partial view and containing the Grid and any helper functions that will get updated in AJAX calls.&lt;br /&gt;Now after we declared the grid we can look at the controller. The grid sends some query string parameters for paging and sorting by default. Since our grid has pagination enabled, our controller should be able to deal with an optional page parameter. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DeploymentsEntities&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DeploymentsEntities&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;pageSize&amp;nbsp;=&amp;nbsp;10;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Index(&lt;span style="color: blue;"&gt;int&lt;/span&gt;?&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.Message&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Deployments"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.PageSize&amp;nbsp;=&amp;nbsp;pageSize;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.TotalRecords&amp;nbsp;=&amp;nbsp;context.Deployments.Count(d&amp;nbsp;=&amp;gt;&amp;nbsp;d.Active&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;model&amp;nbsp;=&amp;nbsp;context.Deployments
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Include(&lt;span style="color: #a31515;"&gt;"Website"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Include(&lt;span style="color: #a31515;"&gt;"Environment"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.OrderByDescending(d&amp;nbsp;=&amp;gt;&amp;nbsp;d.DeploymentID)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(d&amp;nbsp;=&amp;gt;&amp;nbsp;d.Active&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip(((page.HasValue&amp;nbsp;?&amp;nbsp;page.Value&amp;nbsp;:&amp;nbsp;1)&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;pageSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(pageSize);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(Request.IsAjaxRequest())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;PartialView(&lt;span style="color: #a31515;"&gt;"DeploymentList"&lt;/span&gt;,&amp;nbsp;model);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;View(model);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;As you can see, when our controller is invoked by an AJAX request, we do not need to return the entire index view. We can simply return the partial view containing the grid. Retuning a partial view will make sure only the HTML we need to update is actually being generated.&lt;br /&gt;This is the rest of the grid view:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"deploymentsGrid"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;grid.GetHtml(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns:&amp;nbsp;grid.Columns(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"Website.WebsiteName"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Website"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"Environment.EnvironmentName"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"From"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"Environment1.EnvironmentName"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"To"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"RequestedBy"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Requested&amp;nbsp;By"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"RequestedDate"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Requested&amp;nbsp;Time"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"ExecutedBy"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Executed&amp;nbsp;By"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"ExecutedDate"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Executed&amp;nbsp;Time"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"WebsiteSync"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Website"&lt;/span&gt;,&amp;nbsp;format:&amp;nbsp;(item)&amp;nbsp;=&amp;gt;&amp;nbsp;(item.WebsiteSync)&amp;nbsp;?&amp;nbsp;Html.Raw(&lt;span style="color: #a31515;"&gt;"&amp;lt;img&amp;nbsp;src='/images/active.png'&amp;nbsp;/&amp;gt;"&lt;/span&gt;)&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Html.Raw(&lt;span style="color: #a31515;"&gt;"&amp;lt;img&amp;nbsp;src='/images/inactive.png'&amp;nbsp;/&amp;gt;"&lt;/span&gt;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"DatabaseSync"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Database"&lt;/span&gt;,&amp;nbsp;format:&amp;nbsp;(item)&amp;nbsp;=&amp;gt;&amp;nbsp;(item.DatabaseSync)&amp;nbsp;?&amp;nbsp;Html.Raw(&lt;span style="color: #a31515;"&gt;"&amp;lt;img&amp;nbsp;src='/images/active.png'&amp;nbsp;/&amp;gt;"&lt;/span&gt;)&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Html.Raw(&lt;span style="color: #a31515;"&gt;"&amp;lt;img&amp;nbsp;src='/images/inactive.png'&amp;nbsp;/&amp;gt;"&lt;/span&gt;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;"Comments"&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Comments"&lt;/span&gt;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grid.Column(&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;,&amp;nbsp;header:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Done"&lt;/span&gt;,&amp;nbsp;format:&amp;nbsp;(item)&amp;nbsp;=&amp;gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(item.ExecutedBy))&amp;nbsp;?&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Ajax.ActionLink(&lt;span style="color: #a31515;"&gt;"Done"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Done"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;{&amp;nbsp;id&amp;nbsp;=&amp;nbsp;item.DeploymentID&amp;nbsp;},&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AjaxOptions&lt;/span&gt;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Confirm&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Did&amp;nbsp;you&amp;nbsp;check&amp;nbsp;your&amp;nbsp;work?"&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpMethod&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Get"&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnSuccess&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"updateGrid()"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Html.Raw(&lt;span style="color: #a31515;"&gt;"&amp;lt;a&amp;nbsp;href='"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item.Environment1.WebsiteURL&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"'&amp;nbsp;target='_new'&amp;gt;View&amp;lt;/a&amp;gt;"&lt;/span&gt;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;updateGrid()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.Raw(&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.HtmlDecode(grid.GetContainerUpdateScript(&lt;span style="color: #a31515;"&gt;"/?page="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;(grid.PageIndex&amp;nbsp;+&amp;nbsp;1)).ToString()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;If you read through the code, you probably noticed the @Ajax.ActionLink &amp;ldquo;Done&amp;rdquo;. This is a simple GET call along with a parameter containing the ID of the record we wish to update. The interesting part about it is the OnSuccess call. This is a JavaScript call that is made when the ActionLink returns successfully.&lt;br /&gt;Since our update operation succeeded, we will go ahead and update the grid:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Html.Raw(&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.HtmlDecode(grid.GetContainerUpdateScript(&lt;span style="color: #a31515;"&gt;"/?page="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;(grid.PageIndex&amp;nbsp;+&amp;nbsp;1)).ToString()))
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;GetContainerUpdateScript is built into the grid. If you view the source of the page, you will probably find it in the JavaScript onClick events of your pager. We are simply calling it again, along with the current grid page in order to update the container div.&lt;br /&gt;As you can tell, WebGrid has some great web 2.0 functionality out of the box and can help you speed up Razor development.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;I would like to thank &lt;a target="_blank" href="http://www.thedotnetdaily.org/"&gt;Brad Laney&lt;/a&gt; for the @Html.Raw tip. &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=196" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/Razor/default.aspx">Razor</category><category domain="http://galratner.com/blogs/net/archive/tags/MVC/default.aspx">MVC</category><category domain="http://galratner.com/blogs/net/archive/tags/WebGrid/default.aspx">WebGrid</category></item><item><title>Give your old ASP.NET validators a makeover with jQuery TOOLS</title><link>http://galratner.com/blogs/net/archive/2011/11/08/give-your-old-asp-net-validators-a-makeover-with-jquery-tools.aspx</link><pubDate>Tue, 08 Nov 2011 21:33:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:195</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you have been working with the default validators in ASP.NET for a while you are probably used to the plain old look they create on your page and while you can rework the way they look, ASP.NET validators are essentially a Label. They are unable to change the appearance of other elements or run scripts without a complete page postback.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;jQuery TOOLS is a jQuery based UI library you can find &lt;a target="_blank" href="http://flowplayer.org/tools/"&gt;here&lt;/a&gt;. jQuery TOOLS contains a validator as a part of its form tools. The jQuery TOOLS validator is based on HTML 5 and CSS standards and has the ability to animate, change the appearances of the element it is validating, support multiple languages and more.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In this article I am doing to show how to quickly plug jQuery TOOLS into ASP.NET&amp;rsquo;s validation so that you can continue to use default validation along with the new look.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;First let&amp;rsquo;s build our form. We are going to use ASP TextBoxs along with CustomValidators.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s import jQuery tools along with some CSS directly taken from their example:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"http://cdn.jquerytools.org/1.2.6/full/jquery.tools.min.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;rel&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/css"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"http://static.flowplayer.org/tools/demos/validator/css/form.css"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Next we are going to add the form elements along with some HTML 5 attributes. The attributes will help jQuery tools to validate the fields:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"form1"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;fieldset&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"NameTextBox"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;required&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"required"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;CustomValidator&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"NameCustomValidator"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"NameTextBox"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;ClientValidationFunction&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"jQueryValidation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ValidateEmptyText&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"true"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;onservervalidate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"NameCustomValidator_ServerValidate"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;CustomValidator&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"EmailTextBox"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"email"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;required&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"required"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;CustomValidator&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"EmailCustomValidator"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"EmailTextBox"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;ClientValidationFunction&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"jQueryValidation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ValidateEmptyText&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"true"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;onservervalidate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"EmailCustomValidator_ServerValidate"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;CustomValidator&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;fieldset&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;Button&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"SubmitButton"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Text&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"Submit"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;onclick&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"SubmitButton_Click"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Notice we used ClientValidationFunction to signal our validators they need to run a Javascript function for client validation. Now we can wire the validation in using this snippet:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;language&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;jQueryValidation(source,&amp;nbsp;arguments)&amp;nbsp;{
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;name&amp;nbsp;=&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"#"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;source.controltovalidate).validator();
			arguments.IsValid&amp;nbsp;=&amp;nbsp;name.data(&lt;span style="color: maroon;"&gt;"validator"&lt;/span&gt;).checkValidity();
		}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Server side validation:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;For security purposes and to accommodate JavaScript disabled browsers we also need server side validation. Since we are checking for a required name and email, the server side validation will look like this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;NameCustomValidator_ServerValidate(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;source,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ServerValidateEventArgs&lt;/span&gt;&amp;nbsp;args)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.IsValid&amp;nbsp;=&amp;nbsp;!&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(args.Value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;EmailCustomValidator_ServerValidate(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;source,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ServerValidateEventArgs&lt;/span&gt;&amp;nbsp;args)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.IsValid&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Regex&lt;/span&gt;.IsMatch(args.Value,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"^(?("")(""[^""]+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&amp;amp;'\*\+/=\?\^`\{\}\|~\w])*)(?&amp;lt;=[0-9a-zA-Z])@))"&lt;/span&gt;&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Now that everything is wired and working, validation will look much better&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0005.validation.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0005.validation.png" border="0" /&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;As you can see we have preserved all of the default behavior of the original validation.&lt;br /&gt;For more customization options, please check the jQuery TOOLS documentation &lt;a target="_blank" href="http://flowplayer.org/tools/documentation/index.html"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Give-your-old-ASPNET-validators-a-makeover-with-jQuery-TOOLS-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F11%2F08%2Fgive-your-old-asp-net-validators-a-makeover-with-jquery-tools.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=195" width="1" height="1"&gt;</description></item><item><title>Deep dive into the LinkedIn API: Use C# to search for your dream Job (writing C# :))</title><link>http://galratner.com/blogs/net/archive/2011/10/15/deep-dive-into-the-linkedin-api-use-c-to-search-for-your-dream-job-writing-c.aspx</link><pubDate>Sat, 15 Oct 2011 02:02:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:194</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;LinkedIn has an extensive API designed to access almost every aspect of the site. Developers can access People and Connections, Groups, Companies, Jobs, Social Stream, Communications and more. There are two types of LinkedIn APIs: JavaScript based and REST based with the ability to connect the two. For example: you can log in with a JavaScript button and monitor your social updates using server based code. You can then send yourself summary emails with the updates.&lt;br /&gt;This is a deep dive into both APIs. We are going to be using the JavaScript login button, showing the user&amp;rsquo;s name using HTML.&amp;nbsp; LinkedIn&amp;rsquo;s REST API uses OAuth authentication which we will utilize in order to get a new REST token. We will then re log in on the server and invoke the REST API, perform a jobs keyword search, return the results as JASON and show them to the user.&lt;br /&gt;&lt;br /&gt;Before we start we will need a developer account. We can then log into the development portal and create a new application. We will name the application and get our API Key and Secrete Key. We will use them in order to authenticate.&lt;br /&gt;&lt;br /&gt;Let&amp;rsquo;s begin by using the JavaScript API in order to create a login with LinkedIn button. The client code looks like this:&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"http://platform.linkedin.com/in.js"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_key:&amp;nbsp;&lt;span style="background:yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&amp;nbsp;Utils.APIKey&amp;nbsp;&lt;span style="background:yellow;"&gt;%&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorize:&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;credentials_cookie:&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"in/Login"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;api_key will be the application key and credentials_cookie will be set to indicate the API we wish to receive an authentication cookie. The cookie will contain the data we need in order to communicate with the REST API&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3718.LinkedIn1.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3718.LinkedIn1.PNG" border="0" /&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;We need to remember when running this code locally that a client to server request will only be accepted over https so we need to run IIS Express and use the local SSL certificate&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6443.IISExpress.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6443.IISExpress.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4540.IISExpressSSL.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4540.IISExpressSSL.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Once the user have logged on we can display their details:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;Hello,&amp;nbsp;&amp;lt;?js=&amp;nbsp;firstName&amp;nbsp;?&amp;gt;&amp;nbsp;&amp;lt;?js=&amp;nbsp;lastName&amp;nbsp;?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;We can now utilize the entire JavaScript API to make any call we wish. The full API is described here: &lt;a target="_blank" href="https://developer.linkedin.com/javascript"&gt;https://developer.linkedin.com/javascript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Lets exchange the client calls for server calls&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The first step will be to read the authentication cookie. The cookie contains all the values we need in order to exchange out JS token with a REST token.&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "signature_method":"HMAC-SHA1",&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "signature_order": ["access_token", "member_id"],&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "access_token":"AD2dpVe1tOclAsNYsCri4nOatfstw7ZnMzWP",&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "signature":"73f948524c6d1c07b5c554f6fc62d824eac68fee",&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "member_id":"vvUNSej47H"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "signature_version": 1}&lt;br /&gt;&lt;br /&gt;Let&amp;rsquo;s load it into a dynamic object&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;cookie&amp;nbsp;from&amp;nbsp;the&amp;nbsp;JSAPI&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;GetOauthCookie()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;oaut&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpContext&lt;/span&gt;.Current.Request.Cookies[&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(oautCookie,&amp;nbsp;APIKey)];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;cookie&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(oaut&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;JavaScriptSerializer&lt;/span&gt;&amp;nbsp;jss&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;JavaScriptSerializer&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cookie&amp;nbsp;=&amp;nbsp;jss.Deserialize&amp;lt;&lt;span style="color:blue;"&gt;dynamic&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlDecode(oaut.Value));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(IsCookieValid(cookie))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;cookie;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We must now make sure the cookie is valid and has not been tampered with in any way. We can do that by concatenating a string from the cookie values in the field names in the signature_order. Once we have them we can verify the hash generated from the values using our keys matches the hash in the cookie&amp;rsquo;s signature field. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;Validate&amp;nbsp;the&amp;nbsp;cookie&amp;nbsp;from&amp;nbsp;the&amp;nbsp;JSAPI&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color:gray;"&gt;"cookie"&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;IsCookieValid(&lt;span style="color:blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;cookie)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;The&amp;nbsp;signature&amp;nbsp;base&amp;nbsp;is&amp;nbsp;calculated&amp;nbsp;by&amp;nbsp;concatenating&amp;nbsp;the&amp;nbsp;values&amp;nbsp;of&amp;nbsp;the&amp;nbsp;fields&amp;nbsp;listed&amp;nbsp;in&amp;nbsp;the&amp;nbsp;signature_order&amp;nbsp;field&amp;nbsp;in&amp;nbsp;the&amp;nbsp;order&amp;nbsp;they&amp;nbsp;appear.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;signature&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;fieldName&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;cookie[&lt;span style="color:#a31515;"&gt;"signature_order"&lt;/span&gt;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signature&amp;nbsp;+=&amp;nbsp;cookie[fieldName];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;After&amp;nbsp;you&amp;nbsp;construct&amp;nbsp;the&amp;nbsp;signature&amp;nbsp;base,&amp;nbsp;use&amp;nbsp;the&amp;nbsp;encryption&amp;nbsp;algorithm&amp;nbsp;specified&amp;nbsp;in&amp;nbsp;the&amp;nbsp;signature_method&amp;nbsp;to&amp;nbsp;calculate&amp;nbsp;the&amp;nbsp;signature&amp;nbsp;using&amp;nbsp;your&amp;nbsp;API&amp;nbsp;secret.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(cookie[&lt;span style="color:#a31515;"&gt;"signature_method"&lt;/span&gt;]&amp;nbsp;==&amp;nbsp;&lt;span style="color:#a31515;"&gt;"HMAC-SHA1"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;VerifyHash(signature,&amp;nbsp;cookie[&lt;span style="color:#a31515;"&gt;"signature"&lt;/span&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;VerifyHash(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;signature,&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;cookieSignature)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(GetHMACSHA1Hash(SecretKey,&amp;nbsp;signature)&amp;nbsp;==&amp;nbsp;cookieSignature)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;GetHMACSHA1Hash(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;key,&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;value)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;hash&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:#2b91af;"&gt;HMACSHA1&lt;/span&gt;&amp;nbsp;hmac&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HMACSHA1&lt;/span&gt;(System.Text.&lt;span style="color:#2b91af;"&gt;ASCIIEncoding&lt;/span&gt;.ASCII.GetBytes(key)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hmac.ComputeHash(System.Text.&lt;span style="color:#2b91af;"&gt;ASCIIEncoding&lt;/span&gt;.ASCII.GetBytes(value));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash&amp;nbsp;=&amp;nbsp;System.&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBase64String(hmac.Hash);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;hash;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;If the values match this cookie is valid and we can continue with the REST token request.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The next part gets a little complicated so, let&amp;rsquo;s break it down to steps:&lt;br /&gt;The cookie contains an access token. The access token needs to be posted into the LinkedIn server; however, since LinkedIn use OAuth for any REST request we need to make sure to follow the process to sign a request according to the OAuth 1.0a specs. You can read them here:&amp;nbsp; &lt;a target="_blank" href="http://oauth.net/core/1.0a/"&gt;http://oauth.net/core/1.0a/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; Luckily we can find many libraries that can help is with OAuth. One of them is the open source class OAuthBase.cs that was written by Eran Sandler and can be found here: &lt;a target="_blank" href="http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs"&gt;http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs&lt;/a&gt; .The example solution at the bottom of this page contains this class and you can feel free to investigate it further.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We need to post the access token as an OAuth&amp;nbsp; parameter so we are going to append xoauth_oauth2_access_token to the request.&lt;br /&gt;The last step before we do the post is to append the generated OAuth signature.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Now we can make the request:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Exchange&amp;nbsp;JSAPI&amp;nbsp;Token&amp;nbsp;for&amp;nbsp;a&amp;nbsp;REST&amp;nbsp;API&amp;nbsp;OAuth&amp;nbsp;Token&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;LoadRESTToken()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;cookie&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetOauthCookie();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;xoauth_oauth2_access_token&amp;nbsp;parameter,&amp;nbsp;set&amp;nbsp;to&amp;nbsp;the&amp;nbsp;value&amp;nbsp;of&amp;nbsp;the&amp;nbsp;access_token&amp;nbsp;field&amp;nbsp;in&amp;nbsp;the&amp;nbsp;cookie.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;accessToken&amp;nbsp;=&amp;nbsp;cookie[&lt;span style="color: #a31515;"&gt;"access_token"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}{1}?xoauth_oauth2_access_token={2}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.LinkedinAPI,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.AccessTokenPath,&amp;nbsp;accessToken);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;&amp;nbsp;oAuth&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;nonce&amp;nbsp;=&amp;nbsp;oAuth.GenerateNonce();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;timeStamp&amp;nbsp;=&amp;nbsp;oAuth.GenerateTimeStamp();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedUrl&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;signature&amp;nbsp;=&amp;nbsp;oAuth.GenerateSignature(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(url),&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.APIKey,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SecretKey,&amp;nbsp;accessToken,&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"POST"&lt;/span&gt;,&amp;nbsp;timeStamp,&amp;nbsp;nonce,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedUrl,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedRequestParameters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;normalizedRequestParameters&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"&amp;amp;oauth_signature={0}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(signature));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;oAuthToken&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetOAuthToken(normalizedUrl,&amp;nbsp;normalizedRequestParameters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Load&amp;nbsp;both&amp;nbsp;token&amp;nbsp;and&amp;nbsp;secret&amp;nbsp;into&amp;nbsp;the&amp;nbsp;current&amp;nbsp;session&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.ParseQueryString(oAuthToken)[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token_secret"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.ParseQueryString(oAuthToken)[&lt;span style="color: #a31515;"&gt;"oauth_token_secret"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Gets&amp;nbsp;the&amp;nbsp;REST&amp;nbsp;API&amp;nbsp;OAuth&amp;nbsp;Token&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"url"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"postData"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;GetOAuthToken(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;postData)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.Headers.Add(&lt;span style="color: #a31515;"&gt;"content-type"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"application/x-www-form-urlencoded"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;byteArray&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Encoding&lt;/span&gt;.ASCII.GetBytes(postData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;responseArray&amp;nbsp;=&amp;nbsp;client.UploadData(url,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"POST"&lt;/span&gt;,&amp;nbsp;byteArray);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Encoding&lt;/span&gt;.ASCII.GetString(responseArray);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&amp;nbsp;ex)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;ex.Message;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;token;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;The result is a string containing both the token and token secret. We now have access to the REST API!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;With access to the rest API lets start building the UI and wiring the application. Lets build a text box for keyword searches and a JSON call in order to populate a list with the results:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;Page&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Language&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"C#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"Default.aspx.cs"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"LinkedInJobFinder.Default"&lt;/span&gt;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;%&amp;gt;&lt;/span&gt;
&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue;"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;Import&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Namespace&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"LinkedInJobFinder"&lt;/span&gt;&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;%&amp;gt;&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon;"&gt;DOCTYPE&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;PUBLIC&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN"&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;title&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;title&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"http://platform.linkedin.com/in.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_key:&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&amp;nbsp;Utils.APIKey&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;%&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorize:&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;credentials_cookie:&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;searchListings(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery.getJSON(&lt;span style="color: maroon;"&gt;"JobData.ashx?jsoncallback=?"&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query:&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"#searchText"&lt;/span&gt;).val()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"#listingResults"&lt;/span&gt;).empty();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(data.numResults&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"#listingResults"&lt;/span&gt;).html(&lt;span style="color: maroon;"&gt;"Sorry&amp;nbsp;there&amp;nbsp;are&amp;nbsp;results.&amp;nbsp;Please&amp;nbsp;try&amp;nbsp;again."&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.each(data.jobs.values,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(i,&amp;nbsp;item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"&amp;lt;b&amp;gt;Position&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;"&lt;/span&gt;).appendTo(&lt;span style="color: maroon;"&gt;"#listingResults"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"&amp;lt;p&amp;gt;Company:&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item.company.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;nbsp;location:&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item.locationDescription&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;lt;/p&amp;gt;"&lt;/span&gt;).appendTo(&lt;span style="color: maroon;"&gt;"#listingResults"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"&amp;lt;p&amp;gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item.descriptionSnippet&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;lt;/p&amp;gt;"&lt;/span&gt;).appendTo(&lt;span style="color: maroon;"&gt;"#listingResults"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"form1"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"in/Login"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
Hello,&amp;nbsp;&amp;lt;?js=&amp;nbsp;firstName&amp;nbsp;?&amp;gt;&amp;nbsp;&amp;lt;?js=&amp;nbsp;lastName&amp;nbsp;?&amp;gt;.&amp;lt;br&amp;nbsp;/&amp;gt;
Search&amp;nbsp;for&amp;nbsp;your&amp;nbsp;dream&amp;nbsp;job!&amp;nbsp;&amp;lt;input&amp;nbsp;type="text"&amp;nbsp;name="searchText"&amp;nbsp;id="searchText"&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a&amp;nbsp;href="javascript:searchListings();"&amp;gt;Search&amp;lt;/a&amp;gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"listingResults"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;form&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;For improved performance, The JSON calls will be redirected to an HttpAsyncHandler and we are going to use an object pool from the Parallel Extensions Extras to allow for fast network calls.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Here is the handler&amp;rsquo;s code:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Threading;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Threading.Tasks;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.SessionState;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;OAuth;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;LinkedInJobFinder
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Summary&amp;nbsp;description&amp;nbsp;for&amp;nbsp;JobData&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JobData&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IHttpAsyncHandler&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IRequiresSessionState&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;&amp;nbsp;BeginProcessRequest(&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AsyncCallback&lt;/span&gt;&amp;nbsp;cb,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;nbsp;extraData)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AsynchOperation&lt;/span&gt;&amp;nbsp;asynch&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AsynchOperation&lt;/span&gt;(cb,&amp;nbsp;context,&amp;nbsp;extraData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asynch.StartAsyncWork();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;asynch;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;EndProcessRequest(&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;&amp;nbsp;result)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProcessRequest(&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;InvalidOperationException&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;IsReusable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AsynchOperation&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;completed;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;nbsp;state;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AsyncCallback&lt;/span&gt;&amp;nbsp;callback;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;.IsCompleted
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;completed;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WaitHandle&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;.AsyncWaitHandle
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;.AsyncState
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;state;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IAsyncResult&lt;/span&gt;.CompletedSynchronously
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;AsynchOperation(&lt;span style="color: #2b91af;"&gt;AsyncCallback&lt;/span&gt;&amp;nbsp;callback,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpContext&lt;/span&gt;&amp;nbsp;context,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.callback&amp;nbsp;=&amp;nbsp;callback;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.context&amp;nbsp;=&amp;nbsp;context;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.state&amp;nbsp;=&amp;nbsp;state;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.completed&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;StartAsyncWork()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;cookie&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetOauthCookie();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;If&amp;nbsp;this&amp;nbsp;user&amp;nbsp;has&amp;nbsp;no&amp;nbsp;session&amp;nbsp;open&amp;nbsp;it&amp;nbsp;by&amp;nbsp;getting&amp;nbsp;a&amp;nbsp;new&amp;nbsp;OAuth&amp;nbsp;1.0a&amp;nbsp;token&amp;nbsp;for&amp;nbsp;the&amp;nbsp;REST&amp;nbsp;API&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;]&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadRESTToken();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt;.Factory.StartNew(()&amp;nbsp;=&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;jobRequest&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.JobRequestPool.GetObject();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;jobListings;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;keywordSearch&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}?keywords={1}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.LinkedinJobAPIURL,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(context.Request.QueryString[&lt;span style="color: #a31515;"&gt;"Query"&lt;/span&gt;]));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobListings&amp;nbsp;=&amp;nbsp;jobRequest.GetJobs(keywordSearch,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToString(context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;]),&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToString(context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token_secret"&lt;/span&gt;]));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Write(context.Request.QueryString[&lt;span style="color: #a31515;"&gt;"jsoncallback"&lt;/span&gt;]&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"("&lt;/span&gt;&amp;nbsp;+&amp;nbsp;jobListings&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;")"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.JobRequestPool.PutObject(jobRequest);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;completed&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;callback(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Exchange&amp;nbsp;JSAPI&amp;nbsp;Token&amp;nbsp;for&amp;nbsp;a&amp;nbsp;REST&amp;nbsp;API&amp;nbsp;OAuth&amp;nbsp;Token&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;LoadRESTToken()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;cookie&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetOauthCookie();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;xoauth_oauth2_access_token&amp;nbsp;parameter,&amp;nbsp;set&amp;nbsp;to&amp;nbsp;the&amp;nbsp;value&amp;nbsp;of&amp;nbsp;the&amp;nbsp;access_token&amp;nbsp;field&amp;nbsp;in&amp;nbsp;the&amp;nbsp;cookie.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;accessToken&amp;nbsp;=&amp;nbsp;cookie[&lt;span style="color: #a31515;"&gt;"access_token"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}{1}?xoauth_oauth2_access_token={2}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.LinkedinAPI,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.AccessTokenPath,&amp;nbsp;accessToken);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;&amp;nbsp;oAuth&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;nonce&amp;nbsp;=&amp;nbsp;oAuth.GenerateNonce();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;timeStamp&amp;nbsp;=&amp;nbsp;oAuth.GenerateTimeStamp();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedUrl&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;signature&amp;nbsp;=&amp;nbsp;oAuth.GenerateSignature(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(url),&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.APIKey,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SecretKey,&amp;nbsp;accessToken,&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"POST"&lt;/span&gt;,&amp;nbsp;timeStamp,&amp;nbsp;nonce,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedUrl,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedRequestParameters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;normalizedRequestParameters&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"&amp;amp;oauth_signature={0}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(signature));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;oAuthToken&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetOAuthToken(normalizedUrl,&amp;nbsp;normalizedRequestParameters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Load&amp;nbsp;both&amp;nbsp;token&amp;nbsp;and&amp;nbsp;secret&amp;nbsp;into&amp;nbsp;the&amp;nbsp;current&amp;nbsp;session&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.ParseQueryString(oAuthToken)[&lt;span style="color: #a31515;"&gt;"oauth_token"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Session[&lt;span style="color: #a31515;"&gt;"oauth_token_secret"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.ParseQueryString(oAuthToken)[&lt;span style="color: #a31515;"&gt;"oauth_token_secret"&lt;/span&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The last step would be to actually make a keyword reach call to the LinkedIn REST endpoint and return the JSON result to the client. We need to remember to sign every request:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Net;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.IO;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Xml.Linq;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;OAuth;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;LinkedInJobFinder
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;JobRequest&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IDisposable&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;&amp;nbsp;client;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;&amp;nbsp;oAuth;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;disposed&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;JobRequest()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.Headers.Add(&lt;span style="color: #a31515;"&gt;"x-li-format"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"json"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.UseDefaultCredentials&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oAuth&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;OAuthBase&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Download&amp;nbsp;a&amp;nbsp;json&amp;nbsp;string&amp;nbsp;of&amp;nbsp;jobs&amp;nbsp;using&amp;nbsp;a&amp;nbsp;keyword&amp;nbsp;search&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"searchFilter"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"oauthToken"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"oauthTokenSecret"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;GetJobs(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;searchFilter,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;oauthToken,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;oauthTokenSecret)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;nonce&amp;nbsp;=&amp;nbsp;oAuth.GenerateNonce();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;timeStamp&amp;nbsp;=&amp;nbsp;oAuth.GenerateTimeStamp();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedUrl&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;signature&amp;nbsp;=&amp;nbsp;oAuth.GenerateSignature(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(searchFilter),&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.APIKey,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SecretKey,&amp;nbsp;oauthToken,&amp;nbsp;oauthTokenSecret,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"GET"&lt;/span&gt;,&amp;nbsp;timeStamp,&amp;nbsp;nonce,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedUrl,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;normalizedRequestParameters);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;normalizedRequestParameters&amp;nbsp;=&amp;nbsp;normalizedRequestParameters&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"&amp;amp;oauth_signature={0}"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(signature));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;client.DownloadString(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}?{1}"&lt;/span&gt;,&amp;nbsp;normalizedUrl,&amp;nbsp;normalizedRequestParameters));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&amp;nbsp;ex)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;ex.Message;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Dispose()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dispose(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GC&lt;/span&gt;.SuppressFinalize(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Dispose(&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;disposing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!disposed)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(disposing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.Dispose();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disposed&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The results are a list of jobs available to the user:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6837.LinkedIn2.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6837.LinkedIn2.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;This was a complete C# usage example of the LinkedIn API. You can find the API reference in the developer portal and download the sample code below.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=194" width="1" height="1"&gt;</description><enclosure url="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.01.94/LinkedInJobFinder.zip" length="207729" type="application/octet-stream" /><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/REST/default.aspx">REST</category><category domain="http://galratner.com/blogs/net/archive/tags/JSONP/default.aspx">JSONP</category></item><item><title>How to record Skype voice conversations</title><link>http://galratner.com/blogs/net/archive/2011/08/27/how-to-record-skype-voice-conversations.aspx</link><pubDate>Sat, 27 Aug 2011 16:32:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:193</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;First let&amp;rsquo;s start at the end. If you are looking for free software to record Skype voice conversations, please skip to the bottom of this page and download the attached file. It contains a Windows Installer msi file and should install a recorder on your machine.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7888.Skype_2D00_Recording.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7888.Skype_2D00_Recording.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rest of you, please keep reading :)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Skype uses a public API to listen and transmit messages to all programs on your computer. Messages are being transmitted via the native windows API and will require us to use some external method calls.&lt;br /&gt;In this article we are going to build a WPF client that will communicate with Skype, detect voice calls, redirect the incoming and outgoing streams into files and finally, create a complete conversation file.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s start by including the necessary external methods:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;[&lt;span style="color:#2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"user32.dll"&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;uint&lt;/span&gt;&amp;nbsp;RegisterWindowMessage(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpString);
 
[&lt;span style="color:#2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"user32.dll"&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;SendMessageTimeout(&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;windowHandle,&amp;nbsp;&lt;span style="color:blue;"&gt;uint&lt;/span&gt;&amp;nbsp;Msg,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;wParam,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;lParam,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SendMessageTimeoutFlags&lt;/span&gt;&amp;nbsp;flags,&amp;nbsp;&lt;span style="color:blue;"&gt;uint&lt;/span&gt;&amp;nbsp;timeout,&amp;nbsp;&lt;span style="color:blue;"&gt;out&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;result);
 
[&lt;span style="color:#2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"user32.dll"&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;SendMessageTimeout(&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;windowHandle,&amp;nbsp;&lt;span style="color:blue;"&gt;uint&lt;/span&gt;&amp;nbsp;Msg,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;wParam,&amp;nbsp;&lt;span style="color:blue;"&gt;ref&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;COPYDATASTRUCT&lt;/span&gt;&amp;nbsp;lParam,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SendMessageTimeoutFlags&lt;/span&gt;&amp;nbsp;flags,&amp;nbsp;&lt;span style="color:blue;"&gt;uint&lt;/span&gt;&amp;nbsp;timeout,&amp;nbsp;&lt;span style="color:blue;"&gt;out&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;result);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Communication with Skype&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Sending message&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;SendMessageTimeout sends the specified message to one or more windows. Notice we have two overloads of SendMessageTimeout. One accepts a value to be sent and the other accepts a stuct. We are going to use the first overload to connect to Skype and the second to send API commands.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Receiving messages&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In order to receive messages from Skype we need to register our window in the system. RegisterWindowMessage defines a new window message that is guaranteed to be unique throughout the system. The lpString can be used when sending or posting messages.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;First let&amp;rsquo;s get a handle to our window and then register it: &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;windowHandle&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WindowInteropHelper&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;).Handle;
&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.DetectSkype(windowHandle);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Run&amp;nbsp;at&amp;nbsp;startup&amp;nbsp;to&amp;nbsp;register&amp;nbsp;a&amp;nbsp;system&amp;nbsp;window&amp;nbsp;message&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"windowHandle"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Handle&amp;nbsp;to&amp;nbsp;the&amp;nbsp;current&amp;nbsp;program&amp;nbsp;window&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;DetectSkype(&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;windowHandle)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hWnd&amp;nbsp;=&amp;nbsp;windowHandle;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;APIDiscover&amp;nbsp;=&amp;nbsp;RegisterWindowMessage(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeDiscover);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(APIDiscover&amp;nbsp;==&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;APIAttach&amp;nbsp;=&amp;nbsp;RegisterWindowMessage(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeAttach);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(APIAttach&amp;nbsp;==&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Next we need to intercept incoming messages. We can do that by attaching a native hook to the method WndProc. This method is available to us in windows forms; however, since we are using WPF we will need to explicitly attach it to our window:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: #2b91af;"&gt;HwndSource&lt;/span&gt;&amp;nbsp;source&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PresentationSource&lt;/span&gt;.FromVisual(&lt;span style="color: blue;"&gt;this&lt;/span&gt;)&amp;nbsp;&lt;span style="color: blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;HwndSource&lt;/span&gt;;
source.AddHook(WndProc);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;WndProc(&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;hwnd,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;msg,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;wParam,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;lParam,&amp;nbsp;&lt;span style="color: blue;"&gt;ref&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;handled)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(msg&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.APIAttach&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(&lt;span style="color: blue;"&gt;uint&lt;/span&gt;)lParam&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.SKYPECONTROLAPI_ATTACH_SUCCESS)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;current&amp;nbsp;handle&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Skype&amp;nbsp;window&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.HWND_BROADCAST&amp;nbsp;=&amp;nbsp;wParam;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handled&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Skype&amp;nbsp;sends&amp;nbsp;our&amp;nbsp;program&amp;nbsp;messages&amp;nbsp;using&amp;nbsp;WM_COPYDATA.&amp;nbsp;the&amp;nbsp;data&amp;nbsp;is&amp;nbsp;in&amp;nbsp;lParam&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(msg&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.WM_COPYDATA&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;wParam&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.HWND_BROADCAST)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;COPYDATASTRUCT&lt;/span&gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;COPYDATASTRUCT&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;Marshal&lt;/span&gt;.PtrToStructure(lParam,&amp;nbsp;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;COPYDATASTRUCT&lt;/span&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StatusTextBox.AppendText(data.lpData&amp;nbsp;+&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Check&amp;nbsp;for&amp;nbsp;connection&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(data.lpData.IndexOf(&lt;span style="color: #a31515;"&gt;"CONNSTATUS&amp;nbsp;ONLINE"&lt;/span&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;-1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConnectButton.IsEnabled&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Check&amp;nbsp;for&amp;nbsp;calls&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IsCallInProgress(data.lpData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handled&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;.Zero;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Every time we receive a notification from Skype we need to check for beginning and end of voice calls and if a call that we are recording has ended we need to process the results.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Connecting to a working instance of Skype&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Once have launched and logged into our account in Skype we need to try and connect to the working instance. We can do that by sending a message with the DiscoverAPI handle. Skype will pop up a dialog asking us if we allow a program to connect to Skype. Once we clicked allow we will get back a message indicating we are online:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ConnectToSkype()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;To&amp;nbsp;initiate&amp;nbsp;communication,&amp;nbsp;a&amp;nbsp;client&amp;nbsp;application&amp;nbsp;broadcasts&amp;nbsp;the&amp;nbsp;SkypeControlAPIDiscover&amp;nbsp;message,&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;including&amp;nbsp;its&amp;nbsp;window&amp;nbsp;handle&amp;nbsp;as&amp;nbsp;a&amp;nbsp;wParam&amp;nbsp;parameter.&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Skype&amp;nbsp;responds&amp;nbsp;with&amp;nbsp;a&amp;nbsp;SkypeControlAPIAttach&amp;nbsp;message&amp;nbsp;to&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;window&amp;nbsp;and&amp;nbsp;indicates&amp;nbsp;the&amp;nbsp;connection&amp;nbsp;status.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;&amp;nbsp;aResult&amp;nbsp;=&amp;nbsp;SendMessageTimeout(HWND_BROADCAST,&amp;nbsp;APIDiscover,&amp;nbsp;hWnd,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;.Zero,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SendMessageTimeoutFlags&lt;/span&gt;.SMTO_NORMAL,&amp;nbsp;100,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;result);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Starting and stopping voice recording&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Each conversation in Skype has an ID. We need to capture the ID in order to create the conversation file name:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Check&amp;nbsp;is&amp;nbsp;a&amp;nbsp;call&amp;nbsp;is&amp;nbsp;in&amp;nbsp;progress&amp;nbsp;and&amp;nbsp;activate&amp;nbsp;the&amp;nbsp;record&amp;nbsp;button&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"status"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;IsCallInProgress(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Listen&amp;nbsp;to:&amp;nbsp;CALL&amp;nbsp;{}&amp;nbsp;STATUS&amp;nbsp;INPROGRESS&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(status.IndexOf(&lt;span style="color: #a31515;"&gt;"CALL"&lt;/span&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;-1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;status.IndexOf(&lt;span style="color: #a31515;"&gt;"STATUS&amp;nbsp;INPROGRESS"&lt;/span&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;-1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;callRegex&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"CALL\s+(\d+)"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Regex&lt;/span&gt;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Regex&lt;/span&gt;(callRegex,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RegexOptions&lt;/span&gt;.IgnoreCase);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Match&lt;/span&gt;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;r.Match(status);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(m.Groups[1].Value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecordButton.IsEnabled&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(status.IndexOf(&lt;span style="color: #a31515;"&gt;"CALL"&lt;/span&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;-1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;status.IndexOf(&lt;span style="color: #a31515;"&gt;"STATUS&amp;nbsp;FINISHED"&lt;/span&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;-1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Call&amp;nbsp;ended.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecordButton.IsEnabled&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;If&amp;nbsp;we&amp;nbsp;are&amp;nbsp;still&amp;nbsp;recording,&amp;nbsp;stop&amp;nbsp;and&amp;nbsp;prcess&amp;nbsp;the&amp;nbsp;conversation&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(RecordButton.Content.ToString()&amp;nbsp;==&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Stop&amp;nbsp;Recording"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecordButton.Content&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Start&amp;nbsp;Recording"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MakeConversationFile();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Once we have discovered that a conversation has started we need to send two commands to Skype. The first command will redirect the incoming audio stream to a wave file and the second will do the same to the local microphone audio stream:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;RecordOutputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"ALTER&amp;nbsp;CALL&amp;nbsp;{0}&amp;nbsp;SET_OUTPUT&amp;nbsp;FILE=""{1}.output"""&lt;/span&gt;;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;RecordInputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"ALTER&amp;nbsp;CALL&amp;nbsp;{0}&amp;nbsp;SET_CAPTURE_MIC&amp;nbsp;FILE=""{1}.input"""&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;RecordButton_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Fill&amp;nbsp;in&amp;nbsp;the&amp;nbsp;new&amp;nbsp;conversation&amp;nbsp;file&amp;nbsp;name&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;conversationFile&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeConversationsFile,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeConversationsFolder,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileNameTextBox.Text&amp;nbsp;=&amp;nbsp;conversationFile;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color: #2b91af;"&gt;Directory&lt;/span&gt;.Exists(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeConversationsFolder))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Directory&lt;/span&gt;.CreateDirectory(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeConversationsFolder);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&amp;nbsp;ex)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;"Cannot&amp;nbsp;create&amp;nbsp;directory&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.SkypeConversationsFolder&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;".&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;ex.Message);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Start&amp;nbsp;recording&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(RecordButton.Content.ToString()&amp;nbsp;==&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Start&amp;nbsp;Recording"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;recordOutputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.RecordOutputCommand,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber,&amp;nbsp;conversationFile);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;recordInputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.RecordInputCommand,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber,&amp;nbsp;conversationFile);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.SendSkypeMessage(recordOutputCommand);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.SendSkypeMessage(recordInputCommand);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecordButton.Content&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Stop&amp;nbsp;Recording"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Stop&amp;nbsp;recording&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;recordEndOutputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.RecordEndOutputCommand,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;recordEndInputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.RecordEndInputCommand,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.CurrentCallNumber);
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.SendSkypeMessage(recordEndOutputCommand);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NativeCalls&lt;/span&gt;.SendSkypeMessage(recordEndInputCommand);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RecordButton.Content&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Start&amp;nbsp;Recording"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MakeConversationFile();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;To stop recording we simply redirect both stream back into their default location:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;RecordEndOutputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"ALTER&amp;nbsp;CALL&amp;nbsp;{0}&amp;nbsp;SET_OUTPUT&amp;nbsp;SOUNDCARD=""default"""&lt;/span&gt;;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;RecordEndInputCommand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"ALTER&amp;nbsp;CALL&amp;nbsp;{0}&amp;nbsp;SET_CAPTURE_MIC&amp;nbsp;PORT=""356"""&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Now that we have finished recording the conversation we have two files, each fine contains different output and we need to merge them into a single conversation file.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Merging wav files with SoX&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;SoX is a small media processing utility program. You can download it from sourceforge &lt;a target="_blank" href="http://sox.sourceforge.net/"&gt;here&lt;/a&gt;.&lt;br /&gt;We are going to invoke SoX from an external process and use its command line parameters to merge the files.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Process&amp;nbsp;both&amp;nbsp;input&amp;nbsp;and&amp;nbsp;microphone&amp;nbsp;files&amp;nbsp;into&amp;nbsp;a&amp;nbsp;single&amp;nbsp;conversation&amp;nbsp;file&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;MakeConversationFile()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;conversationFile&amp;nbsp;=&amp;nbsp;FileNameTextBox.Text;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Task&lt;/span&gt;.Factory.StartNew(()&amp;nbsp;=&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Thread&lt;/span&gt;.Sleep(5000);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Time&amp;nbsp;for&amp;nbsp;skype&amp;nbsp;to&amp;nbsp;release&amp;nbsp;the&amp;nbsp;files&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Run&amp;nbsp;Sox&amp;nbsp;to&amp;nbsp;merge&amp;nbsp;both&amp;nbsp;files&amp;nbsp;into&amp;nbsp;a&amp;nbsp;single&amp;nbsp;file&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.RunExternalProcess(&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.CurrentDirectory&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\Sox\Sox"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"-m&amp;nbsp;"""&lt;/span&gt;&amp;nbsp;+&amp;nbsp;conversationFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@".output"""&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"&amp;nbsp;"""&lt;/span&gt;&amp;nbsp;+&amp;nbsp;conversationFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@".input"""&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"&amp;nbsp;"""&lt;/span&gt;&amp;nbsp;+&amp;nbsp;conversationFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;@""""&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;,&amp;nbsp;3000,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty,&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;If&amp;nbsp;sox&amp;nbsp;created&amp;nbsp;the&amp;nbsp;new&amp;nbsp;file,&amp;nbsp;delete&amp;nbsp;both&amp;nbsp;original&amp;nbsp;files&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;File&lt;/span&gt;.Exists(conversationFile))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;File&lt;/span&gt;.Delete(conversationFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;".input"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;File&lt;/span&gt;.Delete(conversationFile&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;".output"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;{&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Open&amp;nbsp;the&amp;nbsp;folder&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Process&lt;/span&gt;.Start(&lt;span style="color: #a31515;"&gt;"explorer.exe"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"/select,"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;conversationFile);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;You can tell that the last step was to open the location of the conversation file for the user to inspect.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The Skype open API contains many more useful commands and you can see the complete documentation &lt;a target="_blank" href="http://developer.skype.com/accessories"&gt;here&lt;/a&gt;. For your connivance I have attached the complete code to this example and a full msi installer for a working demo program.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=193" width="1" height="1"&gt;</description><enclosure url="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.01.93/SkypeRecording.zip" length="2111266" type="application/x-zip-compressed" /><category domain="http://galratner.com/blogs/net/archive/tags/Native+API/default.aspx">Native API</category><category domain="http://galratner.com/blogs/net/archive/tags/Skype+API/default.aspx">Skype API</category></item><item><title>Secure user authentication with one way password hash</title><link>http://galratner.com/blogs/net/archive/2011/07/05/secure-user-authentication-with-one-way-password-hash.aspx</link><pubDate>Tue, 05 Jul 2011 20:34:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:191</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;br /&gt;Keeping users passwords in your database is a part of almost every application, yet securing passwords is rarely being done correctly. &lt;/p&gt;
&lt;p&gt;I recently read an article by &lt;a target="_blank" href="http://codahale.com/how-to-safely-store-a-password/"&gt;Coda Hale&lt;/a&gt; about the ineffectiveness of password salts. Coda Suggested using bcrypt to store passwords. He reasoned his argument by explaining bcrypt is extremely slow to compute, therefore making it slow to hack.&lt;/p&gt;
&lt;p&gt; I completely agree, however, I wanted to add another way of safely storing passwords in a more conventional way by hiding the salt in the hash. The idea wasn&amp;rsquo;t mine. It belongs to a DBA named Scott Hulberg. It&amp;rsquo;s pretty simple and for the sake of this blog post I am not going to implement it completely. I am going to prepend the salt to the password hash, making it invisible to a hacker. You can go further by writing an algorithm to plant the salt in the hash array as you see fit. &lt;/p&gt;
&lt;p&gt;Since the only way to match a one way hashed password is to use the salt we used to generate this hash, if a hacker cannot get to the salt, they cannot retrieve the original password.&lt;br /&gt;Let&amp;rsquo;s begin by composing the method to create our hash and prefix it with the salt:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;PASSWORD_SALT_LENGTH&amp;nbsp;=&amp;nbsp;16;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Generate&amp;nbsp;a&amp;nbsp;one&amp;nbsp;way&amp;nbsp;hash&amp;nbsp;from&amp;nbsp;a&amp;nbsp;password.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"password"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;GetHashedPasswordBytes(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;password)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Generate&amp;nbsp;random&amp;nbsp;bytes&amp;nbsp;as&amp;nbsp;salt.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Prepend&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;and&amp;nbsp;compute&amp;nbsp;the&amp;nbsp;hash&amp;nbsp;along&amp;nbsp;with&amp;nbsp;the&amp;nbsp;password&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Then&amp;nbsp;prepend&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;to&amp;nbsp;the&amp;nbsp;hashed&amp;nbsp;result&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;salt&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.GetRandomBytes(&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.PASSWORD_SALT_LENGTH);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;a&amp;nbsp;random&amp;nbsp;array&amp;nbsp;of&amp;nbsp;bytes&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;enteredPassword&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(password);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;password&amp;nbsp;bytes&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;&amp;gt;&amp;nbsp;passwordByteList&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;&amp;gt;();&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Prepend&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;to&amp;nbsp;the&amp;nbsp;password&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(salt);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(enteredPassword);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;passwordHashResult;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;SHA256&lt;/span&gt;&amp;nbsp;shaM&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SHA256Managed&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordHashResult&amp;nbsp;=&amp;nbsp;shaM.ComputeHash(passwordByteList.ToArray());&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;hash&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.Clear();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(salt);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Prepend&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;Hash&amp;nbsp;result&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(passwordHashResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;passwordByteList.ToArray();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Get&amp;nbsp;an&amp;nbsp;array&amp;nbsp;of&amp;nbsp;random&amp;nbsp;bytes&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"size"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;size&amp;nbsp;of&amp;nbsp;the&amp;nbsp;array&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;GetRandomBytes(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;size)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;random&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Byte&lt;/span&gt;[size];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;&amp;nbsp;rng&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rng.GetNonZeroBytes(random);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;random;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is the method to re-generate a password hash at login time:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Compares&amp;nbsp;a&amp;nbsp;generated&amp;nbsp;password&amp;nbsp;hash&amp;nbsp;to&amp;nbsp;the&amp;nbsp;original&amp;nbsp;password.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"password"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;original&amp;nbsp;password&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"passwordHash"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;hash&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Thre&amp;nbsp;if&amp;nbsp;the&amp;nbsp;password&amp;nbsp;matches&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;ComparePasswordHash(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;password,&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;passwordHash)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;isValidated&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;salt&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.PASSWORD_SALT_LENGTH];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;hash&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[passwordHash.Length&amp;nbsp;-&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.PASSWORD_SALT_LENGTH];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;userPassword&amp;nbsp;is&amp;nbsp;composed&amp;nbsp;from&amp;nbsp;the&amp;nbsp;hash&amp;nbsp;value&amp;nbsp;and&amp;nbsp;the&amp;nbsp;salt.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;seperate&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;from&amp;nbsp;the&amp;nbsp;hash&amp;nbsp;value&amp;nbsp;and&amp;nbsp;use&amp;nbsp;the&amp;nbsp;salt&amp;nbsp;to&amp;nbsp;compute&amp;nbsp;and&amp;nbsp;compare&amp;nbsp;the&amp;nbsp;passwords&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Array&lt;/span&gt;.Copy(passwordHash,&amp;nbsp;salt,&amp;nbsp;salt.Length);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Array&lt;/span&gt;.Copy(passwordHash,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.PASSWORD_SALT_LENGTH,&amp;nbsp;hash,&amp;nbsp;0,&amp;nbsp;hash.Length);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;enteredPassword&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(password);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;&amp;gt;&amp;nbsp;passwordByteList&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(salt);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordByteList.AddRange(enteredPassword);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;passwordHashResult;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;SHA256&lt;/span&gt;&amp;nbsp;shaM&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SHA256Managed&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passwordHashResult&amp;nbsp;=&amp;nbsp;shaM.ComputeHash(passwordByteList.ToArray());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.CompareBytes(passwordHashResult,&amp;nbsp;hash))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidated&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;isValidated;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Compare&amp;nbsp;two&amp;nbsp;byte&amp;nbsp;arrarys&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"array1"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"array2"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;CompareBytes(&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;array1,&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;array2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(array1.Length&amp;nbsp;!=&amp;nbsp;array2.Length)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;array1.Length;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(array1[i]&amp;nbsp;!=&amp;nbsp;array2[i])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Now to log in a user we are going to compare the original hash to the new hash. If the hash matches, then the user has entered the correct password:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;passwordHash&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.GetHashedPasswordBytes(&lt;span style="color: #a31515;"&gt;"test"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;PasswordUtils&lt;/span&gt;.ComparePasswordHash(&lt;span style="color: #a31515;"&gt;"test"&lt;/span&gt;,&amp;nbsp;passwordHash))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Password&amp;nbsp;mached"&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;As you can tell, unless a hacker knows where they salt is stored, they cannot retrieve it and cannot re-compute the original password.&lt;br /&gt;Thank you &lt;a target="_blank" href="http://www.linkedin.com/pub/brad-laney/b/2b/484"&gt;Brad Laney&lt;/a&gt; for sending me the original&amp;nbsp; Coda article.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Secure-user-authentication-with-one-way-password-hash-NET-Development-Gal-Ratner"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F07%2F05%2Fsecure-user-authentication-with-one-way-password-hash.aspx" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=191" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Display your top selling products in ASP.NET using a Bubble Chart</title><link>http://galratner.com/blogs/net/archive/2011/06/28/display-your-top-selling-products-in-asp-net-using-a-bubble-chart.aspx</link><pubDate>Tue, 28 Jun 2011 04:01:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:190</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;System.Web.DataVisualization contains 34 types of charts. The most common of them is the Column chart on which I already blogged about in &lt;a href="http://galratner.com/blogs/net/archive/2009/08/02/display-a-sales-chart-with-asp-net-chart-control-and-linq-to-sql.aspx"&gt;Display a sales chart with ASP.NET Chart control and Linq to SQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today I am going to take our sales chart one step further and display the top selling products for the year. Since we have multiple products for each time span, I chose a Bubble chart.&lt;br /&gt;First let&amp;rsquo;s look at the data model:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2465.OrdersDataModel.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2465.OrdersDataModel.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We are going to group our year&amp;rsquo;s sales into months and extract the top 5 selling products for that month. &lt;/p&gt;
&lt;p&gt;This is&amp;nbsp;our Linq statement:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;productSales&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.Orders
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;where&lt;/span&gt;&amp;nbsp;o.DatePlaced.Value.Year&amp;nbsp;==&amp;nbsp;year
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;group&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span style="color: blue;"&gt;by&lt;/span&gt;&amp;nbsp;o.DatePlaced.Value.Month&amp;nbsp;&lt;span style="color: blue;"&gt;into&lt;/span&gt;&amp;nbsp;g
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;orderby&lt;/span&gt;&amp;nbsp;g.Key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Month&amp;nbsp;=&amp;nbsp;g,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TopProducts&amp;nbsp;=&amp;nbsp;(&lt;span style="color: blue;"&gt;from&lt;/span&gt;&amp;nbsp;op&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderProducts
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;where&lt;/span&gt;&amp;nbsp;op.OrderDate.Value.Year&amp;nbsp;==&amp;nbsp;year&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;op.OrderDate.Value.Month&amp;nbsp;==&amp;nbsp;g.Key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;group&lt;/span&gt;&amp;nbsp;op&amp;nbsp;&lt;span style="color: blue;"&gt;by&lt;/span&gt;&amp;nbsp;op.ProductID&amp;nbsp;&lt;span style="color: blue;"&gt;into&lt;/span&gt;&amp;nbsp;opg
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;orderby&lt;/span&gt;&amp;nbsp;opg.Count()&amp;nbsp;&lt;span style="color: blue;"&gt;descending&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;select&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;{&amp;nbsp;ProductName&amp;nbsp;=&amp;nbsp;context.Products.Where(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductID&amp;nbsp;==&amp;nbsp;opg.Key).Single().ProductName,&amp;nbsp;ProductCount&amp;nbsp;=&amp;nbsp;opg.Count()&amp;nbsp;}).Take(5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/pre&gt;
&lt;p&gt;This is our chart:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;Chart&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"ProductSalesChart"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Width&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"400px"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"server"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Legends&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;Legend&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"Default"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Title&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"Top&amp;nbsp;Selling&amp;nbsp;Items"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;Legend&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Legends&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Series&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Series&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ChartAreas&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;ChartArea&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"ChartArea1"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;ChartArea&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ChartAreas&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: maroon;"&gt;Chart&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Now let&amp;rsquo;s add a new Series for each month. We are going to display the current month as text and add new data points indicating the top selling products.&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;sale&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;productSales)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Series&lt;/span&gt;&amp;nbsp;series&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Series&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Enum&lt;/span&gt;.Parse(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Month&lt;/span&gt;),&amp;nbsp;sale.Month.FirstOrDefault().DatePlaced.Value.Month.ToString()).ToString())&amp;nbsp;{&amp;nbsp;ChartType&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SeriesChartType&lt;/span&gt;.Bubble};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;topProduct&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;sale.TopProducts){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataPoint&lt;/span&gt;&amp;nbsp;point&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataPoint&lt;/span&gt;()&amp;nbsp;{&amp;nbsp;XValue&amp;nbsp;=&amp;nbsp;sale.Month.Key,&amp;nbsp;YValues&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;(&lt;span style="color: blue;"&gt;double&lt;/span&gt;)topProduct.ProductCount&amp;nbsp;},&amp;nbsp;Label&amp;nbsp;=&amp;nbsp;topProduct.ProductName&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;series.Points.Add(point);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProductSalesChart.Series.Add(series);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The end result is the following chart:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1346.TopSellingProductsChart.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1346.TopSellingProductsChart.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;As you can see it is fairly simple to create a visually appealing chart that can help sales professional better understand sales data.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Display-your-top-selling-products-in-ASPNET-using-a-Bubble-Chart-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F06%2F28%2Fdisplay-your-top-selling-products-in-asp-net-using-a-bubble-chart.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=190" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/Chart/default.aspx">Chart</category></item><item><title>Sharing memory session between servers</title><link>http://galratner.com/blogs/net/archive/2011/06/01/sharing-memory-session-between-servers.aspx</link><pubDate>Wed, 01 Jun 2011 20:25:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:189</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Session variables hold per user information. Unlike cookies, sessions store information on the server rather than on the client. The client holds a session cookie with the client&amp;rsquo;s session ID and at the time of an HTTP request, the server accesses the client&amp;rsquo;s session ID and retrieves the session data.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The default implementation of session has the web server holding the information in memory. This implementation as fast as it is has some drawbacks: Recycling your app pool or restarting IIS will abandon all of the sessions currently in memory. Sharing sessions between web servers is also not possible and when load balancing traffic between servers we need to resort to &amp;ldquo;sticky sessions&amp;rdquo;, a method in which all client requests will be redirected to the same physical server as the first request. This would enable us to still use default sessions, however, it will not solve the first issue I mentioned and we are still running the risk of overloading a server&amp;rsquo;s memory under heavy traffic load when some of our servers are slow to respond.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;ASP.NET supports four session storage options: &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Off: Session state is disabled.&lt;br /&gt;InProc: Session state is in process with an ASP.NET worker process.&lt;br /&gt;StateServer: Session state is using the out-of-process ASP.NET State Service to store state information.&lt;br /&gt;SQLServer: Session state is using an out-of-process SQL Server database to store state information.&lt;br /&gt;Custom: Session state is using a custom data store to store session-state information. &lt;br /&gt;In this article I am going to discuss the StateServer option in which the server holds session data in memory and outside the web server. This allows the presents of a dedicated session server and sharing of session data between all servers. &lt;br /&gt;The internal .NET implementation of StateServer resides in System.Web.SessionState.OutOfProcSessionStateStore and internally relies on socket connections methods in webengine.dll. Since all session data passes through sockets, all data must be serializable.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In order to activate the session store we need to run the aspnet_state.exe service.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4643.aspsession.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4643.aspsession.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In our web.config&amp;nbsp; we need to set the session state mode:&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sessionState mode="StateServer"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stateConnectionString="tcpip=SampleStateServer:42424"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookieless="false"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout="20"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;The last step would be to sync up all of our servers machine keys in our web.config.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;machineKey&lt;/b&gt; configures algorithms and keys to use for encryption, decryption, and validation of forms-authentication data and view-state data, and for out-of-process session state identification.&lt;br /&gt;We need to synch two keys:&lt;br /&gt;&lt;b&gt;validationKey&lt;/b&gt;: used to generate out-of-process, application-specific session IDs to ensure that session-state variables are isolated between sessions.&lt;br /&gt;&lt;b&gt;decryptionKey:&lt;/b&gt; Specifies the key that is used to encrypt and decrypt data or the process by which the key is generated.&lt;br /&gt;This is how our machineKey will look like:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;lt;machineKey &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; validationKey="32E35872597989D14CC1D5D9F5B1E94238D0EE32CF10AA2D2059533DF6035F4F" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; decryptionKey="B179091DBB2389B996A526DE8BCD7ACFDBCAB04EF1D085481C61496F693DF5F4" &lt;br /&gt;/&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;machineKey is located in our &amp;lt;system.web&amp;gt; tag.&lt;br /&gt;Syncing our machineKey is done since session information is encrypted and we need all the web servers to be able to encrypt and decrypt the data.&lt;br /&gt;You can generate new keys using the following code:&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
	{
		&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[]&amp;nbsp;args)
		{
			CreateMachineKey(24,&amp;nbsp;64);
		}
 
		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;CreateMachineKey(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;decryption,&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;validation)
		{
			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;decryptionKey&amp;nbsp;=&amp;nbsp;CreateKey(decryption);
			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;validationKey&amp;nbsp;=&amp;nbsp;CreateKey(validation);
			&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;@"&amp;lt;machineKey&amp;nbsp;validationKey=""{0}""&amp;nbsp;decryptionKey=""{1}""&amp;nbsp;validation=""SHA1""/&amp;gt;"&lt;/span&gt;,&amp;nbsp;validationKey,&amp;nbsp;decryptionKey);
			&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.ReadLine();
		}
 
		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;CreateKey(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;numBytes)
		{
			&lt;span style="color: #2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;&amp;nbsp;rng&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;();
			&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;buff&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[numBytes&amp;nbsp;-&amp;nbsp;1];
			rng.GetBytes(buff);
			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;BytesToHexString(buff);
		}
 
		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;BytesToHexString(&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;bytes)
		{
			&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;&amp;nbsp;hexString&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;(64);
			&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;bytes.Length;&amp;nbsp;i++)
				hexString.Append(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0:X2}"&lt;/span&gt;,&amp;nbsp;bytes[i]));
			&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;counter;
			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;hexString.ToString();
		}
	}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Once we have it all configured we can give our website a try and make sure all of our session variables are working.&lt;br /&gt;If we encounter any empty session values we will most likely need to examine serialization issues in our session objects.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Keeping sessions in a dedicated session state server can help alleviate memory pressure on your web server as well as help with memory data duplication. It is also a good practice with any new website development to use serializable session objects as pre planning for StateServer mode.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Sharing-memory-session-between-servers-NET-Development-Gal-Ratner"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F06%2F01%2Fsharing-memory-session-between-servers.aspx" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=189" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/Session/default.aspx">Session</category></item><item><title>Spatial Search made easy with Google Maps API and SQL Server 2008</title><link>http://galratner.com/blogs/net/archive/2011/05/14/spatial-search-made-easy-with-google-maps-api-and-sql-server-2008.aspx</link><pubDate>Sat, 14 May 2011 15:20:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:188</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Spatial search is the process of searching locations nearby to a position in space.&amp;nbsp; A good example of a spatial search would be finding all of the restaurants near your present location. With Google&amp;rsquo;s Maps API and SQL Server&amp;rsquo;s Geography data types we can build a quick spatial search in no time.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In this little exercise I will be detecting the user&amp;rsquo;s location, displaying it on a map and suggesting nearby restaurants. Since not all browsers support the W3C standards I will also allow manual input of the user&amp;rsquo;s address.&lt;br /&gt;Spatial search relies on latitude and longitude which are the global position coordinates. The process of turning an address to a set of latitude and longitude coordinates is referred to as Geocoding.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s start by adding the Google Maps API along with the auto user location detection. We are also going to add a service all to our database. The database will contain the recommended restaurants along with their latitude and longitude. The service call will be invoked by clicking the button when viewing the page with a non Geolocation supported browsers.&lt;/p&gt;
&lt;pre style="FONT-FAMILY: Consolas; BACKGROUND: white; COLOR: black; FONT-SIZE: 13px"&gt;&lt;span style="BACKGROUND: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="COLOR: blue"&gt;@&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: maroon"&gt;Page&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;Language&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"C#"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;CodeFile&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"Default.aspx.cs"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;Inherits&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"_Default"&lt;/span&gt;&amp;nbsp;&lt;span style="BACKGROUND: yellow"&gt;%&amp;gt;&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;DOCTYPE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;PUBLIC&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;html&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;head&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;runat&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"server"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;title&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;title&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;src&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;src&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"http://maps.google.com/maps/api/js?sensor=true"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;src&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"http://code.google.com/apis/gears/gears_init.js"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"text/javascript"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;initialLocation;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;map;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;infowindow&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.InfoWindow();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;latitude;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;longitude;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;initialize()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;myOptions&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;zoom:&amp;nbsp;10,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mapTypeId:&amp;nbsp;google.maps.MapTypeId.ROADMAP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.Map(document.getElementById(&lt;span style="COLOR: maroon"&gt;"map_canvas"&lt;/span&gt;),&amp;nbsp;myOptions);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: darkgreen"&gt;//&amp;nbsp;Try&amp;nbsp;W3C&amp;nbsp;Geolocation&amp;nbsp;method&amp;nbsp;(Preferred)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&amp;nbsp;(navigator.geolocation)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;navigator.geolocation.getCurrentPosition(&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;(position)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude&amp;nbsp;=&amp;nbsp;position.coords.latitude;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude&amp;nbsp;=&amp;nbsp;position.coords.longitude;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialLocation&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.LatLng(position.coords.latitude,&amp;nbsp;position.coords.longitude);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentString&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: maroon"&gt;"Location&amp;nbsp;found&amp;nbsp;using&amp;nbsp;W3C&amp;nbsp;standard"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map.setCenter(initialLocation);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.setContent(contentString);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.setPosition(initialLocation);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.open(map);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleNoGeolocation();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&amp;nbsp;(google.gears)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: darkgreen"&gt;//&amp;nbsp;Try&amp;nbsp;Google&amp;nbsp;Gears&amp;nbsp;Geolocation&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;geo&amp;nbsp;=&amp;nbsp;google.gears.factory.create(&lt;span style="COLOR: maroon"&gt;'beta.geolocation'&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;geo.getCurrentPosition(&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;(position)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude&amp;nbsp;=&amp;nbsp;position.coords.latitude;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude&amp;nbsp;=&amp;nbsp;position.coords.longitude;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialLocation&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.LatLng(position.latitude,&amp;nbsp;position.longitude);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentString&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: maroon"&gt;"Location&amp;nbsp;found&amp;nbsp;using&amp;nbsp;Google&amp;nbsp;Gears"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map.setCenter(initialLocation);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.setContent(contentString);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.setPosition(initialLocation);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infowindow.open(map);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleNoGeolocation();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: darkgreen"&gt;//&amp;nbsp;Browser&amp;nbsp;doesn't&amp;nbsp;support&amp;nbsp;Geolocation&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleNoGeolocation();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;handleNoGeolocation(errorFlag)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="COLOR: maroon"&gt;'#noLocation'&lt;/span&gt;).show();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;codeAddress()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;geocoder&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.Geocoder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;geocoder.geocode({&amp;nbsp;&lt;span style="COLOR: maroon"&gt;'address'&lt;/span&gt;:&amp;nbsp;$(&lt;span style="COLOR: maroon"&gt;"#LocationText"&lt;/span&gt;).val()&amp;nbsp;},&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;(results,&amp;nbsp;status)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&amp;nbsp;(status&amp;nbsp;==&amp;nbsp;google.maps.GeocoderStatus.OK)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map.setCenter(results[0].geometry.location);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;marker&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.Marker({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map:&amp;nbsp;map,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position:&amp;nbsp;results[0].geometry.location
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latitude&amp;nbsp;=&amp;nbsp;results[0].geometry.location.lat();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;longitude&amp;nbsp;=&amp;nbsp;results[0].geometry.location.lng();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getNearby();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&lt;span style="COLOR: maroon"&gt;"Geocode&amp;nbsp;was&amp;nbsp;not&amp;nbsp;successful&amp;nbsp;for&amp;nbsp;the&amp;nbsp;following&amp;nbsp;reason:&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;status);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialize();&amp;nbsp;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;getNearby()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&lt;span style="COLOR: maroon"&gt;'NearbyLocations.svc/GetNearbyLocations'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;&lt;span style="COLOR: maroon"&gt;"latitude="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;latitude&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: maroon"&gt;"&amp;amp;longitude="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;longitude,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataType:&amp;nbsp;&lt;span style="COLOR: maroon"&gt;'json'&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.each(data.d,&amp;nbsp;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt;&amp;nbsp;(i,&amp;nbsp;item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;myLatlng&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.LatLng(item.Latitude,&amp;nbsp;item.Longitude);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&amp;nbsp;marker&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;google.maps.Marker({&amp;nbsp;position:&amp;nbsp;myLatlng,&amp;nbsp;title:&amp;nbsp;item.Description&amp;nbsp;});&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;marker.setMap(map);&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;head&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;body&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;form&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"form1"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;runat&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"server"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"noLocation"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;style&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"&lt;/span&gt;&lt;span style="COLOR: red"&gt;display&lt;/span&gt;&lt;span style="COLOR: blue"&gt;:&lt;/span&gt;&lt;span style="COLOR: blue"&gt;none&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;Enter&amp;nbsp;Address&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"LocationText"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"text"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"Beverly&amp;nbsp;Hills,&amp;nbsp;California"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"AddressButton1"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"button"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"Set&amp;nbsp;Address"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;onclick&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"codeAddress();"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;div&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"map_canvas"&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;style&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"&lt;/span&gt;&lt;span style="COLOR: red"&gt;height&lt;/span&gt;&lt;span style="COLOR: blue"&gt;:&lt;/span&gt;&lt;span style="COLOR: blue"&gt;500px&lt;/span&gt;&lt;span style="COLOR: blue"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;width&lt;/span&gt;&lt;span style="COLOR: blue"&gt;:&lt;/span&gt;&lt;span style="COLOR: blue"&gt;800px&lt;/span&gt;&lt;span style="COLOR: blue"&gt;"&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;div&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;form&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;body&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;html&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;This is our database table:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8204.LocationTable.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8204.LocationTable.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;I have added some of my favorite restaurants:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0844.LocationTableData.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0844.LocationTableData.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In order to search the database for locations close to ours we will convert our latitude and longitude coordinates to the SQL data type GEOGRAPHY and search for places nearby using STDistance. STDistance will return the distance in meters between two GEOGRAPHY points so we need to convert it to miles.&lt;/p&gt;
&lt;pre style="FONT-FAMILY: Consolas; BACKGROUND: white; COLOR: black; FONT-SIZE: 13px"&gt;&lt;span style="COLOR: blue"&gt;USE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;[GeolocationExample]&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;GO&lt;/span&gt;
 
&lt;span style="COLOR: green"&gt;/******&amp;nbsp;Object:&amp;nbsp;&amp;nbsp;StoredProcedure&amp;nbsp;[dbo].[GetNearbyLocations]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Script&amp;nbsp;Date:&amp;nbsp;05/14/2011&amp;nbsp;08:25:25&amp;nbsp;******/&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;SET&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;ANSI_NULLS&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;ON&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;GO&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;SET&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;QUOTED_IDENTIFIER&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;ON&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;GO&lt;/span&gt;
 
 
&lt;span style="COLOR: blue"&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;PROCEDURE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;[dbo]&lt;/span&gt;&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;&lt;span style="COLOR: teal"&gt;[GetNearbyLocations]&lt;/span&gt;&amp;nbsp;
	&lt;span style="COLOR: teal"&gt;@Distance&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;
	&lt;span style="COLOR: teal"&gt;@Latitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;float&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;
	&lt;span style="COLOR: teal"&gt;@Longitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;float&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;
&lt;span style="COLOR: blue"&gt;BEGIN&lt;/span&gt;
	
	&lt;span style="COLOR: blue"&gt;SET&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;NOCOUNT&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;ON&lt;/span&gt;&lt;span style="COLOR: gray"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;DECLARE&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;@StartPoint&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;geography&lt;/span&gt;&lt;span style="COLOR: gray"&gt;;&lt;/span&gt;
	&lt;span style="COLOR: blue"&gt;SET&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;@StartPoint&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;GEOGRAPHY&lt;/span&gt;&lt;span style="COLOR: gray"&gt;::&lt;/span&gt;&lt;span style="COLOR: teal"&gt;STGeomFromText&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: red"&gt;'Point('&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: magenta"&gt;CAST&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;@Longitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;32&lt;span style="COLOR: gray"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;'&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: magenta"&gt;CAST&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;@Latitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;32&lt;span style="COLOR: gray"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;')'&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;4326&lt;span style="COLOR: gray"&gt;)&lt;/span&gt;
	
	&lt;span style="COLOR: blue"&gt;SELECT&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;FROM&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;Location&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: teal"&gt;L&lt;/span&gt;
	&lt;span style="COLOR: blue"&gt;WHERE&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;GEOGRAPHY&lt;/span&gt;&lt;span style="COLOR: gray"&gt;::&lt;/span&gt;&lt;span style="COLOR: teal"&gt;STGeomFromText&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: red"&gt;'Point('&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: magenta"&gt;CAST&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;L&lt;/span&gt;&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Longitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;32&lt;span style="COLOR: gray"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;'&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: magenta"&gt;CAST&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;L&lt;/span&gt;&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;&lt;span style="COLOR: teal"&gt;Latitude&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;32&lt;span style="COLOR: gray"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: red"&gt;')'&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;4326&lt;span style="COLOR: gray"&gt;).&lt;/span&gt;&lt;span style="COLOR: teal"&gt;STDistance&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;@StartPoint&lt;/span&gt;&lt;span style="COLOR: gray"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: teal"&gt;@Distance&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: gray"&gt;/&lt;/span&gt;&amp;nbsp;0.000621371192&lt;span style="COLOR: gray"&gt;)&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;END&lt;/span&gt;
 
&lt;span style="COLOR: blue"&gt;GO&lt;/span&gt;
 
 
&lt;/pre&gt;
&lt;p&gt;The final step will be using a WCF service to invoke our stored procedure along with our desired search radius:&lt;/p&gt;
&lt;pre style="font-family: Consolas; background: white; color: black; font-size: 13px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Runtime.Serialization;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ServiceModel;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ServiceModel.Activation;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ServiceModel.Web;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;GeolocationExampleModel;
 
[&lt;span style="color: #2b91af;"&gt;ServiceContract&lt;/span&gt;(Namespace&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;)]
[&lt;span style="color: #2b91af;"&gt;AspNetCompatibilityRequirements&lt;/span&gt;(RequirementsMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AspNetCompatibilityRequirementsMode&lt;/span&gt;.Allowed)]
&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;NearbyLocations&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;OperationContract&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;WebGet&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;GeoLocation&lt;/span&gt;&amp;gt;&amp;nbsp;GetNearbyLocations(&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;latitude,&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;longitude)
	{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebOperationContext&lt;/span&gt;.Current.OutgoingResponse.Headers.Add(&lt;span style="color: #a31515;"&gt;"Cache-Control"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"no-cache"&lt;/span&gt;);&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebOperationContext&lt;/span&gt;.Current.OutgoingResponse.Headers.Add(&lt;span style="color: #a31515;"&gt;"Pragma"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"no-cache"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;GeoLocation&lt;/span&gt;&amp;gt;&amp;nbsp;locations&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;GeoLocation&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;distance&amp;nbsp;=&amp;nbsp;20;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Miles&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;GeolocationExampleEntities&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GeolocationExampleEntities&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;nearby&amp;nbsp;=&amp;nbsp;context.GetNearbyLocations(distance,&amp;nbsp;latitude,&amp;nbsp;longitude);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;near&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;nearby)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;locations.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GeoLocation&lt;/span&gt;()&amp;nbsp;{&amp;nbsp;Description&amp;nbsp;=&amp;nbsp;near.Description,&amp;nbsp;Latitude&amp;nbsp;=&amp;nbsp;near.Latitude,&amp;nbsp;Longitude&amp;nbsp;=&amp;nbsp;near.Longitude&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;locations;
	}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;DataContract&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GeoLocation&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;DataMember&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;Description&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;DataMember&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;Latitude&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;DataMember&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;Longitude&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;
&lt;p&gt;Here I used Entity Framework in order to return the results from the database, however, I needed to convert them to a valid data contract in order to pass them to the client.&lt;/p&gt;
&lt;p&gt;This is the final Map:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7635.MapWithMarkers.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7635.MapWithMarkers.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The map contains all three records as markers.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Conclusion:&lt;br /&gt;&lt;/strong&gt;As you can tell spatial search can be composed together fairly quickly, however, as always when we are using 3rd party components we are subject to Google&amp;rsquo;s terms of service. I hope you find this useful.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Spatial-Search-made-easy-with-Google-Maps-API-and-SQL-Server-2008-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F05%2F14%2Fspatial-search-made-easy-with-google-maps-api-and-sql-server-2008.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=188" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/Spatial/default.aspx">Spatial</category><category domain="http://galratner.com/blogs/net/archive/tags/Geolocation/default.aspx">Geolocation</category></item><item><title>Consume an OData WCF Data Service as JSON with JQuery</title><link>http://galratner.com/blogs/net/archive/2011/04/14/consume-an-odata-wcf-data-service-as-json-with-jquery.aspx</link><pubDate>Thu, 14 Apr 2011 20:34:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:187</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;b&gt;OData(Open Data Protocol)&lt;/b&gt; is an HTTP based protocol for querying and updating data using full REST syntax. The full specifications of OData can be found on &lt;a target="_blank" href="http://odata.org"&gt;http://odata.org&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;WCF Data Services (formerly ADO.NET Data Services, formerly Project Astoria) is the .NET based implementation of OData enabled services. WCF Data Services can use an Entity Framework Context or any data model exposing at least one property that returns an entity set that is an IQueryable(Of T). The model must also implement IUpdatable.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;A sample http request to an OData service will look like:&lt;br /&gt;&lt;a target="_blank" href="http://services.odata.org/OData/OData.svc/Categories(1)/Products?$skip=2"&gt;http://services.odata.org/OData/OData.svc/Categories(1)/Products?$skip=2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;This example will get the products associated with the category identified by key value 1, starting with the third product.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;WCF Data Services is capable of returning data in multiple formats. The default format will be set based on the requesting client&amp;rsquo;s accept request header with an option to override the format using the $format query option.&amp;nbsp; For example, this will return the results from the previous example in JSON format:&lt;br /&gt;&lt;a target="_blank" href="http://services.odata.org/OData/OData.svc/Categories(1)/Products?$skip=2&amp;amp;$format=json"&gt;http://services.odata.org/OData/OData.svc/Categories(1)/Products?$skip=2&amp;amp;$format=json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;br /&gt;Currently supported formats and their matching accept request headers&lt;/b&gt;&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; Atom: application/atom+xml&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; Xml: application/xml&lt;br /&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; Json: application/json &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In this article we are going to create a new WCF Data Service, use a code first Entity Framework model and consume a JSON feed using JQuery.&lt;/p&gt;
&lt;p&gt;The ET Model we are using is the same model used in my article &lt;a target="_blank" href="http://galratner.com/blogs/net/archive/2011/03/24/four-ways-to-utilize-entity-framework-4.aspx"&gt;http://galratner.com/blogs/net/archive/2011/03/24/four-ways-to-utilize-entity-framework-4.aspx&lt;/a&gt; with a slight change; since the service invokes the model&amp;rsquo;s default constructor we are going to make sure our string connection is set in the process. The updated model looks like this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EFExampleDbContext&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DbContext&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;EFExampleDbContext()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: blue;"&gt;base&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"EFExampleEntitiesStringConnection"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;EFExampleDbContext(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;nameOrConnectionString)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: blue;"&gt;base&lt;/span&gt;(nameOrConnectionString)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DbSet&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;&amp;nbsp;Customers&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DbSet&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt;&amp;nbsp;Orders&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Now let&amp;rsquo;s create a new WCF Data Service and set the appropriate permissions on our entity sets:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CustomersDataService&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataService&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;EFExampleDbContext&lt;/span&gt;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;InitializeService(&lt;span style="color: #2b91af;"&gt;DataServiceConfiguration&lt;/span&gt;&amp;nbsp;config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.SetEntitySetAccessRule(&lt;span style="color: #a31515;"&gt;"Customers"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EntitySetRights&lt;/span&gt;.AllRead);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.SetEntitySetAccessRule(&lt;span style="color: #a31515;"&gt;"Orders"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;EntitySetRights&lt;/span&gt;.AllRead);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.DataServiceBehavior.MaxProtocolVersion&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DataServiceProtocolVersion&lt;/span&gt;.V2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The last step will be to query our service from the client. Let&amp;rsquo;s use JQuery&amp;rsquo;s getJSON method since it internally sets the accept request header to application/json.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.getJSON(&lt;span style="color: maroon;"&gt;"CustomersDataService.svc/Customers"&lt;/span&gt;,
&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.each(data.d,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(i,&amp;nbsp;item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: maroon;"&gt;"&amp;lt;p/&amp;gt;"&lt;/span&gt;).html(item.FirstName&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item.LastName).appendTo(&lt;span style="color: maroon;"&gt;"#myData"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;script&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"myData"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;div&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;This will query our CustomersDataService for all of our customers, get the response in JSON format and display the data in the #myData div.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;OData can be a very flexible and powerful protocol when used to retrieve and update data from multiple clients using a single data model on the server. There are many open source client projects and Javascript helper libraries with a full list on &lt;a target="_blank" href="http://odata.org"&gt;http://odata.org&lt;/a&gt;. OData is widely adopted including support in RIA services, Share point and more. If you are planning to syndicate content over HTTP WCF Data Services might be your preferred option.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Consume-an-OData-WCF-Data-Service-as-JSON-with-JQuery-NET-Development-Gal-Ratner"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F04%2F14%2Fconsume-an-odata-wcf-data-service-as-json-with-jquery.aspx" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=187" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/OData/default.aspx">OData</category><category domain="http://galratner.com/blogs/net/archive/tags/WCF+Data+Services/default.aspx">WCF Data Services</category></item><item><title>Four ways to utilize Entity Framework 4</title><link>http://galratner.com/blogs/net/archive/2011/03/24/four-ways-to-utilize-entity-framework-4.aspx</link><pubDate>Thu, 24 Mar 2011 05:28:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:186</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There is some confusion out there about a simple question: How can I use Entity Framework? Some developers have heard about reverse engineering models so I decided to write a quick preview to the main features of EF4. This isn&amp;rsquo;t an in-depth article, but, rather a visual summary of the main four scenarios EF can accommodate.&amp;nbsp; If you are looking to utilize any of the scenarios described here you might need to seek further documentation and realize that development with Entity Framework is a vast subject and is beyond the scope of a single article.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Let&amp;rsquo;s explore the scenarios available to us:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Database First&lt;/b&gt;&lt;br /&gt;The most common scenario is starting with an existing database and generating a model from it. I have created a small database with two tables, one for customers and the other for orders. There is a one-to-many relationship between a customer and the orders that can belong to a customer&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3288.image002.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3288.image002.png" border="0" /&gt;&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7573.image001.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7573.image001.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7573.image001.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1207.image004.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1207.image004.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;We can begin by adding a new ADO.NET Entity Data Model&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4403.image005.png"&gt;&lt;/a&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5100.image005.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5100.image005.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;The Entity Data Model Wizard will ask us to choose a Model Contents. Lets select Generate From Database&lt;/p&gt;
&lt;p&gt;.&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4846.image007.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4846.image007.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;We can select an existing database connection or define a new connection.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5008.image008.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5008.image008.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;Finally the Wizard will ask us to select the objects we want the model to contain: Tables, Views and Stored Procedures.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0211.image009.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0211.image009.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;When we click finish the wizard will create the new model. We can see here that both of our tables are now in the model.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2746.image010.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2746.image010.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Model First&lt;/b&gt;&lt;br /&gt;In a Model First approach we will create a model first and then generate a database from it.&amp;nbsp; Let&amp;rsquo;s begin by selecting an empty model from the Entity Data Model Wizard.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7624.image011.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7624.image011.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;An empty design surface will show up, allowing us to select and add Associations, Entities and Inheritance from the toolbox on the left. When we are done designing our model we can click anywhere in the design pan and select Generate Database from model.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3581.image012.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3581.image012.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;The Generate Database Wizard will open and show the SQL that is about to run in order to create our new database. Here we can fine tune the create statements in order to optimize columns, indexes etc.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8688.image014.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8688.image014.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;Here is the final SQL about to run on our new database&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2480.image015.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2480.image015.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Model with POCO&lt;/b&gt;&lt;br /&gt;POCO (Plain Old CLR Object) can replace your entities and are useful when you need more control over your data objects. For example if you are returning a data object from a WCF and need to serialize some of the fields you can add a POCO object with data member attributes on the properties you need to return. Although you can code your POCOs yourself it will be significantly easier to use a POCO Generator. You can download the ADO.NET C# POCO Entity Generator from your Visual Studio&amp;rsquo;s Extension Manager. The generator is T4 (Text Template Transformation Toolkit) based and will create the .tt files in your solution. As a first step, search and install the generator using the Extension Manger.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2465.image016.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2465.image016.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;Then right click on your model and select Add Code Generation Item&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3443.image018.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/3443.image018.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Select ADO.NET POCO Entity Generator.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8311.image020.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/8311.image020.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;You will get some security dialogs while the templates are generating your POCO classes. The end result will be a class for each model entity and a class for the Context. There are some gotchas with POCOs. The syntax might differ and you can&amp;rsquo;t mix POCO and regular models. Performance will too suffer as Entity Framework creates some background proxy objects.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1462.image022.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1462.image022.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;This is an example of a generated POCO:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0878.image023.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0878.image023.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code First&lt;/b&gt;&lt;br /&gt;The last use case is hard coding both the Context and the entities to create or use a database structure.&amp;nbsp; In a Code First case we can generate a database whenever the model changes, make changes to an existing database or simply use an existing database. This option differs from model with POCO in a few areas; since the model is able to make changes to dataset, the entities are more tightly coupled with database tables. Primary and foreign keys can be defined as attributes in the entity classes or using the Fluent API.&lt;br /&gt;To use code first we need to download the RC release of EF 4.1 using NuGet&amp;rsquo;s supported package sources. We are going to select and install the library EntityFramework which contains the RC release.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2022.image024.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2022.image024.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;After we have done that and NuGet has added the necessary references to our project we need to code the context to match our existing database. We are going to inherit from DBContext and since we are using an existing string connection we added a constructor to accept the connection name if the string connection matches the model name, ET will automatically use it. In our case we set it ourselves.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0451.image026.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/0451.image026.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;Now we can code the individual entity classes&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6712.image027.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6712.image027.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1524.image028.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1524.image028.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Putting everything together looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6215.image029.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6215.image029.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;We can tell that the model followed our foreign key constraint as we defined in the attributes.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;This has been a very short summary of all of the current options available to you when working with Entity Framework 4. I did not go into details for each method as there is plenty of documentation out there. I hope you find this article useful when deciding on development strategy with Entity Framework.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Four-ways-to-utilize-Entity-Framework-4-NET-Development-Gal-Ratner"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F03%2F24%2Ffour-ways-to-utilize-entity-framework-4.aspx" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=186" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/Entity+Framework/default.aspx">Entity Framework</category></item><item><title>Reading an Excel spreadsheet into dynamic objects</title><link>http://galratner.com/blogs/net/archive/2011/03/18/reading-an-excel-spreadsheet-into-dynamic-objects.aspx</link><pubDate>Fri, 18 Mar 2011 02:36:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:185</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Excel represents documents using Office Open XML (OOXML), a zipped XML based format developed for spreadsheet and chart representation.&amp;nbsp; In this article I am going to demonstrate parsing an Excel spreadsheet and loading the data into a generic List. OOXML was incorporated into Office in 2007 therefore the following code will not work with older versions of Excel.&lt;br /&gt;This is our spreadsheet:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1033.exampleExcel.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/1033.exampleExcel.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In order to read and parse the Spreadsheet we are going to use the Open XML SDK 2.0 for Microsoft Office available for download from Microsoft. The complete SDK includes the DocumentFormat.OpenXml library and some productivity tools that will help you examine the structure of Office documents. Open XML SDK is built on top of System.IO.Packaging so in order to use the DocumentFormat.OpenXml library you also need to import WindowsBase.dll.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2100.OpenXMLSDK.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2100.OpenXMLSDK.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s begin by loading the correct worksheet into a SpreadsheetDocument&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ExpandoObject&lt;/span&gt;&amp;gt;&amp;nbsp;GetSpreadsheetData(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;workSheet,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;filePath)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ExpandoObject&lt;/span&gt;&amp;gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ExpandoObject&lt;/span&gt;&amp;gt;();&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;SpreadsheetDocument&lt;/span&gt;&amp;nbsp;spreadsheetDocument&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SpreadsheetDocument&lt;/span&gt;.Open(filePath,&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;worksheet&amp;nbsp;we&amp;nbsp;are&amp;nbsp;working&amp;nbsp;with&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Sheet&lt;/span&gt;&amp;gt;&amp;nbsp;sheets&amp;nbsp;=&amp;nbsp;spreadsheetDocument.WorkbookPart.Workbook.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Sheet&lt;/span&gt;&amp;gt;().Where(s&amp;nbsp;=&amp;gt;&amp;nbsp;s.Name&amp;nbsp;==&amp;nbsp;workSheet);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WorksheetPart&lt;/span&gt;&amp;nbsp;worksheetPart&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;WorksheetPart&lt;/span&gt;)spreadsheetDocument.WorkbookPart.GetPartById(sheets.First().Id);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Worksheet&lt;/span&gt;&amp;nbsp;worksheet&amp;nbsp;=&amp;nbsp;worksheetPart.Worksheet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SharedStringTablePart&lt;/span&gt;&amp;nbsp;sstPart&amp;nbsp;=&amp;nbsp;spreadsheetDocument.WorkbookPart.GetPartsOfType&amp;lt;&lt;span style="color: #2b91af;"&gt;SharedStringTablePart&lt;/span&gt;&amp;gt;().First();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SharedStringTable&lt;/span&gt;&amp;nbsp;ssTable&amp;nbsp;=&amp;nbsp;sstPart.SharedStringTable;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;CellFormats&amp;nbsp;for&amp;nbsp;cells&amp;nbsp;without&amp;nbsp;defined&amp;nbsp;data&amp;nbsp;types&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WorkbookStylesPart&lt;/span&gt;&amp;nbsp;workbookStylesPart&amp;nbsp;=&amp;nbsp;spreadsheetDocument.WorkbookPart.GetPartsOfType&amp;lt;&lt;span style="color: #2b91af;"&gt;WorkbookStylesPart&lt;/span&gt;&amp;gt;().First();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellFormats&lt;/span&gt;&amp;nbsp;cellFormats&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;CellFormats&lt;/span&gt;)workbookStylesPart.Stylesheet.CellFormats;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExtractRowsData(data,&amp;nbsp;worksheet,&amp;nbsp;ssTable,&amp;nbsp;cellFormats);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;As you can tell we loaded the worksheet and a styles used for cell formatting. This will come in handy later on.&lt;br /&gt;Now that we have the worksheet we use the first row to set the field names of our objects. We use ExpandoObject since it allows dynamically adding of members.&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;data&amp;nbsp;using&amp;nbsp;the&amp;nbsp;first&amp;nbsp;row&amp;nbsp;as&amp;nbsp;columns&amp;nbsp;and&amp;nbsp;the&amp;nbsp;rest&amp;nbsp;of&amp;nbsp;the&amp;nbsp;rows&amp;nbsp;as&amp;nbsp;data&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"data"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"worksheet"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"ssTable"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"cellFormats"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ExtractRowsData(&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ExpandoObject&lt;/span&gt;&amp;gt;&amp;nbsp;data,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Worksheet&lt;/span&gt;&amp;nbsp;worksheet,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SharedStringTable&lt;/span&gt;&amp;nbsp;ssTable,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellFormats&lt;/span&gt;&amp;nbsp;cellFormats)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;columnHeaders&amp;nbsp;=&amp;nbsp;worksheet.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Row&lt;/span&gt;&amp;gt;().First().Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;().Select(c&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToString(ProcessCellValue(c,&amp;nbsp;ssTable,&amp;nbsp;cellFormats))).ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;columnHeadersCellReference&amp;nbsp;=&amp;nbsp;worksheet.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Row&lt;/span&gt;&amp;gt;().First().Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;().Select(c&amp;nbsp;=&amp;gt;&amp;nbsp;c.CellReference.InnerText.Replace(&lt;span style="color: #a31515;"&gt;"1"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty)).ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;spreadsheetData&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt;&amp;nbsp;row&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;worksheet.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Row&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;where&lt;/span&gt;&amp;nbsp;row.RowIndex&amp;nbsp;&amp;gt;&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;select&lt;/span&gt;&amp;nbsp;row;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;dataRow&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;spreadsheetData)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;dynamic&lt;/span&gt;&amp;nbsp;row&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ExpandoObject&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;[]&amp;nbsp;rowCells&amp;nbsp;=&amp;nbsp;dataRow.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;().ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;columnHeaders.Length;&amp;nbsp;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Find&amp;nbsp;and&amp;nbsp;add&amp;nbsp;the&amp;nbsp;correct&amp;nbsp;cell&amp;nbsp;to&amp;nbsp;the&amp;nbsp;row&amp;nbsp;object&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;&amp;nbsp;cell&amp;nbsp;=&amp;nbsp;dataRow.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;().Where(c&amp;nbsp;=&amp;gt;&amp;nbsp;c.CellReference&amp;nbsp;==&amp;nbsp;columnHeadersCellReference[i]&amp;nbsp;+&amp;nbsp;dataRow.RowIndex).FirstOrDefault();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(cell&amp;nbsp;!=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&lt;span style="color: #2b91af;"&gt;IDictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;gt;)row).Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;gt;(columnHeaders[i],&amp;nbsp;ProcessCellValue(cell,&amp;nbsp;ssTable,&amp;nbsp;cellFormats)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.Add(row);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;Its important to mention that fields that are empty cells are not a part of the row collection and do not show up in the underlying XML structure, therefore we need to explicitly search for the correct cell in the current row by matching its CellReference to the CellReference of the header. For example:&amp;nbsp; Cell A7 will be matched against header A1. If a Cell exists in the XML we will add it as an object member.&lt;br /&gt;The last step is to process the cell&amp;rsquo;s value. Values in Excel can be a little misleading. Some values will be held in the actual cell, some will be held in the SharedStringTable. Some cells data types will be set and some wont forcing us to rely on cell formatting. I have not found a defined set of guidelines to extracting cell values and all of the code examples I found online did not fully work so I had to simply rely on reading the underlying XML source and coming up with my own set of rules.&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Process&amp;nbsp;the&amp;nbsp;valus&amp;nbsp;of&amp;nbsp;a&amp;nbsp;cell&amp;nbsp;and&amp;nbsp;return&amp;nbsp;a&amp;nbsp;.NET&amp;nbsp;value&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Cell&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SharedStringTable&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellFormats&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;&amp;gt;&amp;nbsp;ProcessCellValue&amp;nbsp;=&amp;nbsp;(c,&amp;nbsp;ssTable,&amp;nbsp;cellFormats)&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;If&amp;nbsp;there&amp;nbsp;is&amp;nbsp;no&amp;nbsp;data&amp;nbsp;type,&amp;nbsp;this&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;string&amp;nbsp;that&amp;nbsp;has&amp;nbsp;been&amp;nbsp;formatted&amp;nbsp;as&amp;nbsp;a&amp;nbsp;number&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(c.DataType&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellFormat&lt;/span&gt;&amp;nbsp;cf&amp;nbsp;=&amp;nbsp;cellFormats.Descendants&amp;lt;&lt;span style="color: #2b91af;"&gt;CellFormat&lt;/span&gt;&amp;gt;().ElementAt&amp;lt;&lt;span style="color: #2b91af;"&gt;CellFormat&lt;/span&gt;&amp;gt;(&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(c.StyleIndex.Value));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(cf.NumberFormatId&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cf.NumberFormatId&amp;nbsp;&amp;lt;=&amp;nbsp;13)&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;a&amp;nbsp;number&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDecimal(c.CellValue.Text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(cf.NumberFormatId&amp;nbsp;&amp;gt;=&amp;nbsp;14&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cf.NumberFormatId&amp;nbsp;&amp;lt;=&amp;nbsp;22)&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;a&amp;nbsp;date&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;.FromOADate(&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(c.CellValue.Text));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;c.CellValue.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;switch&lt;/span&gt;&amp;nbsp;(c.DataType.Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellValues&lt;/span&gt;.SharedString:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;ssTable.ChildElements[&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(c.CellValue.Text)].InnerText;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellValues&lt;/span&gt;.Boolean:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;c.CellValue.Text&amp;nbsp;==&amp;nbsp;&lt;span style="color: #a31515;"&gt;"1"&lt;/span&gt;&amp;nbsp;?&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellValues&lt;/span&gt;.Date:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;.FromOADate(&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(c.CellValue.Text));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CellValues&lt;/span&gt;.Number:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDecimal(c.CellValue.Text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;default&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(c.CellValue&amp;nbsp;!=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;c.CellValue.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/pre&gt;
&lt;p&gt;NumberFormatId is defined in a table and took a while to find online.&lt;br /&gt;After running the code the result is a generic list holding dynamic objects containing&amp;nbsp; strongly typed members matching the types in your spreadsheet..&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Reading-an-Excel-spreadsheet-into-dynamic-objects-NET-Development-Gal-Ratner"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F03%2F18%2Freading-an-excel-spreadsheet-into-dynamic-objects.aspx" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=185" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/Dynamic/default.aspx">Dynamic</category><category domain="http://galratner.com/blogs/net/archive/tags/Office+Open+XML/default.aspx">Office Open XML</category></item><item><title>Never break the build again with an organized code base</title><link>http://galratner.com/blogs/net/archive/2011/03/05/never-break-the-build-again-with-an-organized-code-base.aspx</link><pubDate>Sat, 05 Mar 2011 01:56:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:184</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;During my time developing for different companies one of the most common daily scenarios I encounter is helping a developer debug code. Going to some method&amp;rsquo;s definition, only to realize they can only view metadata and not actual code. The library is still internal, most likely developed by another department inside the same organization, however, it was added as an external DLL reference and to view the code they need to open another solution in another folder. Well this will work until the external code has been updated and since code is updated daily, the references must also be updated or the code base quickly goes out of sync, not to mention debugging the external binaries is very difficult.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;When possible, I always try and consolidate code. Keeping code in the same solutions or folders makes it easier to track changes and cascade refactoring. Working with two or three instances of Visual Studio just to see the code used by one project can be eliminated if all the code was already available in the solution you are working with.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The following technique for sorting out and arranging your enterprise code is recommended by me in order to maintain multiple systems with the same common code, making it easy to develop, maintain and produce successful builds.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;To consolidate the code you need three main folders&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Main/&lt;/b&gt; The main folder contains all the code your organization produces.&lt;br /&gt;&lt;b&gt;Bin/&lt;/b&gt; This is the global bin folder. All of the binary DLLs you compile will be added to this folder. To set it you need to navigate to the properties of your library project and set the&amp;nbsp;output path.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5706.globalbin.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5706.globalbin.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Lib/&lt;/b&gt; This folder contain the master copy of any external DLLs or components you buy or download. When a project need a reference to an external DLL you do not have the code for, you can grab a copy to be placed in the local project&amp;rsquo;s Lib folder and add a reference to the local DLL.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Place all of your code in Main/ and create a solution file called master.sln. Add all of your projects to this solution. Every time you create a new project, it must be added to the master solution. The master solution must be successfully compiled at all times and the continuous build server must notify the team if the solution or the build are &amp;ldquo;broken&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Next you must arrange the global build order. Remove any references that are DLL references or 3rd party components that are not GACed from your references. Add project references. Start with the lowest layer and work your way up. When you are done all projects that do not belong to your UI layer will have references to other projects in the Main folder. Now that you have added all the references you can check what project needs a reference to an external DLL. Create a folder named Lib in the project and add a local copy of the external DLL. Add a reference from the references section of the project to the DLL in the Lib folder you just created. This will allow deployment of the project from any build server without the need to find a copy of the DLL. It is in essence a part of your project.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;After you have done that your master solution is ready to be built. It might take a while to compile and that&amp;rsquo;s ok. You will rarely work with the master solution. Its job is primarily to keep all the code in ready state.&lt;br /&gt;It is now time to create all of the solutions you will be working with. I usually create one solution per logical product, for example, my CDN system can be in InvertedSoftware.CDN.sln and my media processing system will be under InvertedSoftware.Media.Services.sln they both have code that is unique to the project. For example: The UI layers and some of the business layer and code that is common, for example: the libraries InvertedSoftware.Common and InvertedSoftware.Common.Net I usually divide them according to the following diagram:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5430.Drawing1.jpg"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5430.Drawing1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Now that you have all of your solutions in place you have access to all of the code you need if you are concerned about developers seeing code they are not authorized to see you can restrict the main repository from ever showing the code to developers that are not authorized to see them or use another repository for sensitive code development. In that case you can still use a reference to an external library contain the sensitive code.&lt;br /&gt;Organizing your code is such a way that allows developers to follow references and have projects rely on other projects instead of DLL references will help you better coordinate development around multiple projects and minimize code duplication not to mention you will always have a working complete code base.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Never-break-the-build-again-with-an-organized-code-base-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F03%2F05%2Fnever-break-the-build-again-with-an-organized-code-base.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=184" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/Release+Management/default.aspx">Release Management</category><category domain="http://galratner.com/blogs/net/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Send a web page as an email with embedded images</title><link>http://galratner.com/blogs/net/archive/2011/02/27/send-a-web-page-as-an-email-with-embedded-images.aspx</link><pubDate>Sun, 27 Feb 2011 04:45:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:183</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In email marketing, sending customized emails is a common practice. Emails containing special offers, shopping cart items or any other dynamic content, are usually tailored to the individual and are being sent either by request or as a part of a marketing campaign. This presents a challenge since email templates are usually being maintained by the marketing department and need to be simple to change, yet flexible enough for a programmer to add any dynamic data as needed. The solution can be reading a dynamic existing HTML or ASPX page and emailing a copy of it to the recipients.&lt;br /&gt;This blog post will show how to read the HTML content of a page, add the images to an email and send the email and images as an embedded resource so that the recipients will not need to view images hosted on an external server.&lt;br /&gt;First we need to read the page we are about to send. This can be a URL containing the customer&amp;rsquo;s email or unique ID for example: mydomain/salereceipt.aspx?SaleID=LKJGHIU&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: gray;"&gt;        ///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Read&amp;nbsp;the&amp;nbsp;HTML&amp;nbsp;from&amp;nbsp;a&amp;nbsp;URL&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"url"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;GetPageHTML(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;pageHTML&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;request&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;HttpWebRequest&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;WebRequest&lt;/span&gt;.Create(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.Timeout&amp;nbsp;=&amp;nbsp;100000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;request.GetResponse().GetResponseStream())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StreamReader&lt;/span&gt;(stream))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageHTML&amp;nbsp;=&amp;nbsp;reader.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;pageHTML;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;After we have the HTML we need to extract and replace all of the images with an embedded resource.&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: gray;"&gt;        ///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Replace&amp;nbsp;the&amp;nbsp;source&amp;nbsp;of&amp;nbsp;all&amp;nbsp;the&amp;nbsp;images&amp;nbsp;with&amp;nbsp;cid:uniqueId,&amp;nbsp;download&amp;nbsp;the&amp;nbsp;image&amp;nbsp;and&amp;nbsp;add&amp;nbsp;to&amp;nbsp;the&amp;nbsp;LinkedResource&amp;nbsp;collection.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"pageHTML"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"images"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"baseURL"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;gt;&amp;nbsp;ProcessEmbeddedHTML(&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;processedPageHTML,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;pageHTML,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;images,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;baseURL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;gt;&amp;nbsp;resources&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;image&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;images)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;imageName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString().Replace(&lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageHTML&amp;nbsp;=&amp;nbsp;pageHTML.Replace(image,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"cid:"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;imageName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;nbsp;imagelink&amp;nbsp;=&amp;nbsp;GetLinkedResource(image,&amp;nbsp;baseURL,&amp;nbsp;imageName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resources.Add(imagelink);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processedPageHTML&amp;nbsp;=&amp;nbsp;pageHTML;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;resources;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;LinkedResource&amp;nbsp;from&amp;nbsp;an&amp;nbsp;image&amp;nbsp;stream&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"imageURL"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"baseURL"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"imageName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;nbsp;GetLinkedResource(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;imageURL,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;baseURL,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;imageName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Turn&amp;nbsp;reletiv&amp;nbsp;URLs&amp;nbsp;to&amp;nbsp;absolute&amp;nbsp;URLs&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;&amp;nbsp;imageURI&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;.TryCreate(imageURL,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Absolute,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;imageURI))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;.TryCreate(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(baseURL),&amp;nbsp;imageURL,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;imageURI);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(imageURI&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MemoryStream&lt;/span&gt;&amp;nbsp;memoryStream&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;nbsp;imagelink&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;byte&lt;/span&gt;[]&amp;nbsp;myDataBuffer&amp;nbsp;=&amp;nbsp;client.DownloadData(imageURI);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memoryStream&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MemoryStream&lt;/span&gt;(myDataBuffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagelink&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;(memoryStream,&amp;nbsp;client.ResponseHeaders[&lt;span style="color: #a31515;"&gt;"Content-Type"&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagelink.ContentId&amp;nbsp;=&amp;nbsp;imageName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagelink.ContentLink&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"cid:"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;imageName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imagelink.TransferEncoding&amp;nbsp;=&amp;nbsp;System.Net.Mime.&lt;span style="color: #2b91af;"&gt;TransferEncoding&lt;/span&gt;.Base64;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;imagelink;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Get&amp;nbsp;a&amp;nbsp;list&amp;nbsp;of&amp;nbsp;all&amp;nbsp;the&amp;nbsp;images&amp;nbsp;in&amp;nbsp;the&amp;nbsp;HTML&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"HTMLText"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;FindHTMLImages(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;HTMLText)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;anchorPattern&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"(?&amp;lt;=img\s*\S*src\=[\x27\x22])(?&amp;lt;Url&amp;gt;[^\x27\x22]*)(?=[\x27\x22])"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MatchCollection&lt;/span&gt;&amp;nbsp;matches&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Regex&lt;/span&gt;.Matches(HTMLText,&amp;nbsp;anchorPattern,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RegexOptions&lt;/span&gt;.IgnorePatternWhitespace&amp;nbsp;|&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RegexOptions&lt;/span&gt;.IgnoreCase&amp;nbsp;|&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RegexOptions&lt;/span&gt;.Multiline&amp;nbsp;|&amp;nbsp;&lt;span style="color: #2b91af;"&gt;RegexOptions&lt;/span&gt;.Compiled);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;imageSources&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Match&lt;/span&gt;&amp;nbsp;m&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;matches)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;m.Groups[&lt;span style="color: #a31515;"&gt;"Url"&lt;/span&gt;].Value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;&amp;nbsp;testUri&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;.TryCreate(url,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.RelativeOrAbsolute,&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;testUri))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!imageSources.Exists(s&amp;nbsp;=&amp;gt;&amp;nbsp;s&amp;nbsp;==&amp;nbsp;testUri.ToString()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imageSources.Add(testUri.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;imageSources;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;Finally we can send the email. For customers with email clients that do not display HTML we used a text version that simply links the email to the online page version.&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;        static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendEmailWithResources(&lt;span style="color: #a31515;"&gt;"http://www.invertedsoftware.com"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Gal&amp;nbsp;Ratner"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"myemail@mydomain.com"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"remail@rdomain.com"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Email&amp;nbsp;Sent.&amp;nbsp;Press&amp;nbsp;Enter&amp;nbsp;to&amp;nbsp;terminate&amp;nbsp;program."&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Send&amp;nbsp;a&amp;nbsp;web&amp;nbsp;page&amp;nbsp;as&amp;nbsp;an&amp;nbsp;email&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"url"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"fromName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"fromEmail"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"toEmail"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;SendEmailWithResources(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromEmail,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;toEmail)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;GetPageHTML(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;images&amp;nbsp;=&amp;nbsp;FindHTMLImages(html);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;processedPageHTML;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;gt;&amp;nbsp;linkedResources&amp;nbsp;=&amp;nbsp;ProcessEmbeddedHTML(&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;processedPageHTML,&amp;nbsp;html,&amp;nbsp;images,&amp;nbsp;url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendEmail(linkedResources,&amp;nbsp;processedPageHTML,&amp;nbsp;url,&amp;nbsp;fromName,&amp;nbsp;fromEmail,&amp;nbsp;toEmail);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(e.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;SendEmail(&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;gt;&amp;nbsp;linkedResources,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;processedPageHTML,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;messageURL,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromEmail,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;toEmail)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;MailMessage&lt;/span&gt;&amp;nbsp;mail&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MailMessage&lt;/span&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mail.From&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MailAddress&lt;/span&gt;(fromEmail,&amp;nbsp;fromName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mail.To.Add(toEmail);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mail.Subject&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"This&amp;nbsp;email&amp;nbsp;contains&amp;nbsp;a&amp;nbsp;web&amp;nbsp;page"&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;txtBody&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"See&amp;nbsp;this&amp;nbsp;email&amp;nbsp;online&amp;nbsp;here:&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;messageURL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AlternateView&lt;/span&gt;&amp;nbsp;plainView&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AlternateView&lt;/span&gt;.CreateAlternateViewFromString(txtBody,&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"text/plain"&lt;/span&gt;);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AlternateView&lt;/span&gt;&amp;nbsp;htmlView&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AlternateView&lt;/span&gt;.CreateAlternateViewFromString(processedPageHTML,&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"text/html"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;LinkedResource&lt;/span&gt;&amp;nbsp;linkedResource&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;linkedResources)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;htmlView.LinkedResources.Add(linkedResource);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mail.AlternateViews.Add(plainView);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mail.AlternateViews.Add(htmlView);&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SmtpClient&lt;/span&gt;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SmtpClient&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"localhost"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.Send(mail);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;Of course any style sheets need to be inline in the page and please remember that HTML may look different on email clients.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Send-a-web-page-as-an-email-with-embedded-images-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F02%2F27%2Fsend-a-web-page-as-an-email-with-embedded-images.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=183" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Getting around PathTooLongException on file move with Windows Native API</title><link>http://galratner.com/blogs/net/archive/2011/02/13/getting-around-pathtoolongexception-on-file-move-with-windows-native-api.aspx</link><pubDate>Sun, 13 Feb 2011 06:57:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:182</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you ever got the error message &amp;ldquo;The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters. &amp;ldquo; you are probably aware that there is no practical way of moving files with long paths using System.IO.File. The solution is to use the Native Windows API. You can see the API here: &lt;a href="http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx&lt;/a&gt;&lt;br /&gt;Here is a little helper class I wrote to utilize the native API from .NET:&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Runtime.InteropServices;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;InvertedSoftware.IO&lt;br /&gt;{&lt;br /&gt;	[&lt;span style="color: #2b91af;"&gt;Flags&lt;/span&gt;]&lt;br /&gt;	&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;enum&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MoveFileFlags&lt;/span&gt;&lt;br /&gt;	{&lt;br /&gt;		MOVEFILE_REPLACE_EXISTING&amp;nbsp;=&amp;nbsp;0x00000001,&lt;br /&gt;		MOVEFILE_COPY_ALLOWED&amp;nbsp;=&amp;nbsp;0x00000002,&lt;br /&gt;		MOVEFILE_DELAY_UNTIL_REBOOT&amp;nbsp;=&amp;nbsp;0x00000004,&lt;br /&gt;		MOVEFILE_WRITE_THROUGH&amp;nbsp;=&amp;nbsp;0x00000008,&lt;br /&gt;		MOVEFILE_CREATE_HARDLINK&amp;nbsp;=&amp;nbsp;0x00000010,&lt;br /&gt;		MOVEFILE_FAIL_IF_NOT_TRACKABLE&amp;nbsp;=&amp;nbsp;0x00000020&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;A&amp;nbsp;class&amp;nbsp;for&amp;nbsp;file&amp;nbsp;IO&amp;nbsp;using&amp;nbsp;the&amp;nbsp;native&amp;nbsp;windows&amp;nbsp;API&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;FileIONative&lt;/span&gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Delete&amp;nbsp;a&amp;nbsp;file&amp;nbsp;using&amp;nbsp;the&amp;nbsp;native&amp;nbsp;Windows&amp;nbsp;API&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"fileName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;Delete(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fileName)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;fileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!DeleteFile(formattedName))&lt;br /&gt;				&lt;span style="color: blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Win32Exception();&lt;br /&gt;			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Move&amp;nbsp;a&amp;nbsp;file&amp;nbsp;using&amp;nbsp;the&amp;nbsp;native&amp;nbsp;Windows&amp;nbsp;API&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"fromFileName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"toFileName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;Move(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;toFileName)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedfromFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;fromFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedtoFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;toFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!MoveFile(formattedfromFileName,&amp;nbsp;formattedtoFileName))&lt;br /&gt;				&lt;span style="color: blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Win32Exception();&lt;br /&gt;			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;MoveEx(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;toFileName)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedfromFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;fromFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedtoFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;toFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!MoveFileEx(formattedfromFileName,&amp;nbsp;formattedtoFileName,&amp;nbsp;MoveFileFlags.MOVEFILE_REPLACE_EXISTING&amp;nbsp;|&amp;nbsp;MoveFileFlags.MOVEFILE_COPY_ALLOWED))&lt;br /&gt;				&lt;span style="color: blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Win32Exception();&lt;br /&gt;			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Copy&amp;nbsp;a&amp;nbsp;file&amp;nbsp;using&amp;nbsp;the&amp;nbsp;native&amp;nbsp;Windows&amp;nbsp;API&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"fromFileName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"toFileName"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"overrideExisting"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;Copy(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;fromFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;toFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;overrideExisting)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedfromFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;fromFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;formattedtoFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"\\?\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;toFileName;&lt;br /&gt;			&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!CopyFile(formattedfromFileName,&amp;nbsp;formattedtoFileName,&amp;nbsp;overrideExisting))&lt;br /&gt;				&lt;span style="color: blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Win32Exception();&lt;br /&gt;			&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		[&lt;span style="color: #2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"kernel32.dll"&lt;/span&gt;,&amp;nbsp;CharSet&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CharSet&lt;/span&gt;.Unicode,&amp;nbsp;SetLastError&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)]&lt;br /&gt;		[&lt;span style="color: blue;"&gt;return&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br /&gt;		&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;DeleteFile(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpFileName);&lt;br /&gt; &lt;br /&gt;		[&lt;span style="color: #2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"kernel32.dll"&lt;/span&gt;,&amp;nbsp;CharSet&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CharSet&lt;/span&gt;.Unicode,&amp;nbsp;SetLastError&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)]&lt;br /&gt;		[&lt;span style="color: blue;"&gt;return&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br /&gt;		&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;MoveFile(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpExistingFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpNewFileName);&lt;br /&gt; &lt;br /&gt;		[&lt;span style="color: #2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"kernel32.dll"&lt;/span&gt;,&amp;nbsp;CharSet&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CharSet&lt;/span&gt;.Unicode,&amp;nbsp;SetLastError&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)]&lt;br /&gt;		[&lt;span style="color: blue;"&gt;return&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br /&gt;		&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;MoveFileEx(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpExistingFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpNewFileName,&amp;nbsp;MoveFileFlags&amp;nbsp;dwFlags);&lt;br /&gt; &lt;br /&gt;		[&lt;span style="color: #2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"kernel32.dll"&lt;/span&gt;,&amp;nbsp;CharSet&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;CharSet&lt;/span&gt;.Unicode,&amp;nbsp;SetLastError&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)]&lt;br /&gt;		[&lt;span style="color: blue;"&gt;return&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br /&gt;		&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;extern&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;CopyFile(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpExistingFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;lpNewFileName,&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;bFailIfExists);&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Usage looks like:&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;FileIONative.Copy(FileName,&amp;nbsp;destinationFileName,&amp;nbsp;overrideExisting);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Any errors will throw a Win32Exception.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Getting-around-PathTooLongException-on-file-move-with-Windows-Native-API-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F02%2F13%2Fgetting-around-pathtoolongexception-on-file-move-with-windows-native-api.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=182" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/Native+API/default.aspx">Native API</category></item><item><title>A simple fast configuration-less rolling file appender</title><link>http://galratner.com/blogs/net/archive/2011/02/13/a-simple-fast-configuration-less-rolling-file-appender.aspx</link><pubDate>Sun, 13 Feb 2011 02:45:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:181</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you ever needed a simple logger and did not want to deal with the complexity of configurating Log4net or the enterprise library you might find this class useful. This is a single class, single file rolling file appender.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To use this logger all you need to do is either add the class to your code or use the DLL as a reference. If you chose to use the dll you need to import it in your code as follows: &lt;/p&gt;
&lt;pre style="FONT-FAMILY: consolas"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&amp;nbsp;InvertedSoftware.PLogger.Provider;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Then to write a log line you simply need to call:&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: #2b91af;"&gt;RollingLogProvider&lt;/span&gt;.Instance.Log(&lt;span style="color: #a31515;"&gt;"Default&amp;nbsp;Message"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;Default values:&lt;/strong&gt; by default, the logger will write a file named rolling.log and will start a new file every 1MB of data. The file will be placed in the current working directory.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Optional configuration values:&lt;/strong&gt;&lt;/p&gt;
&lt;pre style="FONT-FAMILY: consolas"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;key&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PLogEnabled&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;key&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PLogFileName&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;bin\log.log&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;key&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PLogFileMaxSizeKB&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;1024&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;key&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PLogFileMessageTemplate&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;{0}&amp;nbsp;This&amp;nbsp;is&amp;nbsp;the&amp;nbsp;default&amp;nbsp;message&amp;nbsp;template&amp;nbsp;{1}&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;key&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;PLogLevel&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;4&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;If you choose to add a message template you can call it in the following format:&lt;/p&gt;
&lt;pre style="FONT-FAMILY: consolas"&gt;&lt;span style="COLOR: #2b91af"&gt;RollingLogProvider&lt;/span&gt;.Instance.Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Empty,&amp;nbsp;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;,&amp;nbsp;0,&amp;nbsp;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToShortDateString(),&amp;nbsp;&lt;span style="COLOR: #a31515"&gt;"End&amp;nbsp;of&amp;nbsp;message"&lt;/span&gt;&amp;nbsp;});&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;You can also log exceptions&lt;/p&gt;
&lt;pre style="FONT-FAMILY: consolas"&gt;&lt;span style="COLOR: #2b91af"&gt;RollingLogProvider&lt;/span&gt;.Instance.Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Empty,&amp;nbsp;&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;,&amp;nbsp;4,&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="COLOR: #a31515"&gt;"test&amp;nbsp;exception"&lt;/span&gt;,&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="COLOR: #a31515"&gt;"inner&amp;nbsp;exception"&lt;/span&gt;)),&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToShortDateString()&amp;nbsp;});&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;I have tested the logger twice, once with a default message and once with a template message using the following code:&lt;/p&gt;
&lt;pre style="FONT-FAMILY: consolas"&gt;&lt;span style="COLOR: #2b91af"&gt;Stopwatch&lt;/span&gt;&amp;nbsp;stopWatch&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;Stopwatch&lt;/span&gt;();&lt;br /&gt;stopWatch.Start();&lt;br /&gt; &lt;br /&gt;&lt;span style="COLOR: blue"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;1000000;&amp;nbsp;i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;RollingLogProvider&lt;/span&gt;.Instance.Log(&lt;span style="COLOR: #a31515"&gt;"Default&amp;nbsp;Message"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;RollingLogProvider&lt;/span&gt;.Instance.Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Empty,&amp;nbsp;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;,&amp;nbsp;0,&amp;nbsp;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="COLOR: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToShortDateString(),&amp;nbsp;&lt;span style="COLOR: #a31515"&gt;"End&amp;nbsp;of&amp;nbsp;message"&lt;/span&gt;&amp;nbsp;});&lt;br /&gt;}&lt;br /&gt;stopWatch.Stop();&lt;br /&gt;&lt;span style="COLOR: green"&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;elapsed&amp;nbsp;time&amp;nbsp;as&amp;nbsp;a&amp;nbsp;TimeSpan&amp;nbsp;value.&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: #2b91af"&gt;TimeSpan&lt;/span&gt;&amp;nbsp;ts&amp;nbsp;=&amp;nbsp;stopWatch.Elapsed;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;I got back 321 milliseconds for 1,000,000 messages and 4.76 seconds for 1,000,000 template messages. In all fairness if you look at the code, you will notice it is using a Task to write to the log file so calling Log will return before the message was actually written to the disk, however, using this method still speeds up your system significantly. &lt;br /&gt;I have attached both the source code and the compiled DLL to the zip file below and would love to hear feedback from users.&lt;/p&gt;
&lt;p&gt;Update: I have placed the code in &lt;a href="http://plogger.codeplex.com/"&gt;codeplex&lt;/a&gt;&amp;nbsp;and will be maintaining it there.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/A-simple-fast-configuration-less-rolling-file-appender-NET-Development-Gal-Ratner"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2011%2F02%2F13%2Fa-simple-fast-configuration-less-rolling-file-appender.aspx" alt="Shout it" style="border:0px" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=181" width="1" height="1"&gt;</description><enclosure url="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.01.81/PLogger.zip" length="6235" type="application/x-zip-compressed" /><category domain="http://galratner.com/blogs/net/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://galratner.com/blogs/net/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://galratner.com/blogs/net/archive/tags/Task/default.aspx">Task</category></item></channel></rss>
