<?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>Using HTML 5 and the Web API for AJAX file uploads with image preview and a progress bar</title><link>http://galratner.com/blogs/net/archive/2013/03/22/using-html-5-and-the-web-api-for-ajax-file-uploads-with-image-preview-and-a-progress-bar.aspx</link><pubDate>Fri, 22 Mar 2013 21:52:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:201</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;AJAX file uploads used to be a client / server process in HTML 4. They required a round trip to a server side module, usually using an IFRAME and constant querying of the number of bytes uploaded, then reloading a progress bar inside the IFRAME with the current progress value.&lt;br /&gt;Luckily HTML 5 has a level 2 XMLHttpRequest object that natively support file uploads. This makes it a breeze to give your users a great experience when uploading files to your application.&lt;/p&gt;
&lt;p&gt;In this article we are going to use it to show an end to end process of previewing an image and uploading it to the server while showing a progress bar.&lt;br /&gt;Technologies we will be using include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML 5 File API&lt;/li&gt;
&lt;li&gt;HTML 5 XMLHttpRequest Level 2&lt;/li&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;li&gt;jQuery UI Progressbar&lt;/li&gt;
&lt;li&gt;MVC ApiController&lt;/li&gt;
&lt;li&gt;Web API&amp;rsquo;s MultipartFormDataStreamProvider&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s start by building our view. At the very least we will need an input file, a preview div and a submit button. In this example I also use a few more parameters that serve as hints for image processing: a caption text, font size and type and color.&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="background: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;"Home&amp;nbsp;Page"&lt;/span&gt;;
&lt;span style="background:yellow;"&gt;}&lt;/span&gt;
&lt;span style="background:yellow;"&gt;@section&amp;nbsp;featured&amp;nbsp;{&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;name&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;method&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"post"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;enctype&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"multipart/form-data"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;action&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"api/uploads"&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;section&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"featured"&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;div&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"content-wrapper"&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;hgroup&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"title"&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;h1&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:yellow;"&gt;@&lt;/span&gt;ViewBag.Title.&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;h1&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;h2&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: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;
&amp;nbsp;&amp;nbsp;&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;hgroup&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;p&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;Upload&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;"imageFile"&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;"file"&lt;/span&gt;&amp;nbsp;&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;p&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;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;section&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="background:yellow;"&gt;}&lt;/span&gt;
&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;h3&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Write&amp;nbsp;something:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;h3&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;ol&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"round"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;
&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;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;"imageParams"&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;width&lt;/span&gt;:&lt;span style="color:blue;"&gt;100%&lt;/span&gt;;&lt;span style="color:red;"&gt;height&lt;/span&gt;:&lt;span style="color:blue;"&gt;50%&lt;/span&gt;;&lt;span style="color:blue;"&gt;"&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;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;"imageText"&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;width&lt;/span&gt;:&lt;span style="color:blue;"&gt;50%&lt;/span&gt;;&lt;span style="color:red;"&gt;float&lt;/span&gt;:&lt;span style="color:blue;"&gt;left&lt;/span&gt;&lt;span style="color:blue;"&gt;"&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;textarea&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;"styled"&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;"styled"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onfocus&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"this.value='';&amp;nbsp;setbg('#e5fff3');"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onblur&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"setbg('white')"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Enter&amp;nbsp;Text&amp;nbsp;here...&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;textarea&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;div&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;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;"textparams"&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;width&lt;/span&gt;:&lt;span style="color:blue;"&gt;50%&lt;/span&gt;;&lt;span style="color:red;"&gt;float&lt;/span&gt;:&lt;span style="color:blue;"&gt;left&lt;/span&gt;&lt;span style="color:blue;"&gt;"&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;Pick&amp;nbsp;a&amp;nbsp;text&amp;nbsp;color:&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;"textcolor"&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;"textcolor"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"color"&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;"ffffff"&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;
&amp;nbsp;&amp;nbsp;&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;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;"fontName"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Pick&amp;nbsp;a&amp;nbsp;Font:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;input&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;"radio"&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;"Tahoma"&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;"fontNameRadio"&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;"Tahoma"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onchange&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"changeFont(this);"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;checked&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"Tahoma"&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;font-family&lt;/span&gt;:&lt;span style="color:blue;"&gt;Tahoma&lt;/span&gt;&lt;span style="color:blue;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Tahoma&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&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;&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;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"radio"&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;"Arial"&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;"fontNameRadio"&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;"Arial"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onchange&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"changeFont(this);"&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"Arial"&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;font-family&lt;/span&gt;:&lt;span style="color:blue;"&gt;Arial&lt;/span&gt;&lt;span style="color:blue;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Arial&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&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;&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;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"radio"&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;"Verdana"&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;"fontNameRadio"&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;"Verdana"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onchange&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"changeFont(this);"&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"Verdana"&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;font-family&lt;/span&gt;:&lt;span style="color:blue;"&gt;Verdana&lt;/span&gt;&lt;span style="color:blue;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Verdana&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&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;&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;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"radio"&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;"Helvetica"&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;"fontNameRadio"&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;"Helvetica"&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;onchange&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"changeFont(this);"&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&lt;/span&gt;&amp;nbsp;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"Helvetica"&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;font-family&lt;/span&gt;:&amp;nbsp;&lt;span style="color:blue;"&gt;Helvetica&lt;/span&gt;&lt;span style="color:blue;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Helvetica&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;label&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;&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;&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pick&amp;nbsp;a&amp;nbsp;Font&amp;nbsp;Size:&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;"fontSize"&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;"fontSize"&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;"12"&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;px&lt;span style="color:blue;"&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;div&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;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;&amp;nbsp;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"theOuptout"&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;50%&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;width&lt;/span&gt;:&lt;span style="color:blue;"&gt;100%&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;float&lt;/span&gt;:&lt;span style="color:blue;"&gt;left&lt;/span&gt;&lt;span style="color:blue;"&gt;"&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;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;"theBackground"&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;background-repeat&lt;/span&gt;:&lt;span style="color:blue;"&gt;no-repeat&lt;/span&gt;;&lt;span style="color:red;"&gt;background-position&lt;/span&gt;:&lt;span style="color:blue;"&gt;left&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;top&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;width&lt;/span&gt;:&lt;span style="color:blue;"&gt;700px&lt;/span&gt;;&lt;span style="color:red;"&gt;height&lt;/span&gt;:&lt;span style="color:blue;"&gt;700px&lt;/span&gt;;&lt;span style="color:red;"&gt;border&lt;/span&gt;:&lt;span style="color:blue;"&gt;2px&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;solid&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;position&lt;/span&gt;:&amp;nbsp;&lt;span style="color:blue;"&gt;relative&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;float&lt;/span&gt;:&lt;span style="color:blue;"&gt;left&lt;/span&gt;;&amp;nbsp;&lt;span style="color:red;"&gt;background-size&lt;/span&gt;:&amp;nbsp;&lt;span style="color:blue;"&gt;contain&lt;/span&gt;&lt;span style="color:blue;"&gt;"&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;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;"caption"&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Enter&amp;nbsp;Text&amp;nbsp;here...&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;&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;div&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;ol&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;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;"actionButton"&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;"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;"&lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;sendForm(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.form);&lt;span style="color:blue;"&gt;"&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;"Upload"&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;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;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;"progressbar"&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;span style="background:yellow;"&gt;@section&amp;nbsp;scripts&amp;nbsp;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:yellow;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Scripts&lt;/span&gt;.Render(&lt;span style="color:#a31515;"&gt;"~/bundles/jqueryui"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:yellow;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Scripts&lt;/span&gt;.Render(&lt;span style="color:#a31515;"&gt;"~/bundles/jscolor"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:yellow;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Styles&lt;/span&gt;.Render(&lt;span style="color:#a31515;"&gt;"~/Content/themes/base/css"&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:yellow;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Scripts&lt;/span&gt;.Render(&lt;span style="color:#a31515;"&gt;"~/bundles/index"&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;span style="background:yellow;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;br /&gt;Once we have our UI in place we need to add the view script logic and validation. In order to use minification, I have bundled the script:&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;bundles.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ScriptBundle&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"~/bundles/index"&lt;/span&gt;).Include(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;"~/Scripts/Views/Index.js"&lt;/span&gt;));&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;And added it to the view:&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="background:yellow;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Scripts&lt;/span&gt;.Render(&lt;span style="color:#a31515;"&gt;"~/bundles/index"&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Let&amp;rsquo;s take a look at Index.js&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:blue;"&gt;function&lt;/span&gt;&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;container&amp;nbsp;=&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;'#theBackground'&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).draggable({&amp;nbsp;containment:&amp;nbsp;container&amp;nbsp;}).resizable({&amp;nbsp;containment:&amp;nbsp;container&amp;nbsp;});
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#fontName"&lt;/span&gt;).buttonset();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#styled"&lt;/span&gt;).keypress(&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;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).html($(&lt;span style="color:#a31515;"&gt;"#styled"&lt;/span&gt;).val());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#textcolor"&lt;/span&gt;).change(&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;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).css(&lt;span style="color:#a31515;"&gt;"color"&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"#"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#textcolor"&lt;/span&gt;).val());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#fontSize"&lt;/span&gt;).spinner({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spin:&amp;nbsp;&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;(event,&amp;nbsp;ui)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;"#caption"&lt;/span&gt;).css(&lt;span style="color:#a31515;"&gt;"font-size"&lt;/span&gt;,&amp;nbsp;ui.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;max:&amp;nbsp;50,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min:&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;Show&amp;nbsp;an&amp;nbsp;image&amp;nbsp;preview&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.getElementById(&lt;span style="color:#a31515;"&gt;'imageFile'&lt;/span&gt;).addEventListener(&lt;span style="color:#a31515;"&gt;'change'&lt;/span&gt;,&amp;nbsp;handleFileSelect,&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
});
 
&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;changeFont(fontName)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).css(&lt;span style="color:#a31515;"&gt;"font-family"&lt;/span&gt;,&amp;nbsp;fontName.value);
}
 
&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;handleFileSelect(evt)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;files&amp;nbsp;=&amp;nbsp;evt.target.files;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;FileList&amp;nbsp;object&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;Loop&amp;nbsp;through&amp;nbsp;the&amp;nbsp;FileList&amp;nbsp;and&amp;nbsp;render&amp;nbsp;image&amp;nbsp;files&amp;nbsp;as&amp;nbsp;thumbnails.&lt;/span&gt;
&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;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;f;&amp;nbsp;f&amp;nbsp;=&amp;nbsp;files[i];&amp;nbsp;i++)&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;Only&amp;nbsp;process&amp;nbsp;image&amp;nbsp;files.&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;(!f.type.match(&lt;span style="color:#a31515;"&gt;'image.*'&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;continue&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;var&lt;/span&gt;&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;FileReader();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;Closure&amp;nbsp;to&amp;nbsp;capture&amp;nbsp;the&amp;nbsp;file&amp;nbsp;information.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.onload&amp;nbsp;=&amp;nbsp;(&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;(theFile)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;function&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;&lt;span style="color:green;"&gt;//&amp;nbsp;Render&amp;nbsp;thumbnail.&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:#a31515;"&gt;"#theBackground"&lt;/span&gt;).css(&lt;span style="color:#a31515;"&gt;"background-image"&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"url('"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;e.target.result&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;})(f);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;Read&amp;nbsp;in&amp;nbsp;the&amp;nbsp;image&amp;nbsp;file&amp;nbsp;as&amp;nbsp;a&amp;nbsp;data&amp;nbsp;URL.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.readAsDataURL(f);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
 
&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;sendForm(form)&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:#a31515;"&gt;"#imageFile"&lt;/span&gt;).val()&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;alert(&lt;span style="color:#a31515;"&gt;'Please&amp;nbsp;select&amp;nbsp;an&amp;nbsp;image'&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;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#progressbar"&lt;/span&gt;).progressbar();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;FormData(form);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"offsetTop"&lt;/span&gt;,&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).position().top);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"offsetLeft"&lt;/span&gt;,&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).position().left);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"imageFile"&lt;/span&gt;,&amp;nbsp;document.getElementById(&lt;span style="color:#a31515;"&gt;"imageFile"&lt;/span&gt;).files[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;XMLHttpRequest();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.open(&lt;span style="color:#a31515;"&gt;'POST'&lt;/span&gt;,&amp;nbsp;form.action,&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.upload.onprogress&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;(e)&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;(e.lengthComputable)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;percentComplete&amp;nbsp;=&amp;nbsp;(e.loaded&amp;nbsp;/&amp;nbsp;e.total)&amp;nbsp;*&amp;nbsp;100;
&amp;nbsp;&amp;nbsp;&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;"#progressbar"&lt;/span&gt;).progressbar({&amp;nbsp;value:&amp;nbsp;percentComplete&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.onload&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;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.status&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;"#progressbar"&lt;/span&gt;).progressbar(&lt;span style="color:#a31515;"&gt;"destroy"&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;location.href&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;'/Home/ViewImage/'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;encodeURIComponent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.response).replace(&lt;span style="color:maroon;"&gt;/[!'()]/g&lt;/span&gt;,&amp;nbsp;escape).replace(&lt;span style="color:maroon;"&gt;/\*/g&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"%2A"&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;xhr.send(formData);
 
&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;&lt;span style="color:green;"&gt;//&amp;nbsp;Prevent&amp;nbsp;page&amp;nbsp;from&amp;nbsp;submitting.&lt;/span&gt;
}
 
 
&amp;nbsp;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;You can already see that when the DOM is loaded, we use jQuery and jQuery UI to make our image caption div resizable and resizable and, to make a buttonset out of our radio buttons and to initialize the progress bar.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Next we set up the preview. When a user selects an image, we use the File API to show the image to the user before we upload it.&lt;br /&gt;Adding an event listener: document.getElementById(&lt;span style="color:#a31515;"&gt;'imageFile'&lt;/span&gt;).addEventListener(&lt;span style="color:#a31515;"&gt;'change'&lt;/span&gt;,&amp;nbsp;handleFileSelect,&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;);
&lt;/p&gt;
&lt;p&gt;We create a FileReader:&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: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;FileReader();
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Use its onload event to set the result as the background of out preview div and then call its readAsDataURL to read the image.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;When a user decides to submit the form and upload their image, we override the onSubmit event and use AJAX instead of the default submit action:&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:blue;"&gt;function&lt;/span&gt;&amp;nbsp;sendForm(form)&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:#a31515;"&gt;"#imageFile"&lt;/span&gt;).val()&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;alert(&lt;span style="color:#a31515;"&gt;'Please&amp;nbsp;select&amp;nbsp;an&amp;nbsp;image'&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;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#progressbar"&lt;/span&gt;).progressbar();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;FormData(form);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"offsetTop"&lt;/span&gt;,&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).position().top);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"offsetLeft"&lt;/span&gt;,&amp;nbsp;$(&lt;span style="color:#a31515;"&gt;"#caption"&lt;/span&gt;).position().left);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&lt;span style="color:#a31515;"&gt;"imageFile"&lt;/span&gt;,&amp;nbsp;document.getElementById(&lt;span style="color:#a31515;"&gt;"imageFile"&lt;/span&gt;).files[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;XMLHttpRequest();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.open(&lt;span style="color:#a31515;"&gt;'POST'&lt;/span&gt;,&amp;nbsp;form.action,&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.upload.onprogress&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;function&lt;/span&gt;&amp;nbsp;(e)&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;(e.lengthComputable)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;percentComplete&amp;nbsp;=&amp;nbsp;(e.loaded&amp;nbsp;/&amp;nbsp;e.total)&amp;nbsp;*&amp;nbsp;100;
&amp;nbsp;&amp;nbsp;&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;"#progressbar"&lt;/span&gt;).progressbar({&amp;nbsp;value:&amp;nbsp;percentComplete&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.onload&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;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.status&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;"#progressbar"&lt;/span&gt;).progressbar(&lt;span style="color:#a31515;"&gt;"destroy"&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;location.href&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;'/Home/ViewImage/'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;encodeURIComponent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.response).replace(&lt;span style="color:maroon;"&gt;/[!'()]/g&lt;/span&gt;,&amp;nbsp;escape).replace(&lt;span style="color:maroon;"&gt;/\*/g&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"%2A"&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;xhr.send(formData);
 
&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;&lt;span style="color:green;"&gt;//&amp;nbsp;Prevent&amp;nbsp;page&amp;nbsp;from&amp;nbsp;submitting.&lt;/span&gt;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Values in the submitted forms include all regular form fields with the addition of our own custom values and the file selected by the user. The onprogress event is used to track and display the overall upload progress.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Now that we have all of the client code in place, we can move over to the server and use some pretty cool Web API features we are going to use an ApiController:&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: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;UploadsController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ApiController&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:blue;"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;HttpResponseMessage&lt;/span&gt;&amp;gt;&amp;nbsp;PostFormData()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;if&amp;nbsp;the&amp;nbsp;request&amp;nbsp;contains&amp;nbsp;multipart/form-data.&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;(!Request.Content.IsMimeMultipartContent())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;HttpResponseException&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;HttpStatusCode&lt;/span&gt;.UnsupportedMediaType);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&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;root&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpContext&lt;/span&gt;.Current.Server.MapPath(&lt;span style="color:#a31515;"&gt;"~/Images/Uploads/"&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;provider&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MultipartFormDataStreamProvider&lt;/span&gt;(root);
 
&amp;nbsp;&amp;nbsp;&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;await&lt;/span&gt;&amp;nbsp;Request.Content.ReadAsMultipartAsync(provider);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;MultipartFileData&lt;/span&gt;&amp;nbsp;file&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;provider.FileData)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;//Add&amp;nbsp;the&amp;nbsp;original&amp;nbsp;extention&amp;nbsp;to&amp;nbsp;the&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;newFileName&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;"{0}{1}"&lt;/span&gt;,&amp;nbsp;file.LocalFileName,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.GetExtension(file.Headers.ContentDisposition.FileName.Replace(&lt;span style="color:#a31515;"&gt;"\""&lt;/span&gt;,&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;&lt;span style="color:#2b91af;"&gt;File&lt;/span&gt;.Move(file.LocalFileName,&amp;nbsp;newFileName);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Do&amp;nbsp;the&amp;nbsp;image&amp;nbsp;processing&amp;nbsp;here&amp;nbsp;and&amp;nbsp;return&amp;nbsp;a&amp;nbsp;URL&amp;nbsp;to&amp;nbsp;view&amp;nbsp;the&amp;nbsp;image&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;ProcessImage(newFileName,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.FormData[&lt;span style="color:#a31515;"&gt;"styled"&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;int&lt;/span&gt;.Parse(provider.FormData[&lt;span style="color:#a31515;"&gt;"offsetTop"&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;int&lt;/span&gt;.Parse(provider.FormData[&lt;span style="color:#a31515;"&gt;"offsetLeft"&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;provider.FormData[&lt;span style="color:#a31515;"&gt;"textcolor"&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;provider.FormData[&lt;span style="color:#a31515;"&gt;"fontNameRadio"&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;int&lt;/span&gt;.Parse(provider.FormData[&lt;span style="color:#a31515;"&gt;"fontSize"&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;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpResponseMessage&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;Content&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;StringContent&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.GetFileName(newFileName).Replace(&lt;span style="color:#a31515;"&gt;"."&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"dot"&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;StatusCode&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpStatusCode&lt;/span&gt;.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Request.CreateErrorResponse(&lt;span style="color:#2b91af;"&gt;HttpStatusCode&lt;/span&gt;.NotFound,&amp;nbsp;&lt;span style="color:#a31515;"&gt;"Error&amp;nbsp;processing&amp;nbsp;image"&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;catch&lt;/span&gt;&amp;nbsp;(System.&lt;span style="color:#2b91af;"&gt;Exception&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;&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;Request.CreateErrorResponse(&lt;span style="color:#2b91af;"&gt;HttpStatusCode&lt;/span&gt;.InternalServerError,&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;}
 
&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;ProcessImage(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;fileName,&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;caption,&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;captionTop,&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;captionLeft,&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;fontColor,&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;fontFamily,&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;fontSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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:blue;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(caption))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;caption&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"Something&amp;nbsp;clever&amp;nbsp;should&amp;nbsp;have&amp;nbsp;been&amp;nbsp;here."&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;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(fontColor))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fontColor&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"#ffffff"&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;Color&amp;nbsp;color&amp;nbsp;=&amp;nbsp;System.Drawing.&lt;span style="color:#2b91af;"&gt;ColorTranslator&lt;/span&gt;.FromHtml(fontColor.StartsWith(&lt;span style="color:#a31515;"&gt;"#"&lt;/span&gt;)&amp;nbsp;?&amp;nbsp;fontColor&amp;nbsp;:&amp;nbsp;&lt;span style="color:#a31515;"&gt;"#"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;fontColor);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PointF&amp;nbsp;textPosition&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;PointF((&lt;span style="color:blue;"&gt;float&lt;/span&gt;)captionTop,&amp;nbsp;(&lt;span style="color:blue;"&gt;float&lt;/span&gt;)captionLeft);
&amp;nbsp;&amp;nbsp;&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;Bitmap&lt;/span&gt;&amp;nbsp;bitmap&amp;nbsp;=&amp;nbsp;(&lt;span style="color:#2b91af;"&gt;Bitmap&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;Image&lt;/span&gt;.FromFile(fileName))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;SolidBrush&lt;/span&gt;&amp;nbsp;drawBrush&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SolidBrush&lt;/span&gt;(color);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Graphics&lt;/span&gt;&amp;nbsp;graphics&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Graphics&lt;/span&gt;.FromImage(bitmap))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Font&lt;/span&gt;&amp;nbsp;drawFont&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Font&lt;/span&gt;(fontFamily,&amp;nbsp;(&lt;span style="color:blue;"&gt;float&lt;/span&gt;)fontSize))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;graphics.DrawString(caption,&amp;nbsp;drawFont,&amp;nbsp;drawBrush,&amp;nbsp;textPosition);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bitmap.Save(fileName&amp;nbsp;+&amp;nbsp;&lt;span style="color:#a31515;"&gt;"tmp"&lt;/span&gt;);&lt;span style="color:green;"&gt;//save&amp;nbsp;the&amp;nbsp;image&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;&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;.Replace(fileName&amp;nbsp;+&amp;nbsp;&lt;span style="color:#a31515;"&gt;"tmp"&lt;/span&gt;,&amp;nbsp;fileName,&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;/pre&gt;
&lt;p&gt;&lt;br /&gt;System.Net.Http includes a MultipartFormDataStreamProvider. This provider is used with HTML file uploads for writing file content to a FileStream. The stream provider looks at the &amp;lt;b&amp;gt;Content-Disposition&amp;lt;/b&amp;gt; header field and determines an output Stream based on the presence of a &amp;lt;b&amp;gt;filename&amp;lt;/b&amp;gt; parameter.&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;root&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpContext&lt;/span&gt;.Current.Server.MapPath(&lt;span style="color:#a31515;"&gt;"~/Images/Uploads/"&lt;/span&gt;);
&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;provider&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MultipartFormDataStreamProvider&lt;/span&gt;(root);&lt;/pre&gt;
&lt;p&gt;At this point our provider is set to save the files in our Uploads directory&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;await&lt;/span&gt;&amp;nbsp;Request.Content.ReadAsMultipartAsync(provider);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Reads the content of the submitted form and saves the file uploaded to disk asynchronously. As a default, the files are renamed to a random name and contain no extension.&lt;/p&gt;
&lt;p&gt;We can now use the rest of the form&amp;rsquo;s parameters to help us process the image as we like. In our case, we simply write a caption into it. When we are done, we compose an HttpResponseMessage containing he location of the new image to be returned to the client.&lt;br /&gt;The client can then use the message and redirect the user to view the uploaded image. This time, served from the server.&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&amp;nbsp;xhr.onload&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;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.status&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;"#progressbar"&lt;/span&gt;).progressbar(&lt;span style="color: #a31515;"&gt;"destroy"&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;location.href&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;'/Home/ViewImage/'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;encodeURIComponent(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.response).replace(&lt;span style="color: maroon;"&gt;/[!'()]/g&lt;/span&gt;,&amp;nbsp;escape).replace(&lt;span style="color: maroon;"&gt;/\*/g&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"%2A"&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;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;As you can see, HTML 5 has made some significant improvements that are much needed in the web 2.0 world. The ability to access a local file and AJAX submit multipart forms are a much needed addition and are sure to make your code simpler and your users happier.&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Using-HTML-5-and-the-Web-API-for-AJAX-file-uploads-with-image-preview-and-a-progress-bar-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%2F2013%2F03%2F22%2Fusing-html-5-and-the-web-api-for-ajax-file-uploads-with-image-preview-and-a-progress-bar.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=201" 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/Web+API/default.aspx">Web API</category><category domain="http://galratner.com/blogs/net/archive/tags/HTML+5/default.aspx">HTML 5</category><category domain="http://galratner.com/blogs/net/archive/tags/ApiController/default.aspx">ApiController</category><category domain="http://galratner.com/blogs/net/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>Use MVC 4 and OAuthWebSecurity to post into your users Facebook timeline</title><link>http://galratner.com/blogs/net/archive/2012/09/27/use-mvc-4-and-oauthwebsecurity-to-post-into-your-users-facebook-timeline.aspx</link><pubDate>Thu, 27 Sep 2012 00:52:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:200</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;ASP.NET 4.5 and ASP.NET MVC 4 took an important step forward with the release of Visual Studio 2012.&lt;/p&gt;
&lt;p&gt; In addition to the new features and improved performance, the main direction seems to be bundling less namespaces in the core framework and more official libraries on NuGet.&lt;/p&gt;
&lt;p&gt;The main benefit of the new approach is the ability to update more code in an out-of-band release without being tied into the bi yearly .NET core release cycle.&lt;/p&gt;
&lt;p&gt;In other words: Microsoft and third party vendors can update releases on weekly basis, developers can then update the dedicated NuGet package and use the most current version of the library.&lt;/p&gt;
&lt;p&gt;Started writing an application with jQuery 1.6 and want to update? Just use the NuGet package manager to update to the latest jQuery version without manually replacing references.&lt;br /&gt;This new direction opened the door to try and integrate with some of the more popular platforms today. Facebook, Twitter, Yahoo, Google and Bing.&lt;/p&gt;
&lt;p&gt;All now have direct OAuth/OpenID integration from within .NET. If an API changes, an updated NuGet package can be released immediately.&lt;br /&gt;One of the components to add the new OAuth/OpenID integration is the membership provider, adding the most requested feature: &amp;ldquo;Log in With&amp;rdquo;. Developers can now add a &amp;ldquo;Login with Facebook&amp;rdquo; button to a site and use the native .NET OAuthWebSecurity.RegisterFacebookClient method to specify a Facebook application to use.&lt;br /&gt;Both MVC and Web Forms support the new functionality, however, they both go about it in different ways. Web Forms use the familiar membership provider classes and table scheme with the addition of the open source library DotNetOpenAuth and MVC is using a simpler and more flexible provider called SimpleMembershipProvider. For OAuth integration MVC 4 adds a class called OAuthWebSecurity and this class invokes DotNetOpenAuth. In fact if you create a new internet application and navigate into the AccountController, you can see the new classes in action.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5756.NuGet.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/5756.NuGet.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;There are many blog posts on how to use external clients in the login view so today I am going to take the integration one step forward.&lt;/p&gt;
&lt;p&gt;I am going to post actions of users that are logged into my site using Facebook into their wall. The site I am going to use is a live site and is located here: &lt;a target="_blank" href="http://yardsale-finder.com"&gt;http://yardsale-finder.com&lt;/a&gt; the idea being users list a yard sale, it shows up on the site and a post is showed on their Facebook timeline indicating they have just listed a new yard sale.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Let begin by adding our new application in Facebook&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4812.AppAdmin.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4812.AppAdmin.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Now that we registered our application and received an appId and an appSecret we can register the new login with our RegisterAuth&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: 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;RegisterAuth()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;FacebooksocialData&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;object&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;FacebooksocialData.Add(&lt;span style="color: #a31515;"&gt;"Icon"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"/Images/fb.png"&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;OAuthWebSecurity.RegisterFacebookClient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;appId:&amp;nbsp;FacebookHelper.appId,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;appSecret:&amp;nbsp;FacebookHelper.appSecret,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;displayName:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"Facebook"&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;extraData:&amp;nbsp;FacebooksocialData);
&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;Notice we also added an image in order to replace the default login button with a nice Facebook icon.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7026.UseFacebookToLogIn.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7026.UseFacebookToLogIn.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Next let&amp;rsquo;s navigate to ExternalLoginCallback in AccountController. This method uses the OAuthWebSecurity and will generate all of the underlying pluming of OAuth. In this method I added two lines of code:&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;&amp;nbsp;AuthenticationResult&amp;nbsp;result&amp;nbsp;=&amp;nbsp;OAuthWebSecurity.VerifyAuthentication(Url.Action(&lt;span style="color: #a31515;"&gt;"ExternalLoginCallback"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;{&amp;nbsp;ReturnUrl&amp;nbsp;=&amp;nbsp;returnUrl&amp;nbsp;}));
&amp;nbsp;&amp;nbsp;&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;(!result.IsSuccessful)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;RedirectToAction(&lt;span style="color: #a31515;"&gt;"ExternalLoginFailure"&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: green;"&gt;//&amp;nbsp;Save&amp;nbsp;the&amp;nbsp;accesstoken&amp;nbsp;into&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;Session[&lt;span style="color: #a31515;"&gt;"accesstoken"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;result.ExtraData[&lt;span style="color: #a31515;"&gt;"accesstoken"&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;Session[&lt;span style="color: #a31515;"&gt;"id"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;result.ExtraData[&lt;span style="color: #a31515;"&gt;"id"&lt;/span&gt;];&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Since the default OAuth process returns information in the provider redirect, we simply collect it into a session. We will need the id and accesstoken in order to further communicate with Facebook&amp;rsquo;s API.&lt;br /&gt;As a user creates a new yard sale listing we can give then a choice: if they have logged in using their Facebook account, let&amp;rsquo;s ask them if they wish to publish the new listing into Facebook:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6574.SubmitToFacebookCheckbox.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/6574.SubmitToFacebookCheckbox.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&lt;span style="background: yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(Session[&lt;span style="color: #a31515;"&gt;"accesstoken"&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;&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;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"editor-label"&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;label&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;for&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"addToFacebook"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Submit&amp;nbsp;to&amp;nbsp;Facebook?&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;label&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;div&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;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"editor-field"&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="background: yellow;"&gt;@&lt;/span&gt;Html.CheckBox(&lt;span style="color: #a31515;"&gt;"addToFacebook"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;{&amp;nbsp;data_val&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"true"&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;div&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;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;If they have checked the &amp;ldquo;Submit to Facebook&amp;rdquo; button we can call the Facebook API using the accesstoken we collected into the session&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;[HttpPost]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ValidateAntiForgeryToken]
&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;ActionResult&amp;nbsp;Create(UserYardsale&amp;nbsp;useryardsale,&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;longitude,&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;latitude,&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;addToFacebook&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useryardsale.UserId&amp;nbsp;=&amp;nbsp;WebSecurity.CurrentUserId;
&amp;nbsp;&amp;nbsp;&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;newYardsaleLocation&amp;nbsp;=&amp;nbsp;DbGeography.PointFromText(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"POINT({0}&amp;nbsp;{1})"&lt;/span&gt;,&amp;nbsp;longitude,&amp;nbsp;latitude),&amp;nbsp;DbGeography.DefaultCoordinateSystemId);
 
&amp;nbsp;&amp;nbsp;&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;(!newYardsaleLocation.IsEmpty&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;ModelState.IsValid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useryardsale.Location&amp;nbsp;=&amp;nbsp;newYardsaleLocation;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.UserYardsales.Add(useryardsale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;(addToFacebook)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FacebookHelper&amp;nbsp;facebook&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;FacebookHelper();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;facebook.PostToFacebook();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;RedirectToAction(&lt;span style="color: #a31515;"&gt;"Index"&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;View(useryardsale);
&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 we make a call to graph.facebook.com, the new status will show up on the user&amp;rsquo;s wall.&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: blue;"&gt;public&lt;/span&gt;&amp;nbsp;async&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;PostToFacebook()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;properties&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;string&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;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;"access_token"&lt;/span&gt;,&amp;nbsp;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;)HttpContext.Current.Session[&lt;span style="color: #a31515;"&gt;"accesstoken"&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: #a31515;"&gt;"message"&lt;/span&gt;,&amp;nbsp;&amp;nbsp;WebSecurity.CurrentUserName&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"&amp;nbsp;Have&amp;nbsp;listed&amp;nbsp;a&amp;nbsp;new&amp;nbsp;Yardsale&amp;nbsp;on&amp;nbsp;http://yardsale-finder.com"&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;FormUrlEncodedContent&amp;nbsp;authentication&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;FormUrlEncodedContent(properties);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpClient&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;HttpClient();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpResponseMessage&amp;nbsp;response&amp;nbsp;=&amp;nbsp;await&amp;nbsp;client.PostAsync(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"https://graph.facebook.com/{0}/feed"&lt;/span&gt;,&amp;nbsp;HttpContext.Current.Session[&lt;span style="color: #a31515;"&gt;"id"&lt;/span&gt;]),&amp;nbsp;authentication);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.EnsureSuccessStatusCode();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;result&amp;nbsp;=&amp;nbsp;await&amp;nbsp;response.Content.ReadAsAsync&amp;lt;&lt;span style="color: blue;"&gt;dynamic&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;}
&amp;nbsp;&amp;nbsp;&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;}&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7140.StatusOnFacebookFeed.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7140.StatusOnFacebookFeed.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;.NET 4.5 is indeed a very large step forward in incorporating more parts of the eco system we currently use online. The extensive use of NuGet allows developers to update applications in a rate that was until now reserved for open source libraries and in house development.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;In a few simple steps, we managed to set up deep integration with Facebook that is surly to benefit our users and add to the viral value of our application.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=200" width="1" height="1"&gt;</description><category domain="http://galratner.com/blogs/net/archive/tags/MVC/default.aspx">MVC</category><category domain="http://galratner.com/blogs/net/archive/tags/Facebook/default.aspx">Facebook</category><category domain="http://galratner.com/blogs/net/archive/tags/OAuth/default.aspx">OAuth</category></item><item><title>Introducing the Inverted Software Data Block. Simple ADO.NET to objects with no boilerplate code</title><link>http://galratner.com/blogs/net/archive/2012/06/08/introducing-the-inverted-software-data-block-simple-ado-net-to-objects-with-no-boilerplate-code.aspx</link><pubDate>Fri, 08 Jun 2012 17:24:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:199</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I get asked many times by readers that have read &lt;a target="_blank" href="http://galratner.com/blogs/net/archive/2009/07/09/to-o-r-map-or-not-to-o-r-map-the-data-layer-debate.aspx"&gt;To O/R Map or not to O/R Map - The Data Layer debate&lt;/a&gt; what framework I use and recommend when coding high volume systems. I always send them to &lt;a target="_blank" href="http://galratner.com/blogs/net/archive/2009/11/08/move-a-datareader-to-an-object-with-reflection-revisited.aspx"&gt;Move a DataReader to an Object with reflection Revisited&lt;/a&gt;, but the truth is that article contains only a partial answer.&lt;/p&gt;
&lt;p&gt; Sure you can use dynamic records, static reflection and many more techniques, but to truly make a system fast, you need to cache anything you can in memory, avoid complexity, keep Big O notation to a minimum and in general just go with a &amp;ldquo;less is better&amp;rdquo; attitude.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;I therefore decided to skip to the bottom line of this article and show you what I use and how I use it.&lt;/p&gt;
&lt;p&gt;After you got a sense of how easy it is to work with the Inverted Software DataBlock, I shell break down the framework into the underlying components.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Using the DataBlock&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Getting an object from the output of a stored procedure:&lt;/b&gt;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;nbsp;customer&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CRUDHelper&lt;/span&gt;.GetObject&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(parameters,&amp;nbsp;generator,&amp;nbsp;sprocName,&amp;nbsp;stringConnection);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting a list of objects:&lt;/b&gt;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:#2b91af;"&gt;List&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:#2b91af;"&gt;CRUDHelper&lt;/span&gt;.GetObjectList&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(generator,&amp;nbsp;sprocName,&amp;nbsp;stringConnection);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting a paged list of objects:&lt;/b&gt;&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:#2b91af;"&gt;List&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:#2b91af;"&gt;CRUDHelper&lt;/span&gt;.GetObjectList&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(generator,&amp;nbsp;pageIndex,&amp;nbsp;rowsPerPage,&amp;nbsp;sprocName,&amp;nbsp;stringConnection,&amp;nbsp;&lt;span style="color:blue;"&gt;out&lt;/span&gt;&amp;nbsp;virtualTotal);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Updating a stored procedure from an object:&lt;/b&gt;&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;CRUDHelper&lt;/span&gt;.UpdateObject&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(objectToUpdate,&amp;nbsp;sprocName,&amp;nbsp;stringConnection);
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;A generator will be a function that creates a customer 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:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;&amp;nbsp;generator&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;();
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;An older version of the Block was using Activator.CreateInstance&amp;lt;T&amp;gt;() which has proven to be far too slow.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;This is my Customer object:&lt;/b&gt;&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: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;Customer&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;CrudField&lt;/span&gt;(UsedFor&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Delete&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Read&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Update)]
&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;int&lt;/span&gt;&amp;nbsp;CustomerID&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;CrudField&lt;/span&gt;(UsedFor&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Read&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Update&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Create)]
&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;Name&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;CrudField&lt;/span&gt;(UsedFor&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Read&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Update&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Create)]
&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;Email&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;CrudField&lt;/span&gt;(UsedFor&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Read&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Update&amp;nbsp;|&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CrudFieldType&lt;/span&gt;.Create)]
&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;Active&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;It is simply a POCO object with an attribute, signaling the DataBlock how to use its properties.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The block also includes two convenience methods:&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;CRUDHelper&lt;/span&gt;.UpdateRecord(parameters,&amp;nbsp;sprocName,&amp;nbsp;stringConnection);
&lt;span style="color: #2b91af;"&gt;CRUDHelper&lt;/span&gt;.DeleteRecord(rowID,&amp;nbsp;parameterName,&amp;nbsp;sprocName,&amp;nbsp;stringConnection);&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;When parameters is a Dictionary&amp;lt;string, object&amp;gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Now that you know how to use the Inverted Software DataBlock let&amp;rsquo;s see how it&amp;rsquo;s built:&lt;/b&gt;&lt;br /&gt;There are only six files making up the Block:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;CrudField .cs&lt;/b&gt; Contains a custom attribute, signaling the Block what property is used in what operation type.&lt;br /&gt;&lt;b&gt;CRUDHelper.cs&lt;/b&gt; This is the main class and the entry point to the Block.&lt;br /&gt;&lt;b&gt;DataBlockException.cs&lt;/b&gt; Defines a custom exception the Block will throw on errors.&lt;br /&gt;&lt;b&gt;ObjectHelper.cs&lt;/b&gt; Contains cached information about objects properties, attributes and stored procedures output.&lt;br /&gt;&lt;b&gt;ObjectPool.cs&lt;/b&gt; Was taken from the ParallelExtensionsExtras to help with SQLCommands creation.&lt;br /&gt;&lt;b&gt;SQLHelper.cs&lt;/b&gt; A takeoff from the original PetShop example SQLHelper. Although this class does not resemble the original Microsoft example, it still contains basic ADO.NET code.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;There is no magic here, just highly optimized code. For example: let&amp;rsquo;s look at a function in ObjectHelper:&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: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;GetColumnNames(&lt;span style="color: #2b91af;"&gt;SqlDataReader&lt;/span&gt;&amp;nbsp;reader,&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;sprocName)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;QueryColumnNamesCache.GetOrAdd(sprocName,&amp;nbsp;(key)&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;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;columnNames&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;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Data.&lt;span style="color: #2b91af;"&gt;DataTable&lt;/span&gt;&amp;nbsp;readerSchema&amp;nbsp;=&amp;nbsp;reader.GetSchemaTable();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;readerSchema.Rows.Count;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columnNames.Add(readerSchema.Rows[i][&lt;span style="color: #a31515;"&gt;"ColumnName"&lt;/span&gt;].ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;columnNames;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;&lt;br /&gt;This function keeps a query&amp;rsquo;s list of output fields in memory and is used to iterate thought an object&amp;rsquo;s properties in order to load field to property by matching their names.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;I have attached the complete source code to this article and you can feel free to download and use it in your systems.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;If you simply want to use the final product, please install the &lt;a target="_blank" href="http://nuget.org/packages/InvertedSoftware.DataBlock"&gt;Nuget Package&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: I would like to thank &lt;a target="_blank" href="http://www.linkedin.com/in/alexandrubotez"&gt;Alexandru Botez&lt;/a&gt; for his help with the Emit magic in ObjectHelper.cs&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://galratner.com/aggbug.aspx?PostID=199" width="1" height="1"&gt;</description><enclosure url="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.01.99/InvertedSoftware.DataBlock.zip" length="176463" type="application/x-zip-compressed" /><category domain="http://galratner.com/blogs/net/archive/tags/ADO.NET/default.aspx">ADO.NET</category></item><item><title>Using ASP.NET MVC 4, ApiControllers and SQL Server 2012 to find the best cup of coffee in Seattle</title><link>http://galratner.com/blogs/net/archive/2012/05/22/using-asp-net-mvc-4-apicontrollers-and-sql-server-2012-to-find-the-best-cup-of-coffee-in-seattle.aspx</link><pubDate>Tue, 22 May 2012 19:27:00 GMT</pubDate><guid isPermaLink="false">53e8f97d-af75-47ac-95ce-2ee2598c2e52:198</guid><dc:creator>Gal Ratner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;ASP.NET MVC continues to innovate and in its current version (4) it offers support for Web APIs. Today we are going to examine a real life scenario of using Web APIs along with MVC 4 as we are utilizing the Google Earth plug-in to mark a defined area and SQL Server 2012 geography type to help us persist and calculate GIS data.&lt;br /&gt;In our example we are going to mark an area on the globe using a polygon, calculate the center of the area, find all of the coffee shops closest to the center of the area and arrange them by distance. We are going to mark them on the map as well as show a full list including ranking.&lt;br /&gt;Before we begin, let&amp;rsquo;s briefly go over the technologies we are going to use today:&lt;br /&gt;&lt;b&gt;ASP.NET Web API&lt;/b&gt;&lt;br /&gt;Formally known as the WCF Web API this was a community driven project hosted on Codeplex (&lt;a target="_blank" href="http://wcf.codeplex.com/wikipage?title=WCF%20HTTP"&gt;http://wcf.codeplex.com/wikipage?title=WCF%20HTTP&lt;/a&gt;). It was created to allow direct control over HTTP based communication between client and server applications. Its simplicity and compatibility for working within applications built with a RESTful architecture helped it gain popularity and find its way into the .NET 4.5 Framework under the namespace System.Net.Http.&lt;br /&gt;There are lots of tutorials online about using the Web API and you can start learning it by going here: &lt;a target="_blank" href="http://www.asp.net/web-api"&gt;http://www.asp.net/web-api&lt;/a&gt;&lt;br /&gt;&lt;b&gt;ApiController&lt;/b&gt;&lt;br /&gt;Residing in System.Web.Http, APIControllers utilize System.Net.Http to handle HTTP verbs and map them into methods. A GET verb will be mapped to a Get() method, POST to Post() and so on. Using client JavaScript libraries we are able to build a RESTful application fairly quickly with the default controller mapping. More on ApiController here: &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Knockout.js&lt;/b&gt;&lt;br /&gt;A part of MVC 4, Knockout is a handy MVVM style JavaScript library and is designed for mobile and responsive applications. The library helps with binding of underlying data models to UI elements and templates and reflects changes to the data by updating the UI. There are many more features to Knockout, however, we are going to use it today to show a simple coffee shop list. More on Knockout can be found here: &lt;a target="_blank" href="http://knockoutjs.com/"&gt;http://knockoutjs.com/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;SQL Server 2012 geography&lt;/b&gt;&lt;br /&gt;I have blogged about SQL geography in the past with SQL Server 2008 R2 (&lt;a target="_blank" href="http://galratner.com/blogs/net/archive/2011/05/14/spatial-search-made-easy-with-google-maps-api-and-sql-server-2008.aspx"&gt;http://galratner.com/blogs/net/archive/2011/05/14/spatial-search-made-easy-with-google-maps-api-and-sql-server-2008.aspx&lt;/a&gt;). SQL Server 2012 adds more features to its geography and geometry spatial types such as circular strings, curve polygons, and compound curves. In addition it has spatial index improvements, new and updated methods and aggregates for all types and much more.&lt;br /&gt;&lt;b&gt;Google Earth API&lt;/b&gt;&lt;br /&gt;Almost everybody is familiar with Google Earth. The Earth plug-in has an excellent API here: &lt;a target="_blank" href="https://developers.google.com/earth/"&gt;https://developers.google.com/earth/&lt;/a&gt; and is JavaScript based. In today&amp;rsquo;s example I am going to make extensive use of its features to draw a polygon, fly to location and add placemarks.&lt;br /&gt;&lt;b&gt;Google Places API&lt;/b&gt;&lt;br /&gt;Google Places is the equivalent of Yelp.com. It is a global business database and has an API that supports HTTPS REST queries. The API&amp;rsquo;s documentation can be found here: &lt;a target="_blank" href="https://developers.google.com/maps/documentation/places/"&gt;https://developers.google.com/maps/documentation/places/&lt;/a&gt;. An API key is needed and is provided for free by Google. We are going to use the Places API to query for all the coffee shops in a defined location.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Starting our example&lt;/b&gt;&lt;br /&gt;Visual Studio 2011 comes with MVC 4 already baked in. As I am writing this post it is still in beta (5/2012) so we are going to use Visual Studio 2010 along with its version of MVC 4. It includes almost everything we need and works with .NET 4.0. You can download the installer here: &lt;a target="_blank" href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=28942"&gt;http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=28942&lt;/a&gt;&lt;br /&gt;After installing MVC 4 we are going to create a new Web API project&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4431.NewWebApiProject.png"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/4431.NewWebApiProject.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Under the Controllers folder you will notice a new ApiController named ValuesController. This controller will be our base when communicating with the Earth plug-in.&lt;br /&gt;First let&amp;rsquo;s navigate to the Index.cshtml and lay out our earth on the screen: We will add an earth div to the html and instantiation JavaScript functions.&lt;br /&gt;HTML: &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;"map3d"&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;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;700px&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;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;100%&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;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JavaScript:&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;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/knockout-2.0.0.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&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;&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://www.google.com/jsapi"&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;meta&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;"viewport"&lt;/span&gt;&amp;nbsp;&lt;span style="color: red;"&gt;content&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"width=device-width"&lt;/span&gt;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;ge;&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;viewModel;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Our&amp;nbsp;knockout.js&amp;nbsp;model&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;google.load(&lt;span style="color: maroon;"&gt;"earth"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: maroon;"&gt;"1"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;google.load(&lt;span style="color: maroon;"&gt;"maps"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: maroon;"&gt;"2"&lt;/span&gt;);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;init()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;google.earth.createInstance(&lt;span style="color: maroon;"&gt;'map3d'&lt;/span&gt;,&amp;nbsp;initCB,&amp;nbsp;failureCB);
&amp;nbsp;&amp;nbsp;&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;initCB(instance)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge&amp;nbsp;=&amp;nbsp;instance;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge.getWindow().setVisibility(&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;ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);
&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;Create&amp;nbsp;an&amp;nbsp;initial&amp;nbsp;Look&amp;nbsp;of&amp;nbsp;the&amp;nbsp;earth&lt;/span&gt;
&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;la&amp;nbsp;=&amp;nbsp;ge.createLookAt(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;la.set(&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Model.Latitude,&amp;nbsp;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Model.Longitude,&amp;nbsp;0,&amp;nbsp;ge.ALTITUDE_RELATIVE_TO_GROUND,&amp;nbsp;-8.541,&amp;nbsp;66.213,&amp;nbsp;2000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge.getView().setAbstractView(la);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewModel&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CoffeeLocations:&amp;nbsp;ko.observableArray([])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ko.applyBindings(viewModel);
&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;Add&amp;nbsp;the&amp;nbsp;polygon&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;the&amp;nbsp;database&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddPolygon();
&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;Search&amp;nbsp;and&amp;nbsp;show&amp;nbsp;all&amp;nbsp;coffee&amp;nbsp;shops&amp;nbsp;as&amp;nbsp;placemarks&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetCoffeeLocations();
&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;Listen&amp;nbsp;for&amp;nbsp;mousemove&amp;nbsp;on&amp;nbsp;the&amp;nbsp;globe.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;google.earth.addEventListener(ge.getGlobe(),&amp;nbsp;&lt;span style="color: maroon;"&gt;'mouseup'&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(event)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.preventDefault();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getPolygonBorder().getCoordinates().pushLatLngAlt(event.getLatitude(),&amp;nbsp;event.getLongitude(),&amp;nbsp;100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&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;failureCB(errorCode)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;flyToLocation()&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;geocodeLocation&amp;nbsp;=&amp;nbsp;document.getElementById(&lt;span style="color: maroon;"&gt;'Location'&lt;/span&gt;).value;
&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.ClientGeocoder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;geocoder.getLatLng(geocodeLocation,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;(point)&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;(point)&amp;nbsp;{
&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;lookAt&amp;nbsp;=&amp;nbsp;ge.createLookAt(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lookAt.set(point.y,&amp;nbsp;point.x,&amp;nbsp;10,&amp;nbsp;ge.ALTITUDE_RELATIVE_TO_GROUND,&amp;nbsp;-8.541,&amp;nbsp;66.213,&amp;nbsp;2000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge.getView().setAbstractView(lookAt);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;google.setOnLoadCallback(init);
&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;&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;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/EarthFunctions.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&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;&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;&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;"&lt;/span&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;&lt;span style="color: blue;"&gt;Url&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: blue;"&gt;Content&lt;/span&gt;&lt;span style="color: blue;"&gt;(&lt;/span&gt;&lt;span style="color: #a31515;"&gt;"~/Scripts/PlacesFunctions.js"&lt;/span&gt;&lt;span style="color: blue;"&gt;)"&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;&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;After we instantiated the earth and directed it to start at a location, we can add our database and data layer.&lt;br /&gt;Our database will be simple. We will use table Location to hold the information&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2654.TableLocation.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/2654.TableLocation.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Now let&amp;rsquo;s make the stored procedures we need in order to get and update the data:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;CREATE PROCEDURE [dbo].[GetLocationText] &lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET NOCOUNT ON;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT TOP 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LocationText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Location&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE [dbo].[UpdateLocation] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @LocationText VARCHAR(MAX)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET NOCOUNT ON;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF NOT EXISTS(SELECT 1 FROM Location)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO&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; Location (LocationValue)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; VALUES&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; (geography::STGeomFromText(@LocationText, 4326))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; UPDATE&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; Location&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SET&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; LocationValue = (geography::STGeomFromText(@LocationText, 4326))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;UpdateLocation will update the location using a text representation of the polygon we want to save.&lt;br /&gt;Finally we need to be able to find the center of our polygon.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;CREATE PROCEDURE [dbo].[GetLocationCenter] &lt;br /&gt;&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET NOCOUNT ON;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @g geometry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @p VARCHAR(MAX);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @p = (SELECT TOP 1 LocationText FROM Location)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @g = geometry::STGeomFromText(@p, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @g.STCentroid().ToString();&lt;br /&gt;END&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Notice we converted our geography type to simple geometry and used STCentroid() to calculate its center.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;After we built our database we need to build the data layer. There is nothing smart here, just the same boilerplate code we always use for CRUD operations so I am going to skip this step. If you are interested in seeing the DAL code I have attached the complete example to the bottom of this tutorial and you can download and run it on your own.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Building the controllers&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We will be using the ValuesController and adding a PlacesController to show all of the coffee shops.&lt;br /&gt;Our ValuesController will have two methods: one to get our polygon from the database and one to save it. Here is the code for the ValuesController:&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;using&lt;/span&gt;&amp;nbsp;System;
&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.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.Net;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Net.Http;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Http;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text.RegularExpressions;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;WebAPIExample.Models;
 
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;WebAPIExample.Controllers
{
&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;ValuesController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ApiController&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;GET&amp;nbsp;/api/values&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: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;GlobalPoint&lt;/span&gt;&amp;gt;&amp;nbsp;Get()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;GlobalPoint&lt;/span&gt;&amp;gt;&amp;nbsp;myPolygon&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;GlobalPoint&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;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;string&lt;/span&gt;&amp;nbsp;AreaWKT&amp;nbsp;=&amp;nbsp;DAL.&lt;span style="color: #2b91af;"&gt;Database&lt;/span&gt;.GetLocationText();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;pattern&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;@"[-+]?[0-9]*\.?[0-9]+"&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;MatchCollection&lt;/span&gt;&amp;nbsp;matches&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Regex&lt;/span&gt;.Matches(AreaWKT,&amp;nbsp;pattern);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;matches.Count;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myPolygon.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;GlobalPoint&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;Longitude&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(matches[i].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;Latitude&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(matches[++i].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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&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;&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;HttpResponseException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Error&amp;nbsp;Getting&amp;nbsp;polygon"&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;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;myPolygon;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;POST&amp;nbsp;/api/values&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: #2b91af;"&gt;HttpResponseMessage&lt;/span&gt;&amp;nbsp;Post(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;ShapePoints)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;Validate&amp;nbsp;input&amp;nbsp;and&amp;nbsp;concatenate&amp;nbsp;a&amp;nbsp;Polygon&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;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: #2b91af;"&gt;StringBuilder&lt;/span&gt;&amp;nbsp;polygon&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;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygon.Append(&lt;span style="color: #a31515;"&gt;"POLYGON(("&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;points&amp;nbsp;=&amp;nbsp;ShapePoints.Split(&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;&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;points.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;double&lt;/span&gt;&amp;nbsp;latitude&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;longitude&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;double&lt;/span&gt;.TryParse(points[i],&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&amp;nbsp;latitude)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;.TryParse(points[++i],&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygon.Append(longitude&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;latitude&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: green;"&gt;//&amp;nbsp;Make&amp;nbsp;sure&amp;nbsp;the&amp;nbsp;last&amp;nbsp;latitude&amp;nbsp;and&amp;nbsp;longitude&amp;nbsp;close&amp;nbsp;the&amp;nbsp;polygon&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;(points[0]&amp;nbsp;!=&amp;nbsp;points[points.Length&amp;nbsp;-&amp;nbsp;2]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;points[1]&amp;nbsp;!=&amp;nbsp;points[points.Length&amp;nbsp;-&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;polygon.Append(&lt;span style="color: blue;"&gt;double&lt;/span&gt;.Parse(points[1])&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;.Parse(points[0])&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;polygon.Replace(&lt;span style="color: #a31515;"&gt;","&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #a31515;"&gt;"))"&lt;/span&gt;,&amp;nbsp;polygon.Length&amp;nbsp;-&amp;nbsp;1,&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;&lt;span style="color: green;"&gt;//&amp;nbsp;Save&amp;nbsp;to&amp;nbsp;database&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;DAL.&lt;span style="color: #2b91af;"&gt;Database&lt;/span&gt;.UpdateLocation(polygon.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&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;&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;HttpResponseException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Error&amp;nbsp;Saving&amp;nbsp;Map"&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;&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;HttpResponseMessage&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;HttpStatusCode&lt;/span&gt;.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;}
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Notice that in order to save the polygon we need a collection of points containing the latitude and longitude of its corners. We are going to use them to concatenate a Well-known text (WKT) formatted string used to describe vector geometry objects. We can then convert our WKT polygon to a geography type by using STGeomFromText in our stored procedure.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;After we built the controller we can now use it to draw and save our polygon. The code to do that is written entirely in JavaScript and looks like:&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;function&lt;/span&gt;&amp;nbsp;AddPolygon()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Create&amp;nbsp;the&amp;nbsp;placemark.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;polygonPlacemark&amp;nbsp;=&amp;nbsp;ge.createPlacemark(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Create&amp;nbsp;the&amp;nbsp;polygon.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;polygon&amp;nbsp;=&amp;nbsp;ge.createPolygon(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygon.setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygonPlacemark.setGeometry(polygon);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Add&amp;nbsp;points&amp;nbsp;for&amp;nbsp;the&amp;nbsp;outer&amp;nbsp;shape.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;border&amp;nbsp;=&amp;nbsp;ge.createLinearRing(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border.setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddPolygonCoordinates(border);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygon.setOuterBoundary(border);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//Create&amp;nbsp;a&amp;nbsp;style&amp;nbsp;and&amp;nbsp;set&amp;nbsp;width&amp;nbsp;and&amp;nbsp;color&amp;nbsp;of&amp;nbsp;line&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygonPlacemark.setStyleSelector(ge.createStyle(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;lineStyle&amp;nbsp;=&amp;nbsp;polygonPlacemark.getStyleSelector().getLineStyle();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygonPlacemark.getStyleSelector().getPolyStyle().setFill(0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lineStyle.setWidth(5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lineStyle.getColor().set(&lt;span style="color: maroon;"&gt;'9900ffff'&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Add&amp;nbsp;the&amp;nbsp;placemark&amp;nbsp;to&amp;nbsp;Earth.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge.getFeatures().appendChild(polygonPlacemark);
}
 
&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;AddPolygonCoordinates(border)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.getJSON(&lt;span style="color: maroon;"&gt;"/api/values"&lt;/span&gt;,&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;$.each(data,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(i,&amp;nbsp;ltem)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border.getCoordinates().pushLatLngAlt(ltem.lat,&amp;nbsp;ltem.lng,&amp;nbsp;100);
&amp;nbsp;&amp;nbsp;&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;clearMap()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewModel.CoffeeLocations([]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;features&amp;nbsp;=&amp;nbsp;ge.getFeatures();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;features.getFirstChild().getGeometry().getOuterBoundary().getCoordinates().clear();
}
 
&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;saveMap()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;features&amp;nbsp;=&amp;nbsp;ge.getFeatures();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;points&amp;nbsp;=&amp;nbsp;features.getFirstChild().getGeometry().getOuterBoundary().getCoordinates();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;polygonPoints&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;''&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;points.getLength();&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;polygonPoints&amp;nbsp;+=&amp;nbsp;points.get(i).getLatitude()&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"|"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;points.get(i).getLongitude()&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"|"&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.post(&lt;span style="color: maroon;"&gt;'/api/values'&lt;/span&gt;,&amp;nbsp;{ShapePoints&amp;nbsp;:&amp;nbsp;polygonPoints},&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;$(&lt;span style="color: maroon;"&gt;'#message'&lt;/span&gt;).html(&lt;span style="color: maroon;"&gt;"Map&amp;nbsp;Saved"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
}
 
&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;getPolygonBorder()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;features&amp;nbsp;=&amp;nbsp;ge.getFeatures();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;features.getFirstChild().getGeometry().getOuterBoundary();
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;$.getJSON("/api/values") is a jQuery function that simply makes a GET request to the controller and gets our list of points as JSON. Adding them to the map is simple: border.getCoordinates().pushLatLngAlt(ltem.lat, ltem.lng, 100);&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We have also added a function to clear the map in case we need to create a new polygon.&lt;br /&gt;Now that we have the code to get, update and show our polygon on Google earth lets search for close coffee shops!&lt;br /&gt;We will use a PlacesController and make a simple call to Google Places with the center of our area as a starting point:&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;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.Net.Http;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Http;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Json;
&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;WebAPIExample.Models;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text.RegularExpressions;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;WebAPIExample.Controllers
{
&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;PlacesController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ApiController&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;APIKey&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"your API Key"&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;GET&amp;nbsp;/api/places&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: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Place&lt;/span&gt;&amp;gt;&amp;nbsp;Get()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;Place&lt;/span&gt;&amp;gt;&amp;nbsp;places&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;Place&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: #2b91af;"&gt;GlobalPoint&lt;/span&gt;&amp;nbsp;centerPoint&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Utils&lt;/span&gt;.GetCenter();
&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;requestURL&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"https://maps.googleapis.com/maps/api/place/search/json?key={0}&amp;amp;location={1}&amp;amp;rankby=distance&amp;amp;types=cafe|bakery&amp;amp;sensor=false"&lt;/span&gt;,&amp;nbsp;APIKey,&amp;nbsp;centerPoint.Latitude&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;","&lt;/span&gt;&amp;nbsp;+&amp;nbsp;centerPoint.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;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;client.DownloadString(requestURL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;placesResponse&amp;nbsp;=&amp;nbsp;System.Web.Helpers.&lt;span style="color: #2b91af;"&gt;Json&lt;/span&gt;.Decode(results);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;result&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;placesResponse.results)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;places.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Place&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;Name&amp;nbsp;=&amp;nbsp;result.name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Rating&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToString(result.rating),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(result.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Longitude&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToDouble(result.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;places;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Now that we have our controller already returning a list of coffee shops we need to show them on the map and bind them to a list along with their ratings:&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;function&lt;/span&gt;&amp;nbsp;GetCoffeeLocations()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.getJSON(&lt;span style="color: maroon;"&gt;"/api/places"&lt;/span&gt;,&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;viewModel.CoffeeLocations(data);&amp;nbsp;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Bind&amp;nbsp;the&amp;nbsp;model&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.each(data,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&amp;nbsp;(i,&amp;nbsp;ltem)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&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;Create&amp;nbsp;the&amp;nbsp;placemark.&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;placemark&amp;nbsp;=&amp;nbsp;ge.createPlacemark(&lt;span style="color: maroon;"&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;placemark.setName(ltem.name);
&amp;nbsp;&amp;nbsp;&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;Set&amp;nbsp;the&amp;nbsp;placemark's&amp;nbsp;location.&amp;nbsp;&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: blue;"&gt;var&lt;/span&gt;&amp;nbsp;point&amp;nbsp;=&amp;nbsp;ge.createPoint(&lt;span style="color: maroon;"&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;point.setLatitude(ltem.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;point.setLongitude(ltem.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;placemark.setGeometry(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;&lt;span style="color: darkgreen;"&gt;//&amp;nbsp;Add&amp;nbsp;the&amp;nbsp;placemark&amp;nbsp;to&amp;nbsp;Earth.&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;ge.getFeatures().appendChild(placemark);
&amp;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;&lt;br /&gt;Let&amp;rsquo;s add a knockout.js HTML template at the bottom of the map in order to show the list:&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;&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;data-bind&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"template:&amp;nbsp;{&amp;nbsp;name:&amp;nbsp;'point-template',&amp;nbsp;foreach:&amp;nbsp;viewModel.CoffeeLocations}"&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;&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/html"&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;"point-template"&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;lt;span&amp;nbsp;data-bind="text:&amp;nbsp;name"&amp;gt;&amp;lt;/span&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;(Rated:&amp;nbsp;&amp;lt;span&amp;nbsp;data-bind="text:&amp;nbsp;rating"&amp;gt;&amp;lt;/span&amp;gt;)&amp;lt;br&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;&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;Putting is together&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Great! We are almost done. Just some minor enhancements to the UI to allow some &amp;ldquo;fly to&amp;rdquo; functionality and we are ready to aim the map to our favorite city!&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;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;"FlyButton"&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;"Fly&amp;nbsp;Here"&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;"flyToLocation();"&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;function&lt;/span&gt;&amp;nbsp;flyToLocation()&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;geocodeLocation&amp;nbsp;=&amp;nbsp;document.getElementById(&lt;span style="color: maroon;"&gt;'Location'&lt;/span&gt;).value;
&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.ClientGeocoder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;geocoder.getLatLng(geocodeLocation,&amp;nbsp;&lt;span style="color: blue;"&gt;function&lt;/span&gt;(point)&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;(point)&amp;nbsp;{
&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;lookAt&amp;nbsp;=&amp;nbsp;ge.createLookAt(&lt;span style="color: maroon;"&gt;''&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lookAt.set(point.y,&amp;nbsp;point.x,&amp;nbsp;10,&amp;nbsp;ge.ALTITUDE_RELATIVE_TO_GROUND,&amp;nbsp;-8.541,&amp;nbsp;66.213,&amp;nbsp;2000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ge.getView().setAbstractView(lookAt);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;That&amp;rsquo;s it! If everything went to plan we should be looking at a complete map and list that looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7026.MapComplete.PNG"&gt;&lt;img src="http://galratner.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/net/7026.MapComplete.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;It will show our polygon, coffee shops as place marks and a bottom list which includes names and ratings.&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;In this example we have put together a real life application that can be used as a part of any GIS aware product. We have seen how simple the Web API can be and how powerful the features of SQL Server geography are. The edition of some new slick client side frameworks such as knockout and the Google earth plug-in API helped us create an appealing and responsive user interface with minimal effort.&lt;br /&gt;Don&amp;rsquo;t forget to download the attached code and experiment with it yourself.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Happy Coding!&lt;/p&gt;
&lt;p&gt;&lt;a rev="vote-for" href="http://dotnetshoutout.com/Using-ASPNET-MVC-4-ApiControllers-and-SQL-Server-2012-to-find-the-best-cup-of-coffee-in-Seattle"&gt;&lt;img src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fgalratner.com%2Fblogs%2Fnet%2Farchive%2F2012%2F05%2F22%2Fusing-asp-net-mvc-4-apicontrollers-and-sql-server-2012-to-find-the-best-cup-of-coffee-in-seattle.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=198" width="1" height="1"&gt;</description><enclosure url="http://galratner.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.01.98/WebAPIExample.zip" length="2144680" type="application/x-zip-compressed" /><category domain="http://galratner.com/blogs/net/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://galratner.com/blogs/net/archive/tags/MVC+4/default.aspx">MVC 4</category><category domain="http://galratner.com/blogs/net/archive/tags/Google+Earth/default.aspx">Google Earth</category><category domain="http://galratner.com/blogs/net/archive/tags/Genericoogle+Places/default.aspx">Genericoogle Places</category><category domain="http://galratner.com/blogs/net/archive/tags/Web+API/default.aspx">Web API</category></item><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></channel></rss>