Windows Azure http://rickgaribay.net/category/43.aspx Windows Azure en-US Rick G. Garibay rickgaribay@hotmail.com Subtext Version 1.9.5.176 Configuring Custom Domain Names on Windows Azure Websites in 4 Easy Steps http://rickgaribay.net/archive/2014/02/26/configuring-custom-domain-names-on-windows-azure-websites-in-4.aspx <p>Windows Azure Websites (WAWS) provides a very robust, yet easy to use container for hosting your web applications. This doesn’t just pertain to ASP.NET apps, but includes several templates like Drupal, Wordpress, Orchard, etc. and also provides very nice first class support for Node.js web apps/APIs, PHP and Python. </p> <p>If you are new to WAWS, you may think ‘big deal, this is just another web host’. You would be wrong. There is a TON of value that you get with WAWS that blows your congenital, commodity web hosters away:</p> <ul> <li>The <strong>free</strong> version allows you to host up to 10 sites in a multi-tenant environment and provides a great dashboard, FTP and continuous deployment capabilities including first class support for git (local repos) and github. </li> <li>The <strong>shared</strong> version adds support for seamlessly scaling your app up to 6 instances/nodes along with enabling Web Jobs which provide worker processes for executing jobs on a schedule, continuously or on-demand. </li> <li>The <strong>standard</strong> version allows you to dedicate not instances, but full VMs to your application and supports auto-scaling your app based on metrics and triggers. </li> </ul> <p>These are just the big rocks… there’s a ton more to WAWS and whether you are a .NET, Node.js, PHP or Python developer and there’s a ton of goodness to WAWS which you can learn more about here: <a title="http://www.windowsazure.com/en-us/documentation/services/web-sites/" href="http://www.windowsazure.com/en-us/documentation/services/web-sites/">http://www.windowsazure.com/en-us/documentation/services/web-sites/</a> </p> <p>When you create your WAWS application, you get both an IP and URL. The URL takes the form of [your app].azurewebsites.net. This is cool for development, testing and maybe corporate apps, but if you are building publically visible web apps or APIs, chances are you’ll want your own domain name so that instead of [your app].azurewebsites.net you can point your users to foobaz.com or whatever. </p> <p>Microsoft has official docs on how to do this <a href="http://www.windowsazure.com/en-us/documentation/articles/web-sites-custom-domain-name/" target="_blank">here</a>, but I found that there was a lot of detail that might intimidate folks so I thought I’d break it down in 4 simple steps. I’ll assume that you’ve already bought your shiny new domain name from a registrar and that it’s parked at some annoying, ad infested landing page. </p> <h4><strong>Step 1: Ensure your site is configured for shared or standard mode</strong></h4> <p>Free doesn’t support custom domains which seems pretty reasonable to me. If you started with a website in free mode, simply click on the Scale option and choose from “Shared” or “Standard” mode and click OK:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_thumb.png" width="640" height="315" /></a> </p> <h4>Step 2: Copy the IP and WAWS URL</h4> <p>The next step is to make note of your URL and IP address which you’ll need for the third step in this process. Go to the list of WAWS sites, select the site (but don’t click on it) and click on the “Manage Domains” icon at the bottom of the command bar:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_thumb_3.png" width="640" height="31" /></a> </p> <p>This will bring up a dialog that includes your current domain record ([your app].azurewebsites.net) and your IP:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_thumb_4.png" width="640" height="342" /></a> </p> <h4>Step 3: Update the A Record and CNAMEs</h4> <p>Make a note of each and login to your domain registrar’s console. You want to look for “DNS Management” and either “Advanced” or “Manage Zones” or “Manage DNS Zone File”. You want to get to whatever console allows you to configure your A Record and CNAMEs. I won’t get into a bunch of DNS theory here, but in a nutshell, these records allow for requests to your registered domain name to be forwarded to Windows Azure, and specifically your website’s host name. The result is that your website will resolve to both [your app].azurewebsites.net and foobaz.com (or whatever domain you purchased).</p> <p>Each registrar will obviously look different, but this is what GoDaddy’s looks like (there’s several other entries like ftp, MX records, etc. which can be ignored):</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_thumb_5.png" width="640" height="434" /></a> </p> <p>The A record needs to point to the IP address you captured in step 2. Replace whatever value is there with the IP address provided. When someone calls up foobaz.com, your registrar will authoritatively answer that request and then pass it on directly to the IP address you provided. </p> <p>Now there are various docs, posts, etc. that will tell you that you can choose to use an A name record or a CNAME alias but my experience was that I needed to configure both. If you want to try one or the other, go ahead and do so and skip to Step 4. If it doesn’t work, come back and do both (I had to). </p> <p>For the CNAME, there are 3 entries you need to make:</p> <ul> <li>Point www to [your app].azurewebsites.net – this tells DNS that [your app].azurewebsites.net should be the destination (canonical host) for any DNS queries that begin with www (i.e. <a href="http://www.foobaz.com">www.foobaz.com</a>) </li> <li>Point awwverify AND awwverify.www to awwverify.[your app].azurewebsites.net – This provides for a DNS validation mechanism so that WAWS can validate that your domain registrar has been configured to allow WAWS to serve as a canonical domain in the event that a CNAME look up fails. </li> </ul> <p></p> <p></p> <p></p> <p></p> <p></p> <p>Be sure to save your file/settings. </p> <h4>Step 4: Enter your custom domain name in the Manage Domains dialog and check for validity</h4> <p>Pull up the “Domain Settings” for your website again, and this time, enter your new domain name (i.e. foobaz.com). If you want WAWS to respond to both <a href="http://www.foobaz.com">www.foobaz.com</a> and foobaz.com, you’ll want to create both entries. You’ll likely see a red dot indicating that validation and/or CNAME look up has failed:</p> <p> </p> <blockquote> <p><strong><em>Note that DNS can take up to 48 hours to propagate so as you move to this step, know that if it doesn’t immediately work, wait a few hours to a day and try again (Dynamic DNS providers solve this problem by acting as a proxy between your authoritative domain and canonical domains/IPs). It is very likely that you’ve done everything right, but the records have not yet propagated.</em> </strong></p> </blockquote> <p> </p> <p><a href="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ConfiguringCustomDomainNamesonWindowsAzu_11B28/image_thumb_6.png" width="586" height="480" /></a> </p> <p>This is simply WAWS’ way of telling you that the records have not yet propagated. You can happily continue using your WAWS website using the [your app].azurewebsites.net URL. In time, when you come back to the dialog, the verification should succeed and any request for foobaz.com should automatically resolve to your WAWS app. </p> <p>If you’ve followed these steps and still have issues after 24-48 hours, feel free to drop a comment or hit me on twitter @rickggaribay and I’ll be happy to help you out. </p><img src="http://rickgaribay.net/aggbug/365.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2014/02/26/configuring-custom-domain-names-on-windows-azure-websites-in-4.aspx Thu, 27 Feb 2014 03:26:17 GMT http://rickgaribay.net/archive/2014/02/26/configuring-custom-domain-names-on-windows-azure-websites-in-4.aspx#feedback http://rickgaribay.net/comments/commentRss/365.aspx http://rickgaribay.net/services/trackbacks/365.aspx Announcing the 2nd Annual Global Windows Azure Bootcamp (GWAB) Phoenix! http://rickgaribay.net/archive/2014/01/13/announcing-the-2nd-annual-global-windows-azure-bootcamp-phoenix.aspx <p><a href="http://bit.ly/1gCdCZb" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" border="0" alt="Global Windows Azure Bootcamp" align="left" src="http://globalwindowsazure.azurewebsites.net/wp-content/uploads/2013/04/bootcamp-300x202.png" /></a></p> <p>I am thrilled to announce the 2<sup>nd</sup> Annual <a href="http://global.windowsazurebootcamp.com/">GWAB</a> which has been confirmed for Saturday, March 29<sup>th</sup>, 2014! </p> <p>As of today, we have <strong>119</strong> locations in <strong>48</strong> countries and <strong>111</strong> cities!</p> <p>For those of you who <a href="http://rickgaribay.net/archive/2013/03/20/global-windows-azure-bootcampndash-phoenix-427.aspx" target="_blank">attended last year</a>, you know what a blast we had writing and deploying code to Azure as part of hands on labs and our massive scale-out demo, the "<a href="http://renderlab.azurewebsites.net/" target="_blank">Global Render Lab</a>”. This exercise showed the power of distributed computing and we'll be doing something similar this year.  </p> <p>This year, we are taking the immense compute power of Windows Azure and putting it to work in the fight against diabetes. We’re partnering with Dr. Richard D. Smith in the Biological Sciences Division at Pacific Northwest National lab (PNNL) in collaboration with Minnie M. Sarwal and Tara K. Sigdel at the California Pacific Medical Center Research Institute with the goal of discovering how our body’s serum protein glycosylation works. We want to know how high blood sugar levels present in diabetes patients affect the complex sugar production systems required for our health and ability to fight disease. We want to prove the theory that when small changes in this process start occurring, the disease can progress and lead to Type 2 diabetes. The results from this work will not only help understand the human diabetic state at the molecular level but also lead the way for early detection of diabetes. More details here: <a href="http://global.windowsazurebootcamp.com/charity">http://global.windowsazurebootcamp.com/charity</a> </p> <p>Our hope is that as our attendees are using this to learn about how to deploy to Windows Azure and how distributed computing works, we can help solve some of the world's problems at the same time.</p> <p><a href="http://bit.ly/1gCdCZb" target="_blank"></a></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p align="center"><font size="3"><strong>Agenda and Speakers</strong></font></p> <p>Joe and I have been hard at work on the agenda and I’m pleased to share the final agenda below:</p> <table border="1" cellspacing="0" cellpadding="2" width="748"><tbody> <tr> <td valign="top" width="100"> <p align="center"><strong>Start</strong></p> </td> <td valign="top" width="100"> <p align="center"><strong>End</strong></p> </td> <td valign="top" width="324"> <p align="center"><strong>Topic</strong></p> </td> <td valign="top" width="222"> <p align="center"><strong>Speaker</strong></p> </td> </tr> <tr> <td valign="top" width="100">9:00</td> <td valign="top" width="100">9:15</td> <td valign="top" width="324">Welcome, Introduction</td> <td valign="top" width="222">Rick G. Garibay and Joe Guadagno</td> </tr> <tr> <td valign="top" width="100">9:15</td> <td valign="top" width="100">10:15</td> <td valign="top" width="324">A Lap Around Windows Azure</td> <td valign="top" width="222">Rick G. Garibay</td> </tr> <tr> <td valign="top" width="100">10:15</td> <td valign="top" width="100">11:30</td> <td valign="top" width="324">Big Charity Render Lab!</td> <td valign="top" width="222">Proctored by speakers, GWAB leadership</td> </tr> <tr> <td valign="top" width="100">11:30</td> <td valign="top" width="100">11:45</td> <td valign="top" width="324">Break. Grab Lunch, prepare for next session!</td> <td valign="top" width="222"> </td> </tr> <tr> <td valign="top" width="100">11:45</td> <td valign="top" width="100">12:45</td> <td valign="top" width="324">A Lap Around Cloud Services</td> <td valign="top" width="222">Joe Guadagno</td> </tr> <tr> <td valign="top" width="100">12:45</td> <td valign="top" width="100">1:45</td> <td valign="top" width="324">A Lap Around Windows Azure Websites</td> <td valign="top" width="222">Rick G. Garibay</td> </tr> <tr> <td valign="top" width="100">1:45</td> <td valign="top" width="100">2:45</td> <td valign="top" width="324">A Lap Around Windows Azure Mobile Services</td> <td valign="top" width="222">Brendon Birdoes</td> </tr> <tr> <td valign="top" width="100">2:45</td> <td valign="top" width="100">3:45</td> <td valign="top" width="324">Hands on Labs</td> <td valign="top" width="222">Proctored by speakers, GWAB leadership</td> </tr> <tr> <td valign="top" width="100">3:45</td> <td valign="top" width="100">4:00</td> <td valign="top" width="324">Break</td> <td valign="top" width="222"> </td> </tr> <tr> <td valign="top" width="100">4:00</td> <td valign="top" width="100">5:00</td> <td valign="top" width="324">Windows Azure ALM</td> <td valign="top" width="222">Chris Myers</td> </tr> <tr> <td valign="top" width="100">5:00</td> <td valign="top" width="100">6:00</td> <td valign="top" width="324">Windows Azure Data &amp; HDInsight</td> <td valign="top" width="222">Michael Collins</td> </tr> </tbody></table> <p> </p> <p>The class includes presenters and trainers (Microsoft MVPs, industry experts) with deep, real world experience with Windows Azure, as well as a series of labs so you can practice what you just learned. In fact, I am pleased to announce that the following Microsoft MVPs and community rock stars have already signed on for this year’s event:</p> <ul> <li><a href="http://twitter.com/jguadagno" target="_blank">Joe Guadagno</a> – Microsoft MVP, President SEVDNUG, GWAB Co-Organizer, Speaker </li> <li><a href="http://twitter.com/myerscj" target="_blank">Chris Myers</a>- President Phoenix Connected Systems User Group, GWAB Speaker <a href="http://bit.ly/1gCdCZb" target="_blank"><img style="border-right-width: 0px; margin: 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="GWAB2014" border="0" alt="GWAB2014" align="right" src="http://rickgaribay.net/Images/CustomContent/Announcingthe2ndAnnualGlobalWindowsAzure_F0E4/GWAB2014.png" width="320" height="322" /></a></li> <li><a href="http://twitter.com/brendonbirdoes" target="_blank">Brendon Birdoes</a> - National Solutions Director, Neudesic, GWAB Speaker </li> <li><a href="http://twitter.com/@mfcollins3" target="_blank">Michael Collins</a> – Architect, <a href="http://products.neudesic.com/features" target="_blank">Neuron ESB</a>, GWAB Speaker </li> </ul> <p><strong><font size="3">Awesome. How much does it cost?</font></strong> <br />This event is FREE to the attendees. Gratis! Gratuite! Libero!  However, seating is limited so be sure to register and secure your seat today: <a title="http://bit.ly/1gCdCZb" href="http://bit.ly/1gCdCZb">http://bit.ly/1gCdCZb</a>  </p> <p><font size="3"><strong>What do I need to bring?</strong></font> <br />You will need to bring your own computer which can run Visual Studio 2012 or 2013 (i.e. Windows, OSX, Ubuntu with virtualization, etc.) and have it preloaded with the following:</p> <ul> <li>Visual Studio 2012 or 2013 </li> <li>The Windows Azure SDK from <a href="http://www.windowsazure.com/en-us/develop/net/">http://www.windowsazure.com/en-us/develop/net/</a> </li> </ul> <p>Optionally (or if you will not be doing just .NET labs), the following can also be installed:</p> <ul> <li>Node.js SDK - <a href="http://www.windowsazure.com/en-us/develop/nodejs/">http://www.windowsazure.com/en-us/develop/nodejs/</a> </li> <li>JAVA SDK - <a href="http://www.windowsazure.com/en-us/develop/java/">http://www.windowsazure.com/en-us/develop/java/</a> </li> <li>Doing mobile? Android? iOS? Windows Phone or Windows 8? - <a href="http://www.windowsazure.com/en-us/develop/mobile/">http://www.windowsazure.com/en-us/develop/mobile/</a> </li> <li>PHP - <a href="http://www.windowsazure.com/en-us/develop/php/">http://www.windowsazure.com/en-us/develop/php/</a> </li> </ul> <p>More info here: <a href="http://www.windowsazure.com/en-us/documentation">http://www.windowsazure.com/en-us/documentation</a></p> <p><font color="#ff0000">Please do the installation upfront as there will be very little time to troubleshoot installations during the day. </font></p> <p>You will also need to be signed up for a Windows Azure account. There are <a href="http://www.windowsazure.com/en-us/pricing/purchase-options/" target="_blank">many options</a> including a 100% absolutely <a href="http://www.windowsazure.com/en-us/pricing/free-trial/" target="_blank">free 30 day trial</a>. Why not sign up now? <a href="http://www.windowsazure.com/en-us/pricing/free-trial/">http://www.windowsazure.com/en-us/pricing/free-trial/</a></p> <p><font size="3"><strong>Is this for beginners?</strong></font> <br />Yes and no. We will focus on a series of lectures and hands on labs aimed at level 200, but ad-hoc white boarding, deep scenario discussions and Q&amp;A are all part of the fun. Think you already know it all? Great, we still need volunteers, speakers and lab buddies. Drop me a note on Twitter <a href="http://twitter.com/rickggaribay" target="_blank">@rickggaribay</a></p> <p><font size="3"><strong>And now, for a little fun…</strong></font></p> <iframe height="315" src="//www.youtube.com/embed/sEion7CZO3s" frameborder="0" width="560" allowfullscreen="allowfullscreen"></iframe> <p>Big thanks to fellow MVPs Maarten Balliauw, Alan Smith, Michael Wood and Magnus Martensson for running this event as our global leaders. Thanks also to <a href="http://twitter.com/@scottcate" target="_blank">Scott Cate</a> at <a href="https://www.eventday.com/" target="_blank">Event Day</a> for providing free registration hosting. We couldn’t do this without them!</p><img src="http://rickgaribay.net/aggbug/363.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2014/01/13/announcing-the-2nd-annual-global-windows-azure-bootcamp-phoenix.aspx Tue, 14 Jan 2014 02:24:44 GMT http://rickgaribay.net/archive/2014/01/13/announcing-the-2nd-annual-global-windows-azure-bootcamp-phoenix.aspx#feedback http://rickgaribay.net/comments/commentRss/363.aspx http://rickgaribay.net/services/trackbacks/363.aspx IoT, Mobility, Hybrid Cloud, ESB Oh My! A Closer Look at the Neudesic Gartner AADI Demo http://rickgaribay.net/archive/2013/12/21/iot-mobility-hybrid-cloud-esb-oh-my-a-closer-look.aspx <p>Earlier this week, my colleague <a href="http://twitter.com/simonguest" target="_blank">@simonguest</a> <a href="http://simonguest.com/2013/12/12/ibeacon-demo-at-gartner-aadi/" target="_blank">posted a great summary</a> of the demo he and I built together for the <a href="http://www.gartner.com/technology/summits/na/applications/" target="_blank">Gartner AADI Summit</a> in Las Vegas week before last.<a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_8.png"><img style="border-bottom: 0px; border-left: 0px; margin: 5px 5px 5px 30px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_8.png" width="389" height="480" /></a> </p> <p>As Simon illustrates, the demo combined two areas we are thinking a lot about these days at Neudesic- enterprise mobility and Internet of Things. </p> <p>When we talk about enterprise mobility, we're not talking about mobile device management, governance or provisioning. Our focus is on unlocking the assets that live on premises, behind the firewall so that they are safely and securely exposed, composed and consumed by a variety of devices and composite business applications on the web.</p> <p>In this post, I’ll talk a little bit more about these two areas and dive into the back-end of the demo from a messaging and services perspective to give you a glimpse into the internals of the demo app.   </p> <p><strong><u>Exposing On-Premise Assets</u></strong></p> <p>The key unlocking event for enterprise mobility is enabling the ability to expose assets that live within an organization’s traditional datacenter. These assets include things like other apps, LOB systems, ERPs and databases. In the most traditional sense, the way this problem has been solved is by determining what assets need to be made available, standing up hardware on a DMZ and specifying which inbound ports allow which kind of traffic. Unfortunately, there’s really nothing too innovative about this approach as it is the way we’ve been solving this problem for nearly 20 years. </p> <p>Today, there are many enterprise mobility vendors out there offering an appliance based offering which extends this approach to address things like security, hardware compression, etc., but the agility of these solutions is questionable as they still required CapEx spend, time and resources to provision and manage. </p> <p>Another kind of on-premise asset you will be hearing more and more about involves sensors and devices that communicate with software and other devices. This Machine to Machine (M2M) communication will be revolutionary in domain<a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb.png" width="191" height="93" /></a>s such as transportation, retail, logistics, oil and gas, manufacturing, etc. as they will enable the ability to yield new insights that will at first transform business and then become key to survival. One such device is known as iBeacon.</p> <p>These devices, about the width and half the length of a stick of gum run on Bluetooth Low Energy (BLE) and thus require very little power. These beacons transmit a unique identifier along with signal strength which can then be used to calculate proximity. </p> <p>You can easily imagine a scenario where a retailer provides a free app that interacts with you in the store as you approach these iBeacons. As you might imagine, the back end of the app would learn your behaviors and preferences and target you with interesting offers to influence your browsing and buying habits as well as crowd sourcing what ideal retail layouts look like based on the tons of data that could be collected and modeled. Another scenario might involve tracking shipping containers on trucks. Today, 5.9 RFID technology dominates this space but the amount of infrastructure required to read the tags compared to what can be accomplished with a handful of iBeacons and a handheld device is disruptive indeed. To illustrate this in our demo, our iBeacons communicated directly with iOS and Android handsets, with literally no set up or tear down, allowing us to enumerate, update and “check into” the beacons that were placed throughout the conference floor. </p> <p>For the check in scenario, as you approached an iBeacon, the app would raise an event allowing you to check in to that location. The app then sent a message over the Gartner guest conference WIFI network to a server hosted in our datacenter in Irvine, CA running <a href="http://products.neudesic.com/features" target="_blank">Neuron ESB</a>. The server sits behind our firewall and no inbound ports are open because our IT policy rightfully prohibits it. Instead, a single outbound port is opened by Neuron over an Azure Service Bus Relay which allows for secure, bi-directional messaging for a number of APIs that we implemented which I’ll cover in more detail next.</p> <p><strong><u>Composing and Consuming</u></strong></p> <p>As you can see in the demo sample architecture, we exposed a REST head over Azure Service Bus which provided the external messaging fabric for communicating with the apps running on iOS and Android in the Gartner exhibition hall. Using Neuron’s messaging and processing capabilities, we implemented the following 4 APIs:</p> <p> </p> <table border="0" cellspacing="0" cellpadding="2" width="882"><tbody> <tr> <td valign="top" width="424"> <p><strong></strong></p> <ul> <li><strong>REGISTER BEACON</strong> <br />PUT /beacons <br />{ id: "&lt;&lt;GUID&gt;&gt;", name: "Neudesic Booth, Expo Hall"} </li> </ul> <p> </p> <p> <br /></p> <ul> <li><strong>LOOK UP BEACON</strong> <br />GET /beacons <br />[{ id: "&lt;&lt;GUID&gt;&gt;", name: "Beacon name"}, {id: "&lt;&lt;GUID&gt;&gt;", name: "Beacon name"}] (Array) </li> </ul> <p> </p> <p> <br /></p> <ul> <li><strong>GET ALL BEACONS</strong> <br />GET /beacons/:id <br />{ id: "&lt;&lt;GUID&gt;&gt;", name: "Beacon name"} </li> </ul> <p> </p> <p> <br /></p> <ul> <li><strong>CHECK IN TO BEACON</strong> <br />PUT /beacons/:id/checkin <br />{ userid: "&lt;&lt;facebookid&gt;&gt;" } </li> </ul> <p></p> </td> <td valign="top" width="456"><a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_3.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_3.png" width="251" height="480" /></a> <br /><font size="1">The Android version of the app the weekend before the conference. We used Xamarin to build a consistent UX for iOS as well. The iBeacons were re-registered with the actual locations of the booths on the conference floor within a few seconds. </font></td> </tr> </tbody></table> <p> </p> <p>To create a connection to Azure Service Bus, we simply created a Client Connector within a Service Endpoint in Neuron as shown below:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_4.png" width="617" height="414" /></a> </p> <p>Neuron hosts an instance of the WCF NetMessagingBinding and creates a virtual service endpoint using the URI shown above. </p> <p>In order to route the requests from the app to the right logic, we implemented a simple controller called “Beacon Router” using a Neuron Process. Using a Decision step, we added 4 branches for each API:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_5.png" width="441" height="480" /></a> </p> <p>Each Decision Step has a condition which returns true or false. If the condition returns true, the steps within the branch are executed. If not, the Process evaluates each branch until a match is found our returns a 404, Resource not Found. </p> <p>Here is a look at the the Check In Condition:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_6.png" width="640" height="422" /></a> </p> <p>As you can see, we used a simple UriTemplate to define the template for the Check In API. The URI is stored in the ESB message context within the MessageHeader.To property. If the template matches the actual URI, we return true and the steps within the branch execute in sequence. </p> <p>The next step that fires is the Publish step. We included this step for testing purposes to serve as Wire Tap on the messages that reach the branch. In this case, this was useful for inspecting the message off the wire by configuring a subscribing party and using our Neuron Test Client to inspect the message:</p> <p><a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/image_thumb_7.png" width="568" height="480" /></a> </p> <p>This little trick aside, the Publish step is very powerful in that it allows you to asynchronously publish a message on a topic for other subscribers to pick up. Think of Scatter Gather as a good example. </p> <p>The next step you’ll notice is a Call Process step. This step simply allows you to call a nested Process which is helpful in factoring your Process (note that we could have chosen to asynchronously execute a nested process by wrapping it inside a Parallel step).</p> <p>The Check In process starts with a Push step. This step stores the current message for later use. </p> <p>This was required because we needed to first determine if the iBeacon location was valid before allowing a check in. The way Neuron Processes work is that the message is modified by each step allowing for very powerful enrichment and transformation of the message. However, since there can only be one message in context at any time, the current message is overwritten by the message we crafted up for the ODBC step which follows. </p> <p>In this case, we used the ODBC step to query SQL Server for the iBeacon guid. The ODBC step expects a message that conforms to it’s interface, a simple XML syntax for defining the query:</p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span><span class="kwrd">string</span> sql = String.Empty; </pre> <pre><span class="lnum"> 2: </span> <a href="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/SNAGHTMLd1870c0.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="SNAGHTMLd1870c0" border="0" alt="SNAGHTMLd1870c0" align="right" src="http://rickgaribay.net/Images/CustomContent/ModernMobilityatGartnerAADI_D46E/SNAGHTMLd1870c0_thumb.png" width="352" height="1234" /></a></pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span>sql += <span class="str">"&lt;Statement type=\"Text\" sql=\"SELECT * FROM [dbo].[Beacon] WHERE BeaconGuid =?\"&gt;"</span>; </pre> <pre><span class="lnum"> 4: </span>sql += <span class="str">"&lt;Parameters&gt;"</span>; </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 5: </span>sql += <span class="str">"&lt;Parameter type=\"varchar\" name=\"@BeaconGuid\" value=\""</span> + beaconId + <span class="str">"\"/&gt;"</span>; </pre> <pre><span class="lnum"> 6: </span>sql += <span class="str">"&lt;/Parameters&gt;"</span>; </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 7: </span>sql += <span class="str">"&lt;/Statement&gt;"</span>; </pre> <pre><span class="lnum"> 8: </span> </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 9: </span>context.Data.FromXml(sql);</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Note line 9 above replaces the message in the context with this new message. The ODBC step executes the query based on the latest context and returns the result:</p> <pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">QueryResults</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">QueryResult</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>2<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">BeaconGuid</span><span class="kwrd">&gt;</span>1.1<span class="kwrd">&lt;/</span><span class="html">BeaconGuid</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">BeaconName</span><span class="kwrd">&gt;</span>Neudesic Booth<span class="kwrd">&lt;/</span><span class="html">BeaconName</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">QueryResults</span><span class="kwrd">&gt;</span> <span class="kwrd">&lt;</span><span class="html">QueryResult</span><span class="kwrd">&gt;</span></pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p></p> <p>Next, we used a Decision step to check to see if the ODBC step yielded the iBeacon we looked up:</p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span>var xml = context.Data.ToXmlDocument(); </pre> <pre><span class="lnum"> 2: </span>var node = xml.GetElementsByTagName(<span class="str">"QueryResult"</span>); </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span><span class="kwrd">return</span> node.Count &gt; 0;</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>If the node count is not zero, we know we have a match. Otherwise, we issue a 404 since the resource could not be found. </p> <p>Recall that at the beginning of the process execution, the first thing we did was push the message into temporary storage so that we could retrieve it later. Once we determined that the iBeacon exists, we pop the message back into context so that we can grab the iBeacon id from the URI and the user id of the user (in this case, a facebook email address) from the original HTTP message body.</p> <p>To perform the chec kin, we simply did an INSERT into a SQL Server table called CheckIn. The Code step includes the following code, which as before, the ODBC step will consume and perform the unit of work. </p> <p>Since the iBeacon ID is part of the URI, we use UriTemplate again to determine a match and then extract the {id} parameter from the URI:</p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span>System.UriTemplate template = <span class="kwrd">new</span> System.UriTemplate(<span class="str">"/beacons/{id}/checkin"</span>);</pre> <pre><span class="lnum"> 2: </span>Uri uri = <span class="kwrd">new</span> Uri(context.Data.GetProperty(<span class="str">"MessageHeader"</span>,<span class="str">"To"</span>));</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span>Uri baseUri = <span class="kwrd">new</span> Uri(<span class="str">"https://"</span> + uri.Host);</pre> <pre><span class="lnum"> 4: </span>var match = template.Match(baseUri, uri);</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 5: </span> </pre> <pre><span class="lnum"> 6: </span>var beaconId = match.RelativePathSegments[1];</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>From there, we do some formatting and grab the user id from the JSON message payload that was provided in the HTTP body: </p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span>System.Web.Script.Serialization.JavaScriptSerializer serializer = <span class="kwrd">new</span> System.Web.Script.Serialization.JavaScriptSerializer();</pre> <pre><span class="lnum"> 2: </span> </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span>Neudesic.TPG.GartnerAADI.Model.CheckIn checkIn = <span class="kwrd">new</span> </pre> <pre><span class="lnum"> 4: </span>System.Web.Script.Serialization.JavaScriptSerializer().Deserialize&lt;Neudesic.TPG.GartnerAADI.Model.CheckIn&gt;(jsonString);</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Finally, we build the INSERT statement and load the new message context: </p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span><span class="kwrd">string</span> sql = String.Empty;</pre> <pre><span class="lnum"> 2: </span> </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span>sql += <span class="str">"&lt;Statement type=\"Text\" sql=\"INSERT INTO [dbo].[CheckIn]([UserId],[BeaconGuid],[Date]) VALUES(?,?,?)\"&gt;"</span>;</pre> <pre><span class="lnum"> 4: </span>sql += <span class="str">"&lt;Parameters&gt;"</span>;</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 5: </span>sql += <span class="str">"&lt;Parameter type=\"varchar\" name=\"@UserId\" value=\""</span> + checkIn.UserId + <span class="str">"\"/&gt;"</span>;</pre> <pre><span class="lnum"> 6: </span>sql += <span class="str">"&lt;Parameter type=\"varchar\" name=\"@BeaconGuid\" value=\""</span> + beaconId + <span class="str">"\"/&gt;"</span>;</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 7: </span>sql += <span class="str">"&lt;Parameter type=\"varchar\" name=\"@Date\" value=\""</span> + DateTime.Now.ToString() + <span class="str">"\"/&gt;"</span>;</pre> <pre><span class="lnum"> 8: </span>sql += <span class="str">"&lt;/Parameters&gt;"</span>;</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 9: </span>sql += <span class="str">"&lt;/Statement&gt;"</span>;</pre> <pre><span class="lnum"> 10: </span> </pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 11: </span>context.Data.FromXml(sql);</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>If all goes well, we issue an HTTP 200 back to the client: </p> <div class="csharpcode"> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 1: </span>context.Data.Http = <span class="kwrd">new</span> HttpMessage();</pre> <pre><span class="lnum"> 2: </span>context.Data.Http.StatusCode = System.Net.HttpStatusCode.OK;</pre> <pre style="width: 73%; height: 20px" class="alt"><span class="lnum"> 3: </span>context.Data.FromString(<span class="str">""</span>);</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Otherwise we own up to the problem being on our end and return a 500 (with some internal logging of course). </p> <p>The Register API is implemented in much the same way. We check to see if the iBeacon exists and if so, do an update, otherwise insert a new record. Thus, this API supports initial standing up of the beacons as well as managing the names as the beacons moved from development to the expo floor. </p> <p>For the GET APIs, we again used ODBC steps to query for a single or all beacons and returned a single or an array of beacons respectively as you can see in the BeaconRouter screenshot at the beginning of this walkthrough. </p> <p><u><strong>Summary</strong></u></p> <p>As you can probably guess, Simon and I had a lot of fun building this demo and the folks at the conference seemed to find it interesting too :-) </p> <p>There are unlimited possibilities once you unlock the ability to safely and securely transcend network, security and business boundaries behind the firewall. And if agility isn’t enough to compel you to think differently about how you expose and compose your enterprise assets for external consumption by mobile devices today, the proliferation of devices- and I’m not talking about tablets or phones- expected to reach in the excess of 250 billion by 2025, will challenge every industry to think differently about their enterprise messaging and mobility strategy. </p><img src="http://rickgaribay.net/aggbug/362.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2013/12/21/iot-mobility-hybrid-cloud-esb-oh-my-a-closer-look.aspx Sat, 21 Dec 2013 15:49:41 GMT http://rickgaribay.net/archive/2013/12/21/iot-mobility-hybrid-cloud-esb-oh-my-a-closer-look.aspx#feedback http://rickgaribay.net/comments/commentRss/362.aspx http://rickgaribay.net/services/trackbacks/362.aspx Global Windows Azure BootCamp&ndash; Phoenix 4/27 http://rickgaribay.net/archive/2013/03/20/global-windows-azure-bootcampndash-phoenix-427.aspx <p>The rumors are true. The Global Windows Azure Bootcamp is coming to Phoenix on <strong>April 27th, 2013. </strong>Registration is now open: <a title="https://phxglobalazurebootcamp.eventday.com/" href="https://phxglobalazurebootcamp.eventday.com/">https://phxglobalazurebootcamp.eventday.com/</a> <a href="https://phxglobalazurebootcamp.eventday.com/" target="_blank"><img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image001[9]" border="0" alt="clip_image001[9]" align="right" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/Global-Windows-Azure-Boot-Camp-Phoenix-4_F64D/clip_image001%5B9%5D_1.jpg" width="238" height="240" /></a></p> <p>This is a <a href="http://globalwindowsazure.azurewebsites.net/?page_id=151" target="_blank">truly global event</a> in which the Phoenix community will come together to share and learn what you can do on Windows Azure.</p> <p>This <strong>one day deep dive class</strong> will get you up to speed on developing for and deploying to Windows Azure. The class will be led by myself and fellow MVPs including the one and only <a href="http://twitter.com/jguadagno" target="_blank">Joe Guadagno</a>, <a href="http://twitter.com/danwahlin" target="_blank">Dan Wahlin</a> and you’re friendly neighborhood Microsoft Regional Director <a href="http://twitter.com/scottcate" target="_blank">Scott Cate</a>. You’re guaranteed to learn a ton and in addition to the talks, you’ll work on some great hands on labs so you can apply what you learn on the same day and take the labs with you! Best of all, if you get stuck, we’ll be there to make you do push ups, I mean get unblocked <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/Global-Windows-Azure-Boot-Camp-Phoenix-4_F64D/wlEmoticon-winkingsmile_2.png" /></p> <p><strong>AGENDA</strong></p> <p>We will start at 9:00 with welcome and introductions and get right into an end-to-end overview of Windows Azure. From there, we’ll participate in a massive, coordinated, global deployment to Windows Azure, teaming with over 60 other worldwide locations to see the workload in action (details are super secret, so you have to show up to get your security clearance- this a a boot camp after all)!</p> <p>After we’ve done our best to take down a datacenter, we’ll take a break and take a lap around storage and database options on Windows Azure while we enjoy a catered lunch kindly sponsored by Microsoft. We’ll also have fresh primo coffee, sodas, waters and snacks to help you power through the labs which will give you real-world exposure to what its like to actually apply what you’ve learned and take the <strong>working</strong> applications home with you.</p> <p>From there we’ll take another break and wrap up the day with a look at how Windows Azure Service Bus changes how you think about messaging and integration when working at cloud scale. We’ll have a Service Bus lab and from there likely plan some nefarious after event activities at one of downtown Chandler’s fine watering holes.</p> <p>Here are the details:</p> <table border="0" cellspacing="0" cellpadding="0" width="668"><tbody> <tr> <td valign="top" width="480"> <p align="center"><b>Activity</b></p> </td> <td valign="top" width="186"> <p align="center"><b>Time</b></p> </td> </tr> <tr> <td valign="top" width="480"> <p>Welcome and Introductions (15 mins)</p> </td> <td valign="top" width="186"> <p>9:00 – 9:15</p> </td> </tr> <tr> <td valign="top" width="480"> <p>Windows Azure Overview (75 minutes)</p> </td> <td valign="top" width="186"> <p>9:15 – 10:30</p> </td> </tr> <tr> <td valign="top" width="480"> <p>Deploy to the cloud! (45 minutes)</p> </td> <td valign="top" width="186"> <p>10:30 – 11:15</p> </td> </tr> <tr> <td valign="top" width="480"> <p>Break (15 minutes)</p> </td> <td valign="top" width="186"> <p>11:15 – 11:30</p> </td> </tr> <tr> <td valign="top" width="480"> <p>Windows Azure Storage and Database (90 minutes)</p> </td> <td valign="top" width="186"> <p>11:30 – 1:00 </p> </td> </tr> <tr> <td valign="top" width="480"> <p>Hands On labs (2 hours)</p> </td> <td valign="top" width="186"> <p>1:00 – 2:00 </p> </td> </tr> <tr> <td valign="top" width="480"> <p>Break (15 minutes)</p> </td> <td valign="top" width="186"> <p>2:00 - 2:15</p> </td> </tr> <tr> <td valign="top" width="480"> <p>Windows Azure Service Bus - (90 minutes)</p> </td> <td valign="top" width="186"> <p>2:15 – 3:45 </p> </td> </tr> <tr> <td valign="top" width="480"> <p>Wrap Up</p> </td> <td valign="top" width="186"> <p>3:45 – 5:00</p> </td> </tr> </tbody></table> <h4><font size="2">HOW MUCH DOES BOOTCAMP COST?</font></h4> <p>This event is FREE to the attendees. Gratis! Gratuite! Libero! We’ll certainly take any good karma you want to send our way, but your attendance and full engagement is all we ask. Be sure to check out the <a href="http://globalwindowsazure.azurewebsites.net/?page_id=171" target="_blank">prerequisites</a> to ensure you are ready to rock.</p> <p><strong>DO I NEED TO BRING ANYTHING?</strong></p> <p>This is a BYOL event. To get the most of the event, you will want to come to boot camp with your own laptop pre-loaded with Visual Studio, the Azure SDK and all <a href="http://globalwindowsazure.azurewebsites.net/?page_id=171" target="_blank">prerequisites</a>. Please see <a title="http://globalwindowsazure.azurewebsites.net/?page_id=171" href="http://globalwindowsazure.azurewebsites.net/?page_id=171">http://globalwindowsazure.azurewebsites.net/?page_id=171</a> to download and install everything you’ll need to make this a great event.</p> <p><strong>BUT, I’M COMPELTELY NEW TO THIS AZURE CLOUD THING</strong></p> <p>This event is for you! We’ll have a mix of content both for experienced developers and those brand spanking new to Windows Azure. Our trainers will be here to answer all of your questions and help you with the labs, so remember, there are no stupid questions.</p> <p><strong>BUT, I ALREADY KNOW THIS STUFF<a href="http://globalwindowsazure.azurewebsites.net/" target="_blank"><img style="margin: 5px; display: inline; float: right" alt="bootcamp" align="right" src="http://globalwindowsazure.azurewebsites.net/wp-content/uploads/2013/01/bootcamp_thumb.png" /></a></strong></p> <p>Awesome! We’d love to have you as you’ll probably teach us a thing or two and we guarantee you’ll walk away learning a few things too!</p> <p><strong>LOCATION, LOCATION, LOCATION</strong></p> <p>Boot camp will be held at Gangplank in Chandler, located at 260 South Arizona Avenue | CHANDLER, AZ 85225</p> <p><strong>WHAT’S NEXT?</strong></p> <p>Seating is limited for this event so please register now at <a title="https://phxglobalazurebootcamp.eventday.com/" href="https://phxglobalazurebootcamp.eventday.com/">https://phxglobalazurebootcamp.eventday.com/</a> to guarantee your seat and help us plan for coffee, drinks, snacks and lunch.</p><img src="http://rickgaribay.net/aggbug/356.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2013/03/20/global-windows-azure-bootcampndash-phoenix-427.aspx Wed, 20 Mar 2013 22:06:51 GMT http://rickgaribay.net/archive/2013/03/20/global-windows-azure-bootcampndash-phoenix-427.aspx#feedback 1 http://rickgaribay.net/comments/commentRss/356.aspx http://rickgaribay.net/services/trackbacks/356.aspx Visual Studio Live! Las Vegas http://rickgaribay.net/archive/2013/02/17/visual-studio-live-las-vegas.aspx <p> </p> <p>I’ll be <a href="http://vslive.com/events/las-vegas-2013/Speakers/Speaker%20Window.aspx?SpeakerId={E7CDD516-A07D-4FB8-A7B3-AA538E893EA7}&amp;ID={6EF8BE9C-3D36-4000-8879-02F12BDF2D2F}" target="_blank">speaking</a> at <a href="http://vslive.com/home.aspx" target="_blank">Visual Studio Live</a>!, March 25-29 in Las Vegas, NV <a href="http://bit.ly/VSLPKK14Reg">http://bit.ly/VSLPKK14Reg</a>.  <a href="http://vslive.com/events/las-vegas-2013/home.aspx?utm_source=AttendeeMktg&amp;utm_medium=Fax&amp;utm_campaign=VLSPK14" target="_blank"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VSL13_Badge_See125x125" border="0" alt="VSL13_Badge_See125x125" align="right" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/Visual-Studio-Live-Las-Vegas_AD06/VSL13_Badge_See125x125_3.jpg" width="129" height="129" /></a></p> <p>There are a ton of great sessions from fellow friends, MVPs and <a title="" href="http://neudesic.com" rel="">Neudesic</a> colleagues so this is sure to be a great show.</p> <p>I’ll be presenting the following sessions:</p> <ul> <li><a href="http://vslive.com/Events/Las-Vegas-2013/Sessions/Tuesday/T21--Build-Speedy-Azure-Applications-with-HTML-5-and-Web-Sockets-Today.aspx" target="_blank">Build Speedy Azure Applications with HTML5 and Web Sockets Today</a> </li> <li><a href="http://vslive.com/Events/Las-Vegas-2013/Sessions/Tuesday/T13--Chalk-Talk-Building-a-URL-Shortening-Service-with-Node.js.aspx" target="_blank">Chalk Talk: Beyond Hello World – A practical introduction to Node.js</a> </li> </ul> <p>SPECIAL OFFER: As a speaker, I can extend $500 savings on the 5-day package. Just be sure to use this link to register and use code <b>VLSPK14: </b><a href="http://bit.ly/VSLPKK14Reg">http://bit.ly/VSLPKK14Reg</a></p> <p>Hope to see you there!</p><img src="http://rickgaribay.net/aggbug/354.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2013/02/17/visual-studio-live-las-vegas.aspx Sun, 17 Feb 2013 19:32:12 GMT http://rickgaribay.net/archive/2013/02/17/visual-studio-live-las-vegas.aspx#feedback 1 http://rickgaribay.net/comments/commentRss/354.aspx http://rickgaribay.net/services/trackbacks/354.aspx The Goods: WebSockets Programming in .NET 4.5 and Windows Azure at That Conference http://rickgaribay.net/archive/2012/08/14/the-goods-websockets-programming-in-.net-4.5-and-windows-azure.aspx <p>We’re just wrapping up day 2 of sessions at <a href="http://www.thatconference.com/" target="_blank">That Conference</a> in Wisconsin Dells, WI and like yesterday, this has been a great day chock full of sessions, great conversations and meeting new people.</p> <p>On Monday I had the opportunity to support Microsoft at their table by staffing an Ask the Experts slot on Windows Azure which was a great opportunity to talk to folks about Azure, Azure Service Bus, etc. and handing out drink tickets to those with the best question.</p> <p>I was also flattered to be interviewed by <a href="http://www.russtoolshed.net/" target="_blank">Russ Fustino</a> for ComponentOne. It was great catching up with Russ- a true legend in the Microsoft developer community!</p> <p>I am really impressed by the developer scene here in the Midwest with developers from all languages and platforms coming together to invest in themselves, their organization and most of all their community for 3 days at the Kalahari Resort. Big shout out to <a href="http://twitter.com/sseely" target="_blank">Scott Seely</a> , <a href="http://twitter.com/csell5" target="_blank">Clark Sell</a> and the legions of invisible people behind the scenes for making this a great inaugural event.</p> <p>On that note, I’d like to thank everyone who attended <a href="http://www.thatconference.com/Sessions/session_198" target="_blank">my talk on WebSockets in .NET 4.5 and Windows Azure</a>. </p> <p>I essentially reprised my content from Azure Connections in Las Vegas this Spring, with updates to Visual Studio 2012 RC and Windows Server 2012.</p> <p>Please take a look at my <a href="http://rickgaribay.net/archive/2012/03/29/building-speedy-azure-applications-with-html5-and-web-sockets-today.aspx">post recapping the content</a> if you want more details but be sure to take the bits posted below instead if you are targeting the RC versions of VS 2012 and Windows Server 2012/Windows 8 as the code samples have changed to align with the RC wave:</p> <p> </p> <div align="center"> <table border="1" cellspacing="0" cellpadding="2" width="1366"><tbody> <tr> <td valign="top" width="81"> <p align="center"><strong>Demo</strong></p> </td> <td valign="top" width="562"> <p align="center"><strong>Summary</strong></p> </td> <td valign="top" width="249"><strong>Goods </strong></td> </tr> <tr> <td valign="top" width="81">Demo 1</td> <td valign="top" width="562"> <p align="left">Live chat sample of Silverlight-based client and WCF Service running on Windows Azure. <br /> <br />Please note that this implementation is deprecated and will not be carried forward. <br /> <br />Instead, please use .NET 4.5 WebSocket support in WCF and ASP.NET. </p> <p align="center"><strong>Sample:</strong></p> <p align="center"></p> <p><a title="http://html5labs.cloudapp.net/WebSockets/ChatDemo/wsdemo.html" href="http://html5labs.cloudapp.net/WebSockets/ChatDemo/wsdemo.html">http://html5labs.cloudapp.net/WebSockets/ChatDemo/wsdemo.html</a></p> </td> <td valign="top" width="249"> <p align="left"><a href="http://html5labs.cloudapp.net/WebSockets/ChatDemo/wsdemo.html"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/Images/customcontent/c1f79a9417a5_B3EF/image_4.png" width="244" height="203" /></a></p> </td> </tr> <tr> <td valign="top" width="81"> <p align="left">Demo 2</p> </td> <td valign="top" width="562"> <p align="left">Simple “Hello World” example of ASP.NET ASHX handler using WebSocketHandler and HTML 5 client demonstrating a trivial “echo” service that displays the date/time each second. <br /> <br />Also included in the Demo 2 folder is a WCF version of the same implementation (which I did not demo during my talk). </p> <p align="left"> </p> <p><strong>Projects:</strong> </p> <p> <br />SimpleEventingSample <br />SimpleEventingService <br /> <br /><font color="#ff0000">Requires Visual Studio 2012 RC &amp; Windows 8/Windows Server 2012 RC/RP</font> </p> <p align="left"></p> </td> <td valign="top" width="249" align="center"> <p align="left"><a href="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/image_2.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/image_thumb.png" width="244" height="149" /></a></p> <p><iframe height="120" src="https://skydrive.live.com/embed?cid=DF930EE6F91132FD&amp;resid=DF930EE6F91132FD%211307&amp;authkey=AOD71R5iqJfI5sM" frameborder="0" width="98" scrolling="no"></iframe></p> </td> </tr> <tr> <td valign="top" width="81"> <p align="left">Demo 3</p> </td> <td valign="top" width="562"> <p align="left">Example of using the Twitter Search API as an event stream with WCF using  WebSocketService, Linq to Twitter and HTML 5 with some nice JQuery and CSS animation. </p> <p><strong>Projects:</strong> </p> <p> <br />StatusStreamClient <br />StatusStreamService <br />StatusStreamServiceTests </p> <p align="left"><font color="#ff0000"></font></p> <p align="left"><font color="#ff0000">Requires Visual Studio 2012 RC &amp; Windows 8/Windows Server 2012 RC/RP</font> <br /></p> </td> <td valign="top" width="249" align="center"> <p align="left"><a href="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/SNAGHTML4ba4793.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML4ba4793" border="0" alt="SNAGHTML4ba4793" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/SNAGHTML4ba4793_thumb.png" width="244" height="89" /></a></p> <p><iframe height="120" src="https://skydrive.live.com/embed?cid=DF930EE6F91132FD&amp;resid=DF930EE6F91132FD%211307&amp;authkey=AOD71R5iqJfI5sM" frameborder="0" width="98" scrolling="no"></iframe></p> </td> </tr> <tr> <td valign="top" width="81"> <p align="left">Demo 4</p> </td> <td valign="top" width="562"> <p align="left">Another event streaming example, this time using the Twitter Streaming API, Node.js and WebSocket.IO in Windows Azure and HTML 5 animations with CSS 3 box shadow and rotate. <br /> <br />As opposed to the Twitter Search API used in Demo 3, you can see that events are immediately captured and the Streaming API is much more reliable than the Search API. <br /></p> </td> <td valign="top" width="249" align="center"> <p align="left"><a href="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/image_4.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/ed8f9a7b9892_137BA/image_thumb_1.png" width="244" height="120" /></a></p> <p align="center"><iframe height="120" src="https://skydrive.live.com/embed?cid=DF930EE6F91132FD&amp;resid=DF930EE6F91132FD%211306&amp;authkey=ABQuTN27kcFSjMI" frameborder="0" width="98" scrolling="no"></iframe></p> </td> </tr> <tr><center> <td valign="top" width="81" colspan="3" align="center"><iframe height="327" src="https://r.office.microsoft.com/r/rlidPowerPointEmbed?p1=1&amp;p2=1&amp;p3=SDDF930EE6F91132FD!1308&amp;p4=&amp;ak=!AO1Dm-rT_vUnzhc&amp;kip=1" frameborder="0" width="402" scrolling="no" align="center"></iframe></td> </center></tr> </tbody></table> <div align="center"></div> </div> <p> </p> <p>On a side note, the next issue of <a href="http://code-magazine.com" target="_blank">CODE Magazine</a> (Sept/Oct 2012) will include a complete, step by step walkthrough of everything you saw in the demo so if you are interested, please check it out and let me know what you think!</p> <p>Thanks again for attending my talk and please share any comments/feedback questions by commenting below.</p><img src="http://rickgaribay.net/aggbug/342.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2012/08/14/the-goods-websockets-programming-in-.net-4.5-and-windows-azure.aspx Wed, 15 Aug 2012 02:52:26 GMT http://rickgaribay.net/archive/2012/08/14/the-goods-websockets-programming-in-.net-4.5-and-windows-azure.aspx#feedback http://rickgaribay.net/comments/commentRss/342.aspx http://rickgaribay.net/services/trackbacks/342.aspx Common Service Bus Queue Operations with the REST API http://rickgaribay.net/archive/2012/01/19/common-service-bus-queue-operations-with-the-rest-api.aspx <p>Azure Service Bus Brokered Messaging provides durable pull-based pub-sub, complimenting it’s older sibling Relay Messaging which uses a push messaging model. While both enable hybrid composition across traditional business, trust and network boundaries, they provide unique capabilities in and of themselves. </p> <p>As with Relay Messaging, Brokered Messaging provides first class support for WCF with the NetMessagingBinding, but expands the developer surface to general .NET and cross-platform/mobility scenarios by offering the .NET Client and REST API respectively.</p> <p>Of the 3 APIs, the .NET Client API is the most robust and seems to be the most documented.</p> <p>The simplicity of the WCF programming model (the illusion that messages are being pushed to your endpoint) is balanced with some restrictions that naturally fall out of the scope of one-way messaging including queue/topic/subscription/rule creation and support for peek lock.</p> <p>In this regard, while not as robust as the .NET Client API, the REST API offers a more comprehensive feature set and when working on solutions that must be interoperable across client platforms or due to other restrictions, the REST API is a great choice.</p> <p>Microsoft has documented the REST API in the <a href="http://msdn.microsoft.com/en-us/library/windowsazure/hh367521.aspx#BKMK_REST5prod" target="_blank">Service Bus REST API Reference</a>, but there are not a ton of imperative examples out there that show WebClient or HttpWebRequest, so the purpose of this post is to share some nitty gritty examples of how to get some of the most common operations done in C#.</p> <p>Please note that my goal is not to be elegant or use the tersest or most fluid syntax possible in this samples, but rather to get some quick and dirty examples out there, well, quickly. </p> <p>As such, the unit tests should be self explanatory, but if you have any questions, please don’t hesitate to ask. </p> <p>Feedback, comments related to the API or WebClient techniques welcome <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://rickgaribay.net/Images/customcontent/Common-Service-Bus-Patterns-with-the-RES_795D/wlEmoticon-smile.png" /></p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">using</span> System;</pre> <pre><span class="lnum"> 2: </span><span class="kwrd">using</span> System.Text;</pre> <pre class="alt"><span class="lnum"> 3: </span><span class="kwrd">using</span> System.Collections.Generic;</pre> <pre><span class="lnum"> 4: </span><span class="kwrd">using</span> System.Linq;</pre> <pre class="alt"><span class="lnum"> 5: </span><span class="kwrd">using</span> Microsoft.VisualStudio.TestTools.UnitTesting;</pre> <pre><span class="lnum"> 6: </span><span class="kwrd">using</span> System.Collections.Specialized;</pre> <pre class="alt"><span class="lnum"> 7: </span><span class="kwrd">using</span> System.Net;</pre> <pre><span class="lnum"> 8: </span><span class="kwrd">using</span> System.Runtime.Serialization.Json;</pre> <pre class="alt"><span class="lnum"> 9: </span><span class="kwrd">using</span> System.Runtime.Serialization;</pre> <pre><span class="lnum"> 10: </span><span class="kwrd">using</span> System.IO;</pre> <pre class="alt"><span class="lnum"> 11: </span> </pre> <pre><span class="lnum"> 12: </span><span class="kwrd">namespace</span> RESTAPITests</pre> <pre class="alt"><span class="lnum"> 13: </span>{</pre> <pre><span class="lnum"> 14: </span> [TestClass]</pre> <pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> RESTAPITests</pre> <pre><span class="lnum"> 16: </span> {</pre> <pre class="alt"><span class="lnum"> 17: </span> </pre> <pre><span class="lnum"> 18: </span> <span class="kwrd">static</span> <span class="kwrd">string</span> serviceNamespace = <span class="str">"[NAMESPACE]"</span>;</pre> <pre class="alt"><span class="lnum"> 19: </span> <span class="kwrd">static</span> <span class="kwrd">string</span> issuerName = <span class="str">"owner"</span>;</pre> <pre><span class="lnum"> 20: </span> <span class="kwrd">static</span> <span class="kwrd">string</span> issuerSecret = <span class="str">"[KEY]"</span>;</pre> <pre class="alt"><span class="lnum"> 21: </span> <span class="kwrd">const</span> <span class="kwrd">string</span> sbHostName = <span class="str">"servicebus.windows.net"</span>;</pre> <pre><span class="lnum"> 22: </span> <span class="kwrd">const</span> <span class="kwrd">string</span> acsHostName = <span class="str">"accesscontrol.windows.net"</span>;</pre> <pre class="alt"><span class="lnum"> 23: </span> <span class="kwrd">static</span> <span class="kwrd">string</span> relativeAddress = <span class="str">"[Queue]"</span>;</pre> <pre><span class="lnum"> 24: </span> <span class="kwrd">static</span> <span class="kwrd">string</span> baseAddress;</pre> <pre class="alt"><span class="lnum"> 25: </span> </pre> <pre><span class="lnum"> 26: </span> </pre> <pre class="alt"><span class="lnum"> 27: </span> [TestMethod]</pre> <pre><span class="lnum"> 28: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> SendMessageShouldSucceedWithoutError()</pre> <pre class="alt"><span class="lnum"> 29: </span> {</pre> <pre><span class="lnum"> 30: </span> <span class="kwrd">string</span> body = <span class="str">"foo"</span>;</pre> <pre class="alt"><span class="lnum"> 31: </span> </pre> <pre><span class="lnum"> 32: </span> var token = GetToken(issuerName, issuerSecret);</pre> <pre class="alt"><span class="lnum"> 33: </span> </pre> <pre><span class="lnum"> 34: </span> baseAddress = GetBaseAddress();</pre> <pre class="alt"><span class="lnum"> 35: </span> <span class="kwrd">string</span> fullAddress = baseAddress + relativeAddress + <span class="str">"/messages"</span>;</pre> <pre><span class="lnum"> 36: </span> </pre> <pre class="alt"><span class="lnum"> 37: </span> WebClient webClient = <span class="kwrd">new</span> WebClient();</pre> <pre><span class="lnum"> 38: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre class="alt"><span class="lnum"> 39: </span> webClient.UploadData(fullAddress, <span class="str">"POST"</span>, Encoding.UTF8.GetBytes(body)); </pre> <pre><span class="lnum"> 40: </span> </pre> <pre class="alt"><span class="lnum"> 41: </span> }</pre> <pre><span class="lnum"> 42: </span> </pre> <pre class="alt"><span class="lnum"> 43: </span> [TestMethod]</pre> <pre><span class="lnum"> 44: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> PeekLockMessageShouldReturnLockId()</pre> <pre class="alt"><span class="lnum"> 45: </span> {</pre> <pre><span class="lnum"> 46: </span> var token = GetToken(issuerName, issuerSecret);</pre> <pre class="alt"><span class="lnum"> 47: </span> </pre> <pre><span class="lnum"> 48: </span> baseAddress = GetBaseAddress();</pre> <pre class="alt"><span class="lnum"> 49: </span> </pre> <pre><span class="lnum"> 50: </span> <span class="rem">// Read and lock the message. Unless released, the lock will expire within the configured lock duration (on the queue)</span></pre> <pre class="alt"><span class="lnum"> 51: </span> <span class="kwrd">string</span> fullAddress = baseAddress + relativeAddress + <span class="str">"/messages/head"</span>;</pre> <pre><span class="lnum"> 52: </span> </pre> <pre class="alt"><span class="lnum"> 53: </span> WebClient webClient = <span class="kwrd">new</span> WebClient();</pre> <pre><span class="lnum"> 54: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre class="alt"><span class="lnum"> 55: </span> webClient.UploadData(fullAddress, <span class="str">"POST"</span>, <span class="kwrd">new</span> <span class="kwrd">byte</span>[0]{});</pre> <pre><span class="lnum"> 56: </span> </pre> <pre class="alt"><span class="lnum"> 57: </span> var props = webClient.ResponseHeaders[<span class="str">"BrokerProperties"</span>];</pre> <pre><span class="lnum"> 58: </span> </pre> <pre class="alt"><span class="lnum"> 59: </span> <span class="rem">// Deserialize the JSON header to a simple class</span></pre> <pre><span class="lnum"> 60: </span> DataContractJsonSerializer serializer = <span class="kwrd">new</span> DataContractJsonSerializer(<span class="kwrd">typeof</span>(BrokerProperty));</pre> <pre class="alt"><span class="lnum"> 61: </span> <span class="kwrd">using</span> (MemoryStream stream = <span class="kwrd">new</span> MemoryStream(Encoding.Unicode.GetBytes(props)))</pre> <pre><span class="lnum"> 62: </span> {</pre> <pre class="alt"><span class="lnum"> 63: </span> var result = (BrokerProperty)serializer.ReadObject(stream);</pre> <pre><span class="lnum"> 64: </span> </pre> <pre class="alt"><span class="lnum"> 65: </span> Assert.IsNotNull(result.LockToken); </pre> <pre><span class="lnum"> 66: </span> }</pre> <pre class="alt"><span class="lnum"> 67: </span> </pre> <pre><span class="lnum"> 68: </span> }</pre> <pre class="alt"><span class="lnum"> 69: </span> </pre> <pre><span class="lnum"> 70: </span> [TestMethod]</pre> <pre class="alt"><span class="lnum"> 71: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> PeekLockMessageAndAbandonShouldSucceed()</pre> <pre><span class="lnum"> 72: </span> {</pre> <pre class="alt"><span class="lnum"> 73: </span> var token = GetToken(issuerName, issuerSecret);</pre> <pre><span class="lnum"> 74: </span> </pre> <pre class="alt"><span class="lnum"> 75: </span> baseAddress = GetBaseAddress();</pre> <pre><span class="lnum"> 76: </span> </pre> <pre class="alt"><span class="lnum"> 77: </span> <span class="rem">// Read and lock the message. Unless released, the lock will expire within the configured lock duration (on the queue)</span></pre> <pre><span class="lnum"> 78: </span> <span class="kwrd">string</span> fullAddress = baseAddress + relativeAddress + <span class="str">"/messages/head"</span>;</pre> <pre class="alt"><span class="lnum"> 79: </span> </pre> <pre><span class="lnum"> 80: </span> WebClient webClient = <span class="kwrd">new</span> WebClient();</pre> <pre class="alt"><span class="lnum"> 81: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre><span class="lnum"> 82: </span> webClient.UploadData(fullAddress, <span class="str">"POST"</span>, <span class="kwrd">new</span> <span class="kwrd">byte</span>[0] { });</pre> <pre class="alt"><span class="lnum"> 83: </span> </pre> <pre><span class="lnum"> 84: </span> var props = webClient.ResponseHeaders[<span class="str">"BrokerProperties"</span>];</pre> <pre class="alt"><span class="lnum"> 85: </span> </pre> <pre><span class="lnum"> 86: </span> <span class="rem">// Deserialize the JSON header to a simple class</span></pre> <pre class="alt"><span class="lnum"> 87: </span> DataContractJsonSerializer serializer = <span class="kwrd">new</span> DataContractJsonSerializer(<span class="kwrd">typeof</span>(BrokerProperty));</pre> <pre><span class="lnum"> 88: </span> </pre> <pre class="alt"><span class="lnum"> 89: </span> <span class="kwrd">using</span> (MemoryStream stream = <span class="kwrd">new</span> MemoryStream(Encoding.Unicode.GetBytes(props)))</pre> <pre><span class="lnum"> 90: </span> {</pre> <pre class="alt"><span class="lnum"> 91: </span> var result = (BrokerProperty)serializer.ReadObject(stream);</pre> <pre><span class="lnum"> 92: </span> </pre> <pre class="alt"><span class="lnum"> 93: </span> <span class="rem">// Bail on the message, release the lock so it is available for another consumer</span></pre> <pre><span class="lnum"> 94: </span> fullAddress = baseAddress + relativeAddress + String.Format(<span class="str">"/messages/{0}/{1}"</span>, result.MessageId, result.LockToken);</pre> <pre class="alt"><span class="lnum"> 95: </span> }</pre> <pre><span class="lnum"> 96: </span> </pre> <pre class="alt"><span class="lnum"> 97: </span> webClient = <span class="kwrd">new</span> WebClient();</pre> <pre><span class="lnum"> 98: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre class="alt"><span class="lnum"> 99: </span> webClient.UploadData(fullAddress, <span class="str">"PUT"</span>, <span class="kwrd">new</span> <span class="kwrd">byte</span>[0] { });</pre> <pre><span class="lnum"> 100: </span> </pre> <pre class="alt"><span class="lnum"> 101: </span> }</pre> <pre><span class="lnum"> 102: </span> </pre> <pre class="alt"><span class="lnum"> 103: </span> [TestMethod]</pre> <pre><span class="lnum"> 104: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> PeekLockMessageAndCompleteShouldSucceed()</pre> <pre class="alt"><span class="lnum"> 105: </span> {</pre> <pre><span class="lnum"> 106: </span> var token = GetToken(issuerName, issuerSecret);</pre> <pre class="alt"><span class="lnum"> 107: </span> </pre> <pre><span class="lnum"> 108: </span> baseAddress = GetBaseAddress();</pre> <pre class="alt"><span class="lnum"> 109: </span> </pre> <pre><span class="lnum"> 110: </span> <span class="rem">// Peek lock the message</span></pre> <pre class="alt"><span class="lnum"> 111: </span> <span class="kwrd">string</span> fullAddress = baseAddress + relativeAddress + <span class="str">"/messages/head"</span>;</pre> <pre><span class="lnum"> 112: </span> </pre> <pre class="alt"><span class="lnum"> 113: </span> WebClient webClient = <span class="kwrd">new</span> WebClient();</pre> <pre><span class="lnum"> 114: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre class="alt"><span class="lnum"> 115: </span> webClient.UploadData(fullAddress, <span class="str">"POST"</span>, <span class="kwrd">new</span> <span class="kwrd">byte</span>[0] { });</pre> <pre><span class="lnum"> 116: </span> </pre> <pre class="alt"><span class="lnum"> 117: </span> var props = webClient.ResponseHeaders[<span class="str">"BrokerProperties"</span>];</pre> <pre><span class="lnum"> 118: </span> </pre> <pre class="alt"><span class="lnum"> 119: </span> DataContractJsonSerializer serializer = <span class="kwrd">new</span> DataContractJsonSerializer(<span class="kwrd">typeof</span>(BrokerProperty));</pre> <pre><span class="lnum"> 120: </span> </pre> <pre class="alt"><span class="lnum"> 121: </span> <span class="kwrd">using</span> (MemoryStream stream = <span class="kwrd">new</span> MemoryStream(Encoding.Unicode.GetBytes(props)))</pre> <pre><span class="lnum"> 122: </span> {</pre> <pre class="alt"><span class="lnum"> 123: </span> var result = (BrokerProperty)serializer.ReadObject(stream);</pre> <pre><span class="lnum"> 124: </span> </pre> <pre class="alt"><span class="lnum"> 125: </span> <span class="rem">// Complete the read operation, releasing the lock and deleting the message from the queue</span></pre> <pre><span class="lnum"> 126: </span> fullAddress = baseAddress + relativeAddress + String.Format(<span class="str">"/messages/{0}/{1}"</span>, result.MessageId, result.LockToken);</pre> <pre class="alt"><span class="lnum"> 127: </span> }</pre> <pre><span class="lnum"> 128: </span> webClient = <span class="kwrd">new</span> WebClient();</pre> <pre class="alt"><span class="lnum"> 129: </span> webClient.Headers[HttpRequestHeader.Authorization] = token;</pre> <pre><span class="lnum"> 130: </span> webClient.UploadData(fullAddress, <span class="str">"DELETE"</span>, <span class="kwrd">new</span> <span class="kwrd">byte</span>[0] { });</pre> <pre class="alt"><span class="lnum"> 131: </span> }</pre> <pre><span class="lnum"> 132: </span> </pre> <pre class="alt"><span class="lnum"> 133: </span> [TestMethod]</pre> <pre><span class="lnum"> 134: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> DecodeJsonToTypeShouldAllowEasyExtractionOfProps()</pre> <pre class="alt"><span class="lnum"> 135: </span> {</pre> <pre><span class="lnum"> 136: </span> </pre> <pre class="alt"><p><span class="lnum"> 137: </span> <span class="kwrd">string</span> payload = <span class="str">@"{"</span><span class="str">"DeliveryCount"</span><span class="str">":3,"</span><span class="str">"LockToken"</span><span class="str">":"</span><span class="str">"4a1d4c96-9837-42a9-ad91-3ecf704eec40"</span><span class="str">","</span><span class="str">"LockedUntilUtc"</span><span class="str">":"</span><span class="str">"Thu, 19 Jan 2012 01:22:44 GMT"</span><span class="str">",</span></p><p><span class="str"> </span><span class="str">"</span><span class="str">"MessageId"</span><span class="str">":"</span><span class="str">"4a4fa2c7d87a40a7b799625b9de69e42"</span><span class="str">","</span><span class="str">"SequenceNumber"</span><span class="str">":2,"</span><span class="str">"TimeToLive"</span><span class="str">":922337203685}"</span>;</p></pre> <pre><span class="lnum"> 138: </span> </pre> <pre class="alt"><span class="lnum"> 139: </span> DataContractJsonSerializer serializer = <span class="kwrd">new</span> DataContractJsonSerializer(<span class="kwrd">typeof</span>(BrokerProperty));</pre> <pre><span class="lnum"> 140: </span> </pre> <pre class="alt"><span class="lnum"> 141: </span> <span class="kwrd">using</span> (MemoryStream stream = <span class="kwrd">new</span> MemoryStream(Encoding.Unicode.GetBytes(payload)))</pre> <pre><span class="lnum"> 142: </span> {</pre> <pre class="alt"><span class="lnum"> 143: </span> var result = (BrokerProperty)serializer.ReadObject(stream);</pre> <pre><span class="lnum"> 144: </span> </pre> <pre class="alt"><span class="lnum"> 145: </span> Assert.IsNotNull(result.MessageId);</pre> <pre><span class="lnum"> 146: </span> }</pre> <pre class="alt"><span class="lnum"> 147: </span> </pre> <pre><span class="lnum"> 148: </span> }</pre> <pre class="alt"><span class="lnum"> 149: </span> </pre> <pre><span class="lnum"> 150: </span> [DataContract]</pre> <pre class="alt"><span class="lnum"> 151: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> BrokerProperty</pre> <pre><span class="lnum"> 152: </span> {</pre> <pre class="alt"><span class="lnum"> 153: </span> [DataMember]</pre> <pre><span class="lnum"> 154: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> DeliveryCount { get; set; }</pre> <pre class="alt"><span class="lnum"> 155: </span> [DataMember]</pre> <pre><span class="lnum"> 156: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> LockToken { get; set; }</pre> <pre class="alt"><span class="lnum"> 157: </span> [DataMember]</pre> <pre><span class="lnum"> 158: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> LockedUntilUtc { get; set; }</pre> <pre class="alt"><span class="lnum"> 159: </span> [DataMember]</pre> <pre><span class="lnum"> 160: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> MessageId { get; set; }</pre> <pre class="alt"><span class="lnum"> 161: </span> [DataMember]</pre> <pre><span class="lnum"> 162: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> SequenceNumber { get; set; }</pre> <pre class="alt"><span class="lnum"> 163: </span> [DataMember]</pre> <pre><span class="lnum"> 164: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> TimeToLive { get; set; }</pre> <pre class="alt"><span class="lnum"> 165: </span> }</pre> <pre><span class="lnum"> 166: </span> </pre> <pre class="alt"><span class="lnum"> 167: </span> </pre> <pre><span class="lnum"> 168: </span> <span class="rem">// Helper</span></pre> <pre class="alt"><span class="lnum"> 169: </span> <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">string</span> GetBaseAddress()</pre> <pre><span class="lnum"> 170: </span> {</pre> <pre class="alt"><span class="lnum"> 171: </span> <span class="kwrd">return</span> baseAddress = <span class="str">"https://"</span> + serviceNamespace + <span class="str">"."</span> + sbHostName + <span class="str">"/"</span>;</pre> <pre><span class="lnum"> 172: </span> }</pre> <pre class="alt"><span class="lnum"> 173: </span> </pre> <pre><span class="lnum"> 174: </span> <span class="rem">// Helper, warmly borrowed from Service Bus Management Sample :-)</span></pre> <pre class="alt"><span class="lnum"> 175: </span> <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">string</span> GetToken(<span class="kwrd">string</span> issuerName, <span class="kwrd">string</span> issuerSecret)</pre> <pre><span class="lnum"> 176: </span> {</pre> <pre class="alt"><span class="lnum"> 177: </span> var acsEndpoint = <span class="str">"https://"</span> + serviceNamespace + <span class="str">"-sb."</span> + acsHostName + <span class="str">"/WRAPv0.9/"</span>;</pre> <pre><span class="lnum"> 178: </span> </pre> <pre class="alt"><span class="lnum"> 179: </span> <span class="rem">// Note that the realm used when requesting a token uses the HTTP scheme, even though</span></pre> <pre><span class="lnum"> 180: </span> <span class="rem">// calls to the service are always issued over HTTPS</span></pre> <pre class="alt"><span class="lnum"> 181: </span> var realm = <span class="str">"http://"</span> + serviceNamespace + <span class="str">"."</span> + sbHostName + <span class="str">"/"</span>;</pre> <pre><span class="lnum"> 182: </span> </pre> <pre class="alt"><span class="lnum"> 183: </span> NameValueCollection values = <span class="kwrd">new</span> NameValueCollection();</pre> <pre><span class="lnum"> 184: </span> values.Add(<span class="str">"wrap_name"</span>, issuerName);</pre> <pre class="alt"><span class="lnum"> 185: </span> values.Add(<span class="str">"wrap_password"</span>, issuerSecret);</pre> <pre><span class="lnum"> 186: </span> values.Add(<span class="str">"wrap_scope"</span>, realm);</pre> <pre class="alt"><span class="lnum"> 187: </span> </pre> <pre><span class="lnum"> 188: </span> WebClient webClient = <span class="kwrd">new</span> WebClient();</pre> <pre class="alt"><span class="lnum"> 189: </span> <span class="kwrd">byte</span>[] response = webClient.UploadValues(acsEndpoint, values);</pre> <pre><span class="lnum"> 190: </span> </pre> <pre class="alt"><span class="lnum"> 191: </span> <span class="kwrd">string</span> responseString = Encoding.UTF8.GetString(response);</pre> <pre><span class="lnum"> 192: </span> </pre> <pre class="alt"><span class="lnum"> 193: </span> var responseProperties = responseString.Split(<span class="str">'&amp;'</span>);</pre> <pre><span class="lnum"> 194: </span> var tokenProperty = responseProperties[0].Split(<span class="str">'='</span>);</pre> <pre class="alt"><span class="lnum"> 195: </span> var token = Uri.UnescapeDataString(tokenProperty[1]);</pre> <pre><span class="lnum"> 196: </span> </pre> <pre class="alt"><span class="lnum"> 197: </span> <span class="kwrd">return</span> <span class="str">"WRAP access_token=\""</span> + token + <span class="str">"\""</span>;</pre> <pre><span class="lnum"> 198: </span> }</pre> <pre class="alt"><span class="lnum"> 199: </span> </pre> <pre><span class="lnum"> 200: </span> }</pre> <pre class="alt"><span class="lnum"> 201: </span> </pre> <pre><span class="lnum"> 202: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style><img src="http://rickgaribay.net/aggbug/326.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2012/01/19/common-service-bus-queue-operations-with-the-rest-api.aspx Thu, 19 Jan 2012 16:23:08 GMT http://rickgaribay.net/archive/2012/01/19/common-service-bus-queue-operations-with-the-rest-api.aspx#feedback http://rickgaribay.net/comments/commentRss/326.aspx http://rickgaribay.net/services/trackbacks/326.aspx DCC 2011.2 Lap Around Azure Service Bus: The Goods http://rickgaribay.net/archive/2011/11/05/dcc-2011.2-lap-around-azure-service-bus-the-goods.aspx <p>Thanks to all that came out to my “<a href="http://nov2011.desertcodecamp.com/session/430" target="_blank">Lap Around Azure Service Bus Brokered Messaging</a>” talk at Desert Code Camp today. </p> <p>We covered a ton of content including things a few folks didn’t know about relay messaging capabilities in Azure Service Bus and demonstrated how simple it is to expose a REST or SOAP endpoint from behind the firewall. I also demonstrated the brand new load balancing capabilities that were just released last week. </p> <p>From there, we dove deep into the .NET API to walk through how to provision queues and topics from code and start messaging within minutes by simply grabbing the Azure Service Bus NuGet package and writing a few lines of code.<iframe height="327" src="http://r.office.microsoft.com/r/rlidPowerPointEmbed?p1=1&amp;p2=1&amp;p3=SDDF930EE6F91132FD!422&amp;p4=&amp;kip=1" frameborder="0" width="402" scrolling="no" align="right"></iframe></p> <p>Next, we explored the REST API, and how simple it is for any HTTP client, regardless of platform to take advantage of the robust messaging capabilities that Azure Service Bus queues and topics have to offer.</p> <p>Last but not least, we wrapped up with a quick walkthrough of the NeMessagingBinding and how simple it is to send and receive messages over a queue using the familiar WCF programming model.</p> <p>I hope that each of you will unlock new possibilities with the power that these hybrid messaging capabilities have to offer. </p> <p>I’d also like to thank <a href="http://www.pluralsight-training.net/microsoft/" target="_blank">Pluralsight</a> for sponsoring my session. The <a href="http://twitter.com/#!/search/realtime/%23dcc11%20%23Azure%20%23ServiceBus%20%23Q1" target="_blank">quiz is now up</a> for the first 5 smartest attendees. </p> <p>Search for hashtags <a href="http://twitter.com/#!/search/realtime/%23dcc11%20%23Azure%20%23ServiceBus%20%23Q2" target="_blank">#dcc11 #Azure #ServiceBus #Q1 to #Q5.</a></p> <p>Good Luck! </p> <p> </p> <table border="0" cellspacing="0" cellpadding="2" width="229"><tbody> <tr> <td valign="middle" width="91"><strong>Code Demos</strong></td> <td valign="middle" width="136"><iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Talks/DCC%202011.2?cid=df930ee6f91132fd&amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no" align="right"></iframe></td> </tr> </tbody></table> <p> </p> <p>Happy Messaging!</p><img src="http://rickgaribay.net/aggbug/323.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2011/11/05/dcc-2011.2-lap-around-azure-service-bus-the-goods.aspx Sat, 05 Nov 2011 21:33:25 GMT http://rickgaribay.net/archive/2011/11/05/dcc-2011.2-lap-around-azure-service-bus-the-goods.aspx#feedback http://rickgaribay.net/comments/commentRss/323.aspx http://rickgaribay.net/services/trackbacks/323.aspx New Article in CODE Magazine on Azure Service Bus Queues &amp; Topics http://rickgaribay.net/archive/2011/10/26/new-article-in-code-magazine-on-azure-service-bus-queues.aspx <p>I am pleased to share that my new article on <a href="http://www.code-magazine.com/article.aspx?quickid=1112041">Azure Service Bus Queues and Topics</a> has just been published by <a href="http://www.code-magazine.com/SearchResults.aspx?search=garibay">CODE Magazine</a>.</p> <p>CODE Magazine is a leading Microsoft technical journal with a worldwide in-print circulation in excess of 20,000 along with on-line, <a href="http://www.xiine.com/">Xiine</a> and <a href="http://www.amazon.com/CODE-Magazine-2011-Nov-ebook/dp/B005XN7RFA/ref=sr_1_8?s=digital-text&amp;ie=UTF8&amp;qid=1319558915&amp;sr=1-8">Amazon Kindle</a> media distribution. CODE is distributed to a combination of paid subscriptions, quali<a target="_blank" href="http://www.code-magazine.com/Index.aspx"><img style="BACKGROUND-IMAGE: none; BORDER-RIGHT-WIDTH: 0px; MARGIN: 2px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: right; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" title="image" border="0" alt="image" align="right" width="164" height="210" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/New-Article-on-Azure-Service-Bus-Queues-_866B/image_3.png" /></a>fied requests, and newsstand sales. In addition, CODE Magazine has bonus distribution at targeted Microsoft-oriented conferences and targeted industry events throughout the year such as Microsoft Professional Developer Conference (PDC), Tech Ed, DevTeach, MVP Global Summit, DevConnections, Devscovery, QCon, Code Camps, and more!</p> <p>Here is the link to the article: <a href="http://www.code-magazine.com/article.aspx?quickid=1112041">http://www.code-magazine.com/article.aspx?quickid=1112041</a></p> <p>The article covers critical capabilities provided by Azure Service Bus for composing distributed messaging solutions for the hybrid enterprise and how the latest release delivers on the Software + Services vision that was first laid out over five years ago. </p> <p>The new release includes the addition of Queues and Topics which build on top of an already robust set of capabilities introducing new levels of reliability for building loosely coupled distributed solutions across a variety of clients and services, be they on-premise, in the cloud, or a combination of the two.</p> <p>There are many exciting changes happening within Microsoft around integration and middleware, and the release of Service Bus Brokered Messaging/Queues and Topics is a strong reflection of the commitment to the platform that I believe is going to make this new wave of innovation more exciting than ever before.</p> <p>It has been a tremendous privilege to have the opportunity to work with the Azure Service Bus team and experiment with the early bits ahead of release. I’d like to thank Todd Holmquist-Sutherland, <a target="_blank" href="http://twitter.com/clemensv">Clemens Vasters</a>, <a target="_blank" href="http://twitter.com/@AbhishekRLal">Abhishek Lal</a> and <a target="_blank" href="http://twitter.com/@dingha">David Ingham</a> for the unprecedented access to their team, resources and information as well as kindly and patiently answering my many questions over the last several weeks.</p> <p>Long live messaging!</p><img src="http://rickgaribay.net/aggbug/320.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2011/10/26/new-article-in-code-magazine-on-azure-service-bus-queues.aspx Wed, 26 Oct 2011 17:20:03 GMT http://rickgaribay.net/archive/2011/10/26/new-article-in-code-magazine-on-azure-service-bus-queues.aspx#feedback http://rickgaribay.net/comments/commentRss/320.aspx http://rickgaribay.net/services/trackbacks/320.aspx New Microsoft Whitepaper on Extending WCF Apps for Windows Azure http://rickgaribay.net/archive/2011/03/07/new-microsoft-whitepaper-on-extending-wcf-apps-for-windows-azure.aspx <p><a href="http://www.microsoft.com/en-us/cloud/developer/resource.aspx?resourceId=developing-and-extending-apps" target="_blank"><img style="background-image: none; border-right-width: 0px; margin: 6px 8px 4px 4px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/New-Microsoft-Whitepaper-on-Extending-WC_9EBB/image_5.png" width="244" height="228" /></a>I’m pleased to share that Microsoft has just published my whitepaper “<a href="http://www.microsoft.com/en-us/cloud/developer/resource.aspx?resourceId=developing-and-extending-apps" target="_blank">Developing and Extending Apps for Windows Azure with Visual Studio</a>”: <a href="http://www.microsoft.com/en-us/cloud/developer/resource.aspx?resourceId=developing-and-extending-apps" target="_blank">http://www.microsoft.com/en-<a href="http://msdn.microsoft.com/visualstudio" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/New-Microsoft-Whitepaper-on-Extending-WC_9EBB/image_15.png" width="230" height="29" /></a>us/cloud/developer/resource.aspx?resourceId=developing-and-extending-apps</a></p> <p>In this whitepaper, I summarize the significance of cloud computing today and disambiguate the differences between Software as a Service (SaaS), Platform and a Service (PaaS) and Infrastructure as a Service (IaaS) before providing you with an introduction to Windows Azure.<a href="http://msdn.microsoft.com/netframework" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 3px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/New-Microsoft-Whitepaper-on-Extending-WC_9EBB/image_16.png" width="136" height="34" /></a></p> <p>I then show you how to extend an existing WCF 4.0 application service for deployment to Windows Azure with Visual Studio by adding a Windows Azure Project and associating it with a web role. Then I demonstrate how simple Visual Studio 2010 makes testing a cloud application locally before packaging it for deployment to Windows Azure and walk you through the complete Windows Azure Management Portal experience.</p> <p>If you are evaluating Windows Azure, and want to understand what the development<a title="http://www.microsoft.com/en-us/cloud/developer/resource.aspx?resourceId=developing-and-extending-apps" href="http://msdn.microsoft.com/azure" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 3px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://rickgaribay.net/images/rickgaribay_net/Windows-Live-Writer/New-Microsoft-Whitepaper-on-Extending-WC_9EBB/image_726311e7-1e1e-425a-8c69-423ff9906ed6.png" width="218" height="34" /></a>, deployment and management lifecycle looks like with Visual Studio 2010, then this is the whitepaper for you!</p> <p>Special thanks to my editor, Erik Ruthruff at A23 Consulting and the great folks at EPS for your team work and stellar collaboration.</p><img src="http://rickgaribay.net/aggbug/303.aspx" width="1" height="1" /> Rick G. Garibay http://rickgaribay.net/archive/2011/03/07/new-microsoft-whitepaper-on-extending-wcf-apps-for-windows-azure.aspx Mon, 07 Mar 2011 18:51:38 GMT http://rickgaribay.net/archive/2011/03/07/new-microsoft-whitepaper-on-extending-wcf-apps-for-windows-azure.aspx#feedback http://rickgaribay.net/comments/commentRss/303.aspx http://rickgaribay.net/services/trackbacks/303.aspx