<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Clemens Vasters</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Connecting Stuff.</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Tue, 01 Jun 2010 21:15:06 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>clemensv@microsoft.com</managingEditor>
    <webMaster>clemensv@microsoft.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/clemensv" /><feedburner:info uri="clemensv" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>47.67903</geo:lat><geo:long>-122.193409</geo:long><item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=daa81750-f570-46e1-a38a-05d008e57585</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=daa81750-f570-46e1-a38a-05d008e57585</wfw:commentRss>
      
      <title>TechEd: ASI204 Windows Azure Platform AppFabric Overview</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/HMOATuiy8xY/PermaLink,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</link>
      <pubDate>Tue, 01 Jun 2010 21:15:06 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Room 398, Tuesday June 8 &#xD;
&lt;br&gt;&#xD;
3:15pm-4:30pm &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
Session Type: Breakout Session &#xD;
&lt;br&gt;&#xD;
Track: Application Server &amp;amp; Infrastructure &#xD;
&lt;br&gt;&#xD;
Speaker(s): Maggie Myslinska &#xD;
&lt;br&gt;&#xD;
Level: 200 – Intermediate &#xD;
&lt;br&gt;&lt;br&gt;&lt;em&gt;Come learn how to use Windows Azure AppFabric (with Service Bus and Access Control)&#xD;
as building block services for Web-based and hosted applications, and how developers&#xD;
can leverage services to create applications in the cloud and connect them with on-premises&#xD;
systems.&lt;/em&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you are planning on seeing &lt;a href="http://vasters.com/clemensv/PermaLink,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx"&gt;Juval’s&#xD;
and my talk ASI304 at TechEd&lt;/a&gt; and/or if you need to know more about how &lt;a href="http://www.microsoft.com/windowsazure/appfabric/"&gt;Windows&#xD;
Azure AppFabric&lt;/a&gt; enables federated cloud/on-premise applications and a range of&#xD;
other scenarios, you should definitely put &lt;a href="http://northamerica.msteched.com/ScheduleBuilder?keyword=asi204"&gt;Maggie’s&#xD;
talk onto your TechEd schedule&lt;/a&gt; as well.  &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=daa81750-f570-46e1-a38a-05d008e57585"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=HMOATuiy8xY:r21_oLmi5ec:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=HMOATuiy8xY:r21_oLmi5ec:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=HMOATuiy8xY:r21_oLmi5ec:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=HMOATuiy8xY:r21_oLmi5ec:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=HMOATuiy8xY:r21_oLmi5ec:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/HMOATuiy8xY" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</comments>
      <category>AppFabric</category>
      <category>Talks</category>
      <category>Talks/TechEd US</category>
      <category>Technology</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,daa81750-f570-46e1-a38a-05d008e57585.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=3ce38507-44b7-4a2a-bacb-aeb7aaacdf56</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3ce38507-44b7-4a2a-bacb-aeb7aaacdf56</wfw:commentRss>
      
      <title>TechEd: ASI302 Design Patterns, Practices, and Techniques with the Service Bus in Windows Azure AppFabric</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/R3bfjPi5fg4/PermaLink,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</link>
      <pubDate>Fri, 28 May 2010 11:40:19 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Room 265, Thursday June 10 &#xD;
&lt;br&gt;&#xD;
9:45AM – 11:00 AM &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
Session Type: Breakout Session &#xD;
&lt;br&gt;&#xD;
Track: Application Server &amp;amp; Infrastructure &#xD;
&lt;br&gt;&#xD;
Speaker(s): Clemens Vasters, Juval Lowy&lt;strong&gt;&lt;br&gt;&lt;/strong&gt;Level: 300 - Advanced &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;em&gt;The availability of the Service Bus in Windows Azure AppFabric is disruptive since&#xD;
it enables new design and deployment patterns that are simply inconceivable without&#xD;
it, opening new horizons for architecture, integration, interoperability, deployment,&#xD;
and productivity. In this unique session organized especially for Tech·Ed, Clemens&#xD;
Vasters and Juval Lowy share their perspective, techniques, helper classes, insight,&#xD;
and expertise in architecting solutions using the service bus. Learn how to manage&#xD;
discrete events, how to achieve structured programming over the Service Bus buffers,&#xD;
what options you have for discovery and even how to mimic WCF discovery, what are&#xD;
the recommended options for transfer security and application authentication, and&#xD;
how to use AppFabric Service Bus for tunneling for diagnostics or logging, to enabling&#xD;
edge devices. The session ends with a glimpse at what is in store for the next versions&#xD;
of the service bus and the future patterns.&lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Yes, that's Juval and myself on the same stage. That'll be interesting.&lt;em&gt; &lt;/em&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3ce38507-44b7-4a2a-bacb-aeb7aaacdf56"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=R3bfjPi5fg4:pTPir8938zY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=R3bfjPi5fg4:pTPir8938zY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=R3bfjPi5fg4:pTPir8938zY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=R3bfjPi5fg4:pTPir8938zY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=R3bfjPi5fg4:pTPir8938zY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/R3bfjPi5fg4" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</comments>
      <category>AppFabric</category>
      <category>Azure</category>
      <category>Talks</category>
      <category>Talks/TechEd US</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,3ce38507-44b7-4a2a-bacb-aeb7aaacdf56.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=29ec4fe1-65d8-467e-8360-ce50a2ccd1ff</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=29ec4fe1-65d8-467e-8360-ce50a2ccd1ff</wfw:commentRss>
      
      <title>NT Konferenca 2010 - Windows Azure Slidedecks</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/Dmjyb1oA6hk/PermaLink,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</link>
      <pubDate>Tue, 25 May 2010 07:08:59 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I put the slides for my talks at NT Konferenca 2010 &lt;a href="http://cid-123ccd2a7ab10107.skydrive.live.com/browse.aspx/NT%20Konferenca%202010"&gt;on&#xD;
SkyDrive&lt;/a&gt;. The major difference from my &lt;a href="http://vasters.com/clemensv/PermaLink,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx"&gt;APAC&#xD;
slides&lt;/a&gt; is that I had to put compute and storage &lt;a href="http://cid-123ccd2a7ab10107.skydrive.live.com/self.aspx/NT%20Konferenca%202010/NTK2010-Azure-CapabilitiesAndTips.pptx"&gt;into&#xD;
one deck&lt;/a&gt; due to the conference schedule, but instead of purely consolidating and&#xD;
cutting down the slide count,  I also incorporated some common patterns coming&#xD;
out from debates in Asia and added slides on predictable and dynamic scaling as well&#xD;
as on multitenancy. Sadly, I need to rush through all that in 45 minutes&#xD;
today. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;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="http://cid-123ccd2a7ab10107.skydrive.live.com/embedicon.aspx/NT%20Konferenca%202010" frameborder="0" marginwidth="0" scrolling="no"&gt;&#xD;
          &lt;/iframe&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=29ec4fe1-65d8-467e-8360-ce50a2ccd1ff"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=Dmjyb1oA6hk:TXhfZ-eAZ4k:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=Dmjyb1oA6hk:TXhfZ-eAZ4k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=Dmjyb1oA6hk:TXhfZ-eAZ4k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=Dmjyb1oA6hk:TXhfZ-eAZ4k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=Dmjyb1oA6hk:TXhfZ-eAZ4k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/Dmjyb1oA6hk" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture</category>
      <category>Azure</category>
      <category>Talks</category>
      <category>Technology</category>
      <category>Technology/Web Services</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,29ec4fe1-65d8-467e-8360-ce50a2ccd1ff.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=cb6599da-5785-4186-8ca1-68a0f32f4495</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=cb6599da-5785-4186-8ca1-68a0f32f4495</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Windows Azure Speaking Tour Slides</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/E6lex1qpW38/PermaLink,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</link>
      <pubDate>Sun, 16 May 2010 08:31:17 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I'm on a tour through several countries right now and I'm talking to ISVs about&#xD;
the Windows Azure platform, its capabilities and the many opportunities ISVs have&#xD;
to transform the way they do business by moving to the cloud. The first day of the&#xD;
events is an introduction to the platform at the capability level; it's not a coding&#xD;
class, that would be impossible to fit.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://cid-123ccd2a7ab10107.skydrive.live.com/browse.aspx/APAC%20Azure%20ISV"&gt;I've&#xD;
shared the slides on SkyDrive&lt;/a&gt;. Steal liberally if you find the material useful.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;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="http://cid-123ccd2a7ab10107.skydrive.live.com/embedicon.aspx/APAC%20Azure%20ISV" frameborder="0" marginwidth="0" scrolling="no"&gt;&#xD;
        &lt;/iframe&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=cb6599da-5785-4186-8ca1-68a0f32f4495"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=E6lex1qpW38:SQ92wB9bvFU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=E6lex1qpW38:SQ92wB9bvFU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=E6lex1qpW38:SQ92wB9bvFU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=E6lex1qpW38:SQ92wB9bvFU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=E6lex1qpW38:SQ92wB9bvFU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/E6lex1qpW38" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture</category>
      <category>Azure</category>
      <category>Talks</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,cb6599da-5785-4186-8ca1-68a0f32f4495.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa</wfw:commentRss>
      
      <title>Hosting Service Bus endpoints in IIS and Server AppFabric (Dublin)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/4tvUBTZ-cxY/PermaLink,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</link>
      <pubDate>Sun, 09 May 2010 23:45:33 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
My office neighbor, our Service Bus Test Lead Vishal Chowdhary put together a bundle&#xD;
of code and documentation for how to use Service Bus with Server AppFabric and IIS&#xD;
7.5. Here: &lt;a title="http://code.msdn.microsoft.com/ServiceBusDublinIIS" href="http://code.msdn.microsoft.com/ServiceBusDublinIIS"&gt;http://code.msdn.microsoft.com/ServiceBusDublinIIS&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=4tvUBTZ-cxY:ECMuxPArNxY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=4tvUBTZ-cxY:ECMuxPArNxY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=4tvUBTZ-cxY:ECMuxPArNxY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=4tvUBTZ-cxY:ECMuxPArNxY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=4tvUBTZ-cxY:ECMuxPArNxY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/4tvUBTZ-cxY" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</comments>
      <category>AppFabric</category>
      <category>Azure</category>
      <category>Technology/Web Services</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,238db3c9-4d49-4c6f-8ff9-a37eaae3eeaa.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=48e07ce2-dbbb-4bdf-89f0-966cb0b35533</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=48e07ce2-dbbb-4bdf-89f0-966cb0b35533</wfw:commentRss>
      
      <title>UA 875 SEA NRT</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/5P4nh2woXVs/PermaLink,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</link>
      <pubDate>Sun, 09 May 2010 07:28:04 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
It’s not a revival of my career as a traveling talking head, but it sure feels a bit&#xD;
like old days. I’m on United 875 from Seattle to Tokyo/Narita right now, somewhere&#xD;
above the North Pacific. A few hours more to go and then I’ll be connecting to Singapore&#xD;
and I’m guessing that I’ll be at my hotel sometime between 1am and 2am on Monday morning. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’ll spend two days in Singapore as part of a Windows Azure ISV workshop series that&#xD;
has been organized by our field colleagues in the APAC region; the first day I’ll&#xD;
be presenting the all-up Windows Azure Platform –Compute, Storage, Management and&#xD;
Diagnostics, Database, Service Bus, Access Control, and the additional capabilities&#xD;
we’ll be adding over the next several months. On day two, I’ll be meeting for 1:1s&#xD;
with a range of customers about their plans to move applications to the cloud. That&#xD;
pattern will repeat over the next two weeks in Kuala Lumpur/Malaysia (this Thu/Fri),&#xD;
in Manila/Philippines (next Mon/Tue), and in Seoul/South Korea (next Wed/Thu). From&#xD;
Seoul onwards, some of my colleagues will take over and go to Sydney and Auckland,&#xD;
while I’m flying further westwards to Europe to speak at the NT Konferenca in Slovenia&#xD;
before returning to Seattle after a short stopover in Germany to see the folks.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once I’m back in Seattle I’ve got 5 days at the office to debrief and prep for TechEd&#xD;
North America and then it’s off to New Orleans for the week and then, after a weekend&#xD;
stopover in Seattle, I’m off to the NDC 2010 conference in Oslo/Norway. It’s definitely&#xD;
the most flying I’ve done since I work for Microsoft. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The 1:1 meeting opportunities at the workshops in Asia, at NT Konferenca, at TechEd,&#xD;
and at the NDC2010 is what this tour is all about for me. It’s about reaching out&#xD;
and feeling the pulse of the customer landscape. That is very, very different from&#xD;
back when I was a traveling talking head explaining the platform. That’s not to say&#xD;
that there wasn’t a lot of value in teaching back then. Conference and workshop attendees&#xD;
learned a lot and Microsoft got the word out. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Back in the day it was all about outbound communication; and you can probably tell&#xD;
by my blog having been practically dead over the last 2-3 years that that hasn’t been&#xD;
my focus anymore. But what about the other way? You’d think that Microsoft is overwhelmed&#xD;
with incoming data and swims in requirements and scenarios and customer input. That’s&#xD;
right, we are. As a company. The problem for us in the product teams is that we’re&#xD;
getting much of that data in a very indirect and filtered form, which is simply because&#xD;
we are a very big and global company. Another problem (or danger) is to be tricked&#xD;
into believing that the entire truth can be found online and via feedback mechanisms&#xD;
like forums or even Facebook and Twitter. None of that replaces an hour of high-bandwidth,&#xD;
eye-to-eye conversation with someone whose business is not primarily (or not at all)&#xD;
about software, but for whom software is a mere necessity to get their products and&#xD;
services to their customers. It’s my firm belief that you have to get into a plane&#xD;
sometimes and go where the customers are. Luckily, my boss agrees. So here I am.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Some of the customers I’ll be talking to in 1:1s already have firm plans and want&#xD;
to talk architecture, some don’t know whether it’s a good decision for them and want&#xD;
to dig into details, some have made a decision for the cloud but went with another&#xD;
competing platform, and some don’t want or can’t move anything to our cloud yet, because&#xD;
that platform isn’t doing what they need. The latter two types of customers are the&#xD;
ones I’m most looking forward to meet.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The events in Asia are run in relatively small venue and my understanding is that&#xD;
my 1:1 days are booked out. I don’t think that’s true for the events in Slovenia,&#xD;
New Orleans, and in Oslo. If you plan on going and you are interested in spending&#xD;
an hour talking about what you’d like to see in Windows Azure and specifically in&#xD;
Windows Azure AppFabric then shoot me an email to clemensv at microsoft dot com in&#xD;
the next few days. And if you’re not going tell your friends who do ;-) &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
(Oh, and: United, did you buy your business class seats third-hand from TWA after&#xD;
they picked them up from PanAm?)&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=48e07ce2-dbbb-4bdf-89f0-966cb0b35533"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=5P4nh2woXVs:kbyB9TlYOUw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=5P4nh2woXVs:kbyB9TlYOUw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=5P4nh2woXVs:kbyB9TlYOUw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=5P4nh2woXVs:kbyB9TlYOUw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=5P4nh2woXVs:kbyB9TlYOUw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/5P4nh2woXVs" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</comments>
      <category>AppFabric</category>
      <category>Travel</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,48e07ce2-dbbb-4bdf-89f0-966cb0b35533.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=10b18ef5-b302-4591-8335-593a184633cd</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=10b18ef5-b302-4591-8335-593a184633cd</wfw:commentRss>
      
      <title>United EmPower and my ThinkPad T60p: iGo everywhereMAX</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/UjT0m715ZqQ/PermaLink,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</link>
      <pubDate>Sun, 09 May 2010 07:26:32 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
When I thought about what to pack for this trip on Friday night, I checked once again&#xD;
what aircraft I’d be on: United 777 International configuration. Oh, the horror! “EmPower”.&#xD;
In case you don’t know what that means: EmPower is a proprietary power outlet providing&#xD;
15V DC with a maximum of 75W. It practically only exists on aircraft and it’s a gold-mine&#xD;
for companies selling extra power-supplies for Notebooks and practically any other&#xD;
electronic device that you might use while on an aircraft – and lucky enough to sit&#xD;
somewhere towards the front of the aircraft.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now, if it’s not yet obvious, let me be clear: I believe that having to buy some extra&#xD;
adapter to power my notebook in business class is a scandal. It may be my previous&#xD;
Lufthansa bias, but I think these outlets ought to be following some real-world standard,&#xD;
even if that were 115V/60Hz AC. But none of the complaining is helping me power the&#xD;
notebook, so I broke down and bought the required adapter at SeaTac airport this morning:&#xD;
iGo everywhereMAX. 139.99 + tax. One-hundred-and-forty bucks. For a power adapter.&#xD;
That’s a rip-off. This should be illegal. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It does what it is advertised to do. There’s a standard U.S. power cable and a “works&#xD;
on the plane and in your car and on your boat” adapter that’s EmPower compatible once&#xD;
you pull the standard cigarette-lighter adapter off. The package comes with a plastic&#xD;
bag of notebook adapters and the coverage is indeed very good; all the notebooks in&#xD;
the family and the ones I use for work are on the list. Acer, Dell, Toshiba, Sony,&#xD;
Compaq, Gateway, HP, … &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’d be unhappy if I owned a Mac, because there doesn’t seem to be any support for&#xD;
Apple machines. I’m a PC, I have power on this flight :)&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You’d think that the extra power outlet for devices (phones, music players, etc) would&#xD;
be based on something reasonably standard – USB maybe. Noooo! It’s some weird only-compatible-with-this-power-adapter&#xD;
plug that iGo must have made up while laughing evilly. You can get a USB plug, but&#xD;
you will have to buy that extra. Also, the AC power cord won’t do me any good in countries&#xD;
that aren’t using the two-blade U.S. power plug (—&amp;gt; most countries). Lucky me,&#xD;
I already brought a universal adapter along, because my new $140-plus-tax electric-engineering&#xD;
masterpiece wouldn’t me of much use on the ground. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Given the number of hour I’ll spend on aircraft in the upcoming weeks I wonder whether&#xD;
my execusphere is going to let me expense it.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=10b18ef5-b302-4591-8335-593a184633cd"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=UjT0m715ZqQ:q0PZMCLkaRk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=UjT0m715ZqQ:q0PZMCLkaRk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=UjT0m715ZqQ:q0PZMCLkaRk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=UjT0m715ZqQ:q0PZMCLkaRk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=UjT0m715ZqQ:q0PZMCLkaRk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/UjT0m715ZqQ" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,10b18ef5-b302-4591-8335-593a184633cd.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Writing talent is a terrible thing to waste. Not that I have any.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/OGqumwTYuzI/PermaLink,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</link>
      <pubDate>Sun, 09 May 2010 07:25:44 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I really should pick up blogging again. Between the ephemeral twitter, foursquare,&#xD;
and facebook grows the need for something more sticky.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=OGqumwTYuzI:j57Dnx9VoU8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=OGqumwTYuzI:j57Dnx9VoU8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=OGqumwTYuzI:j57Dnx9VoU8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=OGqumwTYuzI:j57Dnx9VoU8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=OGqumwTYuzI:j57Dnx9VoU8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/OGqumwTYuzI" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,82a4b1f7-bbe3-46f5-9d59-cd5b9c6f851d.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=bf4c0637-7829-44e3-a2c4-0f2f135fb686</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=bf4c0637-7829-44e3-a2c4-0f2f135fb686</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>The Rough Setup Script for PDC09 SVC18 - Getting DinnerNow! to run on Windows Azure</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/8MG8MELF70I/PermaLink,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</link>
      <pubDate>Mon, 23 Nov 2009 23:42:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
At the bottom of this post you’ll find the DinnerNow version that I’ve been using&#xD;
for my PDC09 talk. The video of that talk is now available at &lt;a title="http://microsoftpdc.com/Sessions/SVC18" href="http://microsoftpdc.com/Sessions/SVC18"&gt;http://microsoftpdc.com/Sessions/SVC18&lt;/a&gt; and&#xD;
I recommend that you listen to the talk for context. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The DinnerNow drop I’m sharing here is a customized version of the &lt;a href="http://dinnernow.net/"&gt;DinnerNow&#xD;
3.1 version that’s up on CodePlex&lt;/a&gt;. If I were you, I’d install the original version&#xD;
and then unpack my zip file alongside of it and then use some kind of diff tool (the&#xD;
Windows SDK’s WinDiff tool is a start) to look at the differences between the versions.&#xD;
That will give you a raw overview of what I had to do. You’ll find that I had to add&#xD;
and move a few things, but that the app didn’t change in any radical way.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Remember that looking at the code is more important that making it run. There’s one&#xD;
particular challenge you’d have right now with the Windows Azure CTP and that’s getting&#xD;
the two (!) Windows Azure compute tokens needed for separating out the web and the&#xD;
service tier as I’ve done here. It’s not difficult to consolidate the Web and the&#xD;
Web Service tier into a single role, but since I had to do the migration within a&#xD;
short period of time, I chose to split them up. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
FWIW, I time-boxed the migration to 3 work days – which included learning about what&#xD;
our buddies over in SQL Azure had done in the past months — and that turned out to&#xD;
be a comfortable fit in terms of time.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Another function of time-boxing is that you’re finding me disabling security on most&#xD;
endpoints, including disabling the Access Control integration with Service Bus for&#xD;
most endpoints by setting the &lt;em&gt;relayClientAuthenticationType&lt;/em&gt; attribute on&#xD;
the respective binding elements to &lt;em&gt;None&lt;/em&gt;. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I know that’s a sin, but I didn’t want to cause too much churn in the first iteration.&#xD;
The original version of DinnerNow is conveniently using Windows authentication/authorization&#xD;
for its communication paths. While that’s ok for a LAN setup, things get more complicated&#xD;
for an actual WAN setup that the DinnerNow scenario calls for. That would spawn a&#xD;
wholly different discussion that shines the spotlight on our Access Control service&#xD;
and why it’s useful – even required – for that scenario. In order not to overwhelm&#xD;
everyone, I left that out for this round and will revisit that aspect in the next&#xD;
weeks – or maybe one of our (aspiring?) MVPs or RDs will beat me to it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’m also going to work with the guys who wrote DinnerNow to find a way to host this&#xD;
modified version of Dinner Now with the on-premise runtime bits expressly not on my&#xD;
primary dev machine, where they’d live now. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Here what you need to do to get it to run&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I know this is rough. Writing up the long version of this is going to take some time&#xD;
and I prefer getting the bits to you early over me sitting here writing pages of docs.&#xD;
Maybe you can even help ;-) &#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
First, you’ll need to go to the Windows Azure portal and get the SDKs and tokens/accounts.&#xD;
The &lt;a href="http://www.microsoft.com/windowsazure/getstarted/"&gt;Getting Started&lt;/a&gt; page&#xD;
has all the data and links you need so I’m not going to repeat them here in much detail.&#xD;
You will need at least one Windows Azure compute account (&lt;a href="https://connect.microsoft.com/Survey/NominationSurvey.aspx?SurveyID=7044&amp;amp;ProgramID=2500&amp;amp;SiteID=681"&gt;apply&#xD;
here&lt;/a&gt;), one SQL Azure account (&lt;a href="https://connect.microsoft.com/SQLAzure/Survey/NominationSurvey.aspx?SurveyID=5719&amp;amp;ProgramID=2089"&gt;apply&#xD;
here&lt;/a&gt;), and an AppFabric account (no application needed, &lt;a href="https://netservices.azure.com/"&gt;just&#xD;
log in w/ LiveID&lt;/a&gt;).  &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Download and install the regular version &lt;a href="http://dinnernow.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31480"&gt;DinnerNow&#xD;
3.1 from Codeplex&lt;/a&gt;. This will drop a “Configure DinnerNow 3.1” shortcut on your&#xD;
desktop. Run that, install all prerequisites and make sure DinnerNow runs locally&#xD;
before you proceed. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
You will later need the databases that the setup created in your local SQLEXPRESS&#xD;
instance by setup. You’ll have to make a few changes, though. &#xD;
&lt;ol&gt;&lt;li&gt;&#xD;
First, (&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=08E52AC2-1D62-45F6-9A4A-4B76A8564A2B&amp;amp;displaylang=en"&gt;download,&#xD;
install&lt;/a&gt;, and) open SQL Server Management Studio, connect to your SQL Server Express&#xD;
instance and switch to “SQL Server and Windows Authentication mode” on the &lt;em&gt;Server&#xD;
Properties&lt;/em&gt; under &lt;em&gt;Security&lt;/em&gt;. Then you’ll need to go to to the Security&#xD;
settings and either create a new account and grant it all rights on the &lt;strong&gt;aspnetdb&lt;/strong&gt; database&#xD;
or just enable the ‘sa’ account and set its password.  &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Then you need to find the “SQL Server Configuration Manager” and enable TCP for your&#xD;
SQLEXPRESS instance &lt;a href="http://msdn.microsoft.com/en-us/library/ms165718.aspx"&gt;like&#xD;
this&lt;/a&gt;. The default port will be 1433. If you have a full SQL Server instance on&#xD;
your dev machine and it’s configured for TCP the easiest is to suspend that for the&#xD;
moment and allow the SQLEXPRESS instance to squat the port.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Unpack the ZIP file appended below into a directory on your machine. At this point&#xD;
it should be ok to override the existing DinnerNow directory, but I’d keep things&#xD;
side-by-side for reference. If you copy side-by-side, grab the ./solution/DinnerNow&#xD;
– Web/DinnerNow.WebUX/images/’ directory from your local installation and copy it&#xD;
into the location where you unzipped the file here. I left out the images due to their&#xD;
size. And just as with the normal DinnerNow installation you’ll find a solution file&#xD;
named “&lt;strong&gt;DinnerNow  - Main.sln&lt;/strong&gt;” in the unpacked directory – open&#xD;
that in Visual Studio 2008 (not 2010!) because you’ll have to make some changes and&#xD;
edits. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you are lucky enough to have two Windows Azure compute accounts, you can skip this&#xD;
step. Otherwise, you will have to restructure the application a bit:  &#xD;
&lt;ol&gt;&lt;li&gt;&#xD;
In the &lt;em&gt;“DinnerNow – WA” &lt;/em&gt;solution branch where the Windows Azure deployment&#xD;
project reside you’ll have to consolidate the &lt;em&gt;DinnerNow.WindowsAzure&lt;/em&gt; project&#xD;
and the &lt;em&gt;DinnerNow.WindowsAzureAppSrv &lt;/em&gt;projects into one by replicating the &lt;em&gt;DinnerNow.DBBridge&lt;/em&gt; reference&#xD;
into the &lt;em&gt;DinnerNow.WindowsAzure&lt;/em&gt; project and abandoning/deleting the rest. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
In the “&lt;em&gt;DinnerNow – Web”&lt;/em&gt; solution branch you will have to modify the &lt;em&gt;DinnerNow.WebUX&lt;/em&gt; project&#xD;
by merging the DinnerNow.ServiceHost project from the “&lt;em&gt;DinnerNow -ServicePortfolio2” &lt;/em&gt;branch&#xD;
into it, including merging the config files. In the original DinnerNow the hosting&#xD;
default is that the ServiceHost  project lives in the ./services subdirectory&#xD;
of the WebUX app. You can also do it that way, but you’ll have to change the respective&#xD;
client URIs to point to the right path.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
In the ./database directory is a file called &lt;em&gt;SQLAzureImport.sql. &lt;/em&gt;That’s the&#xD;
exported and customized script for the DinnerNow restaurants and menus database. Create&#xD;
a new database (1GB is enough) and load the DB with this script. You can do this with&#xD;
the command line or with SQL Management Studio. &lt;a href="http://msdn.microsoft.com/en-us/library/ee621784.aspx"&gt;The&#xD;
SQL Azure docs will tell you how&lt;/a&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Now you’ll need to do a range of search/replace steps across the whole project. These&#xD;
are mostly in *.config files - a few places are in the code, which I count as bugs,&#xD;
but those are faithfully carried over from the original: &#xD;
&lt;ol&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;sqlazure-instance&lt;/strong&gt; and replace them with your&#xD;
unqualified SQL Azure &lt;em&gt;server name&lt;/em&gt; (might look like this: tn0a1b2c3d) &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;sqlazure-dbname&lt;/strong&gt; and replace them with your&#xD;
SQL Azure &lt;em&gt;database name&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;sqlazure-acct&lt;/strong&gt; and replace them with your&#xD;
SQL Azure &lt;em&gt;administrator username&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;sqlazure-password&lt;/strong&gt; and replace them with your&#xD;
SQL Azure &lt;em&gt;administrator password&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;appfabricservicebus-ns&lt;/strong&gt; and replace them with&#xD;
your unqualified AppFabric &lt;em&gt;namespace name&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;appfabricservicebus-key&lt;/strong&gt; and replace them&#xD;
with your AppFabric &lt;em&gt;Service Bus&lt;/em&gt;&lt;em&gt;issuer key&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;windowsazuresvcrole-acct&lt;/strong&gt; and replace them&#xD;
with the name of your Windows Azure compute account. If you have just one, use that&#xD;
(given you’ve done the rework in step 4), if you have two use the account-name where&#xD;
you will host the service tier. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Find all occurrences of &lt;strong&gt;sqlserver-password&lt;/strong&gt; and replace them with&#xD;
your &lt;em&gt;local&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;SQL Server Express instance’s ‘sa’ account password. &#xD;
&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Do a full batch Rebuild of the whole project &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Go to the “DinnerNow –WA” solution and publish the project(s) to your Windows Azure&#xD;
compute account(s). If you had to consolidate them you’ll have one package to deploy,&#xD;
if you left things as they are you’ll have two packages to deploy. You can also run&#xD;
these packages in the local DevFabric to test things out. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The executables you need to run are going to be dropped into the .\bin directory by&#xD;
the build. You need to run all 6 apps – but you could run them on 6 different machines&#xD;
– the two workflow hosts each assume the local presence of the DinnerNowWF database: &#xD;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;CloudTraceRecorder.exe&lt;/strong&gt; – this is the simple event listener app. You&#xD;
can run this right away to observe the apps starting up inside of Azure as they write&#xD;
events to the event listener. You can and should run this as you deploy. You can run&#xD;
any number of instances of CloudTraceRecorder anywhere. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PortBridge.exe&lt;/strong&gt; – this is the on-premise bridge-head for bridging&#xD;
to your local SQL Server Express instance so that the cloud application can get at&#xD;
its membership database that you host for it on your machine. After the search/replace&#xD;
steps you will notice that you have modified connection strings that point to a SQL&#xD;
Server role peeking out of your *AppSrv role. The secret ingredient is in the DinnerNow.DBBridge&#xD;
role that’s listening for TCP connections on behalf of your on-premise SQL Server&#xD;
and that connects them down to your local server with the logic in &lt;em&gt;Microsoft.Samples.ServiceBus.Connections&lt;/em&gt;.&#xD;
This is the same code that’s in &lt;a href="http://vasters.com/clemensv/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx"&gt;PortBridge&lt;/a&gt;. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DinnerNow.OrderProcessingHost.exe&lt;/strong&gt; is the (new) host application for&#xD;
the workflow that handles the order process. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DinnerNow.RestaurantProcessingHost.exe&lt;/strong&gt; is the (new) host application&#xD;
for the workflow that handles the restaurant process. &#xD;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DinnerNowKiosk.exe&lt;/strong&gt; is the only slightly modified version of the DinnerNow&#xD;
in-restaurant kiosk &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Not in .\bin but rather to be started/deployed from VS is the also just slightly modified&#xD;
Windows Mobile app for the delivery app&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Please also mind that the DinnerNow Powershell support and the other test and diagnostics&#xD;
capabilities haven’t been touched here, yet. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Oh, and … this is provided as-is … I’ll do my best to discuss some of the patterns&#xD;
over the next several weeks, but I don’t have time to provide 1:1 support.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here’s the code:&#xD;
&lt;/p&gt;&#xD;
        &lt;a href="http://vasters.com/clemensv/content/binary/DinnerNow-SVC18-PDC09.zip"&gt;DinnerNow-SVC18-PDC09.zip&#xD;
(2.35 MB)&lt;/a&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=bf4c0637-7829-44e3-a2c4-0f2f135fb686"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=8MG8MELF70I:gwJCBDE5xDQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=8MG8MELF70I:gwJCBDE5xDQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=8MG8MELF70I:gwJCBDE5xDQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=8MG8MELF70I:gwJCBDE5xDQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=8MG8MELF70I:gwJCBDE5xDQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/8MG8MELF70I" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</comments>
      <category>.NET Services</category>
      <category>Azure</category>
      <category>Talks</category>
      <category>AppFabric</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,bf4c0637-7829-44e3-a2c4-0f2f135fb686.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=3e35d8bd-b755-453f-8c63-1a57c570eb4c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3e35d8bd-b755-453f-8c63-1a57c570eb4c</wfw:commentRss>
      <slash:comments>4</slash:comments>
      
      <title>Port Bridge</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/oSy2PCaDXTU/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</link>
      <pubDate>Wed, 18 Nov 2009 17:37:28 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Building “hybrid” cloud applications where parts of an an app lives up in a cloud&#xD;
infrastructure and other parts of the infrastructure live at a hosting site, or a&#xD;
data center, or even in your house ought to be simple – especially in this day and&#xD;
age of Web services. You create a Web service, make it accessible through your firewall&#xD;
and NAT, and the the cloud-hosted app calls it. That’s as easy as it ought to be.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Unfortunately it’s not always that easy. If the server sits behind an Internet connection&#xD;
with dynamically assigned IP addresses, if the upstream ISP is blocking select ports,&#xD;
if it’s not feasible to open up inbound firewall ports, or if you have no influence&#xD;
over the infrastructure whatsoever, reaching an on-premise service from the cloud&#xD;
(or anywhere else) is a difficult thing to do. For these scenarios (and others) our&#xD;
team is building the &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/azure/netservices.aspx"&gt;Windows&#xD;
Azure platform AppFabric&lt;/a&gt; Service Bus&lt;/em&gt; (friends call us just &lt;em&gt;Service Bus&lt;/em&gt;). &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now – the Service Bus and the client bits in the &lt;em&gt;Microsoft.ServiceBus.dll &lt;/em&gt;assembly&#xD;
are great if you have services can can be readily hooked up into the Service Bus because&#xD;
they’re built with WCF. For services that aren’t built with WCF, but are at least&#xD;
using HTTP, I’ve &lt;a href="http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx"&gt;previously&#xD;
shown a way&lt;/a&gt; to hook them into Service Bus and have also demoed an updated version&#xD;
of that capability at Sun’s Java One. I’ll release an update for those bits tomorrow&#xD;
after my talk at PDC09 – the version currently here on my blog (ironically) doesn’t&#xD;
play well with SOAP and also doesn’t have rewrite capabilities for WSDL. The new version&#xD;
does. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But what if your service isn’t a WCF service or doesn’t speak HTTP? What if it speaks&#xD;
SMTP, SNMP, POP, IMAP, RDP, TDS, SSH, ETC? &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Introducing Port Bridge&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
“Port Bridge” – which is just a descriptive name for this code sample, not an attempt&#xD;
at branding – is a point-to-point tunneling utility to help with these scenarios.&#xD;
Port Bridge consists of two components, the “Port Bridge Service” and the “Port Bridge&#xD;
Agent”. Here’s a picture:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/865a80e15ca0_D9A4/image_2.png"&gt;&#xD;
            &lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="image" border="0" alt="image" src="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/865a80e15ca0_D9A4/image_thumb.png" width="611" height="220"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The Agent’s job is to listen for and accept TCP or Named Pipe connections on a configurable&#xD;
port or local pipe name. The Service’s job is to accept for incoming connections from&#xD;
the Agent, establish a duplex channel with the Agent, and pump the data from the Agent&#xD;
to the actual listening service – and vice versa. It’s actually quite simple. In the&#xD;
picture above you see that the Service is configured to connect to a SQL Server listening&#xD;
at the SQL Server default port 1433 and that the Agent – running on a different machine,&#xD;
is listening on port 1433 as well, thus mapping the remote SQL Server onto the Agent&#xD;
machine as if it ran there. You can (and I think of that as to be more common) map&#xD;
the service on the Agent to any port you like – say higher up at 41433.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
In order to increase the responsiveness and throughput for protocols that are happy&#xD;
to kill and reestablish connections such as HTTP does, “Port Bridge” is always multiplexing&#xD;
concurrent traffic that’s flowing between two parties on the same logical socket.&#xD;
When using Port Bridge to bridge to a remote HTTP proxy that the Service machine can&#xD;
see, but the Agent machine can’t see (which turns out to be the at-home scenario that&#xD;
this capability emerged from) there are very many and very short-lived connections&#xD;
being tunneled through the channel. Creating a new Service Bus channel for each of&#xD;
these connections is feasible – but not very efficient. Holding on to a connection&#xD;
for an extended period of time and multiplexing traffic over it is also beneficial&#xD;
in the Port Bridge case because it is using the Service Bus &lt;em&gt;Hybrid&lt;/em&gt; connection&#xD;
mode by default. With &lt;em&gt;Hybrid&lt;/em&gt;, all connections are first established through&#xD;
the Service Bus Relay and then our bits do a little “NAT dance” trying to figure out&#xD;
whether there’s a way to connect both parties with a direct socket – if that works&#xD;
the connection gets upgraded to the most direct connections in-flight. The probing,&#xD;
handshake, and upgrade of the socket may take 2-20 seconds and there’s some degree&#xD;
of luck involved to get that direct socket established on a very busy NAT – and thus&#xD;
we want to maximize the use of that precious socket instead of throwing it away all&#xD;
the time.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;That seems familiar?!&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You may notice that &lt;a href="http://vasters.com/clemensv/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx"&gt;SocketShifter&lt;/a&gt; (built&#xD;
by our friends at &lt;a href="http://www.aws.net/"&gt;AWS in the UK&lt;/a&gt;) is quite similar&#xD;
to Port Bridge. Even though the timing of the respective releases may not suggest&#xD;
it, Port Bridge is indeed Socketshifter’s older brother. Because we couldn’t make&#xD;
up our mind on whether to release Port Bridge for a while, I had AWS take a look at&#xD;
the service contract shown below and explained a few principles that I’m also explaining&#xD;
here and they had a first version of Socketshifter running within a few hours. There’s&#xD;
nothing wrong with having two variants of the same thing. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;How does it work?&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Since I’m publishing this as a sample, I obviously need to spend a little time on&#xD;
the “how”, even I’ll limit that here and will explain that in more detail in a future&#xD;
post. At the heart of the app, the contract that’s used between the Agent and the&#xD;
Service is a simple duplex WCF contract:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="code"&gt;    [&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;(Namespace=&lt;span style="COLOR: #a31515"&gt;"n:"&lt;/span&gt;,&#xD;
Name=&lt;span style="COLOR: #a31515"&gt;"idx"&lt;/span&gt;, CallbackContract=&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR: #2b91af"&gt;IDataExchange&lt;/span&gt;),&#xD;
SessionMode=&lt;span style="COLOR: #2b91af"&gt;SessionMode&lt;/span&gt;.Required)] &lt;span style="COLOR: blue"&gt;public&#xD;
interface &lt;/span&gt;&lt;span style="COLOR: #2b91af"&gt;IDataExchange &lt;/span&gt;{ [&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;(Action=&lt;span style="COLOR: #a31515"&gt;"c"&lt;/span&gt;,&#xD;
IsOneWay = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;, IsInitiating=&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;)] &lt;span style="COLOR: blue"&gt;void &lt;/span&gt;Connect(&lt;span style="COLOR: blue"&gt;string &lt;/span&gt;i);&#xD;
[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;(Action = &lt;span style="COLOR: #a31515"&gt;"w"&lt;/span&gt;,&#xD;
IsOneWay = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;)] &lt;span style="COLOR: blue"&gt;void &lt;/span&gt;Write(&lt;span style="COLOR: #2b91af"&gt;TransferBuffer &lt;/span&gt;d);&#xD;
[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;(Action = &lt;span style="COLOR: #a31515"&gt;"d"&lt;/span&gt;,&#xD;
IsOneWay = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;, IsTerminating = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;)] &lt;span style="COLOR: blue"&gt;void &lt;/span&gt;Disconnect();&#xD;
}&lt;/pre&gt;&#xD;
        &lt;a href="http://11011.net/software/vspaste"&gt;&#xD;
        &lt;/a&gt;&#xD;
        &lt;p&gt;&#xD;
There’s a way to establish a session, send data either way, and close the session.&#xD;
The &lt;em&gt;TransferBuffer&lt;/em&gt; type is really just a trick to avoid extra buffer copies&#xD;
during serialization for efficiency reasons. But that’s it. The rest of Port Bridge&#xD;
is a set of queue-buffered streams and pumps to make the data packets flow smoothly&#xD;
and to accept inbound sockets/pipes and dispatch them out to the proxied services.&#xD;
What’s noteworthy is that Port Bridge doesn’t use WCF streaming, but sends data in&#xD;
chunks – which allows for much better flow control and enables multiplexing.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now you might say &lt;em&gt;You are using a WCF ServiceContract?&lt;/em&gt; &lt;em&gt;Isn’t that&#xD;
using SOAP and doesn’t that cause ginormous overhead?&lt;/em&gt; No, it doesn’t. We’re using&#xD;
the WCF binary encoder in session mode here. That’s about as efficient as you can&#xD;
get it on the wire with serialized data. The per-frame SOAP overhead for net.tcp with&#xD;
the binary encoder in session mode is in the order of 40-50 bytes per message because&#xD;
of dictionary-based metadata compression. The binary encoder also isn’t doing any&#xD;
base64 trickery but treats binary as binary – one byte is one byte. Port Bridge is&#xD;
using a default frame size of 64K (which gets filled up in high-volume streaming cases&#xD;
due to the built-in Nagling support) and so we’re looking at an overhead of far less&#xD;
than 0.1%. That’s not shabby. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;How do I use it?&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This is a code sample and thus you’ll have to build it using Visual Studio 2008. You’ll&#xD;
find three code projects: &lt;em&gt;PortBridge&lt;/em&gt; (the Service), &lt;em&gt;PortBridgeAgent&lt;/em&gt; (the&#xD;
Agent), and the &lt;em&gt;Microsoft.Samples.ServiceBus.Connections&lt;/em&gt; assembly that contains&#xD;
the bulk of the logic for Port Bridge. It’s mostly straightforward to embed the agent&#xD;
side or the service side into other hosts and I’ll show that in a separate post. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Service&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The service’s exe file is “PortBridge.exe” and is both a console app and a Windows&#xD;
Service. If the Windows Service isn’t registered, the app will always start as a console&#xD;
app. If the Windows Service is registered (with the installer or with installutil.exe)&#xD;
you can force console-mode with the –c command line option.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The app.config file on the Service Side (PortBridge/app.config, PortBridge.exe.config&#xD;
in the binaries folder) specifies what ports or named pipes you want to project into&#xD;
Service Bus:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="code"&gt;&#xD;
          &lt;span style="COLOR: blue"&gt; &amp;lt;&lt;/span&gt;&#xD;
          &lt;span style="COLOR: #a31515"&gt;portBridge &lt;/span&gt;&#xD;
          &lt;span style="COLOR: red"&gt;serviceBusNamespace&lt;/span&gt;&#xD;
          &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;mynamespace&lt;/span&gt;" &lt;span style="COLOR: red"&gt;serviceBusIssuerName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;owner&lt;/span&gt;" &lt;span style="COLOR: red"&gt;serviceBusIssuerSecret&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;xxxxxxxx&lt;/span&gt;" &lt;span style="COLOR: red"&gt;localHostName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;mybox&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;hostMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;localhost&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPorts&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;3389&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;hostMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portBridge&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
        &lt;a href="http://11011.net/software/vspaste"&gt;&#xD;
        &lt;/a&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;serviceBusNamespace&lt;/em&gt; attribute takes your Service Bus namespace name,&#xD;
and the &lt;em&gt;serviceBusIssuerSecret&lt;/em&gt; the respective secret. The &lt;em&gt;serviceBusIssuerName&lt;/em&gt; should&#xD;
remain “owner” unless you know why you want to change it. If you don’t have an &lt;em&gt;AppFabric &lt;/em&gt;account&#xD;
you might not understand what I’m writing about: &lt;a href="https://netservices.azure.com"&gt;Go&#xD;
make one&lt;/a&gt;.  &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;localHostName&lt;/em&gt; attribute is optional and when set, it’s the name that’s&#xD;
being used to map “localhost” into your Service Bus namespace. By default the name&#xD;
that’s being used is the good old Windows computer-name.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;hostMappings &lt;/em&gt;section contains a list of hosts and rules for what you&#xD;
want to project out to Service Bus. Mind that all inbound connections to the endpoints&#xD;
generated from the host mappings section are protected by the Access Control service&#xD;
and require a token that grants access to your namespace – which is already very different&#xD;
from opening up a port in your firewall. If you open up port 3389 (Remote Desktop)&#xD;
through your firewall and NAT, everyone can walk up to that port and try their password-guessing&#xD;
skills. If you open up port 3389 via Port Bridge, you first need to get through the&#xD;
Access Control gate before you can even get at the remote port. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
New host mappings are added with the &lt;em&gt;add&lt;/em&gt; element. You can add any host that&#xD;
the machine running the Port Bridge service can “see” via the network. The &lt;em&gt;allowedPorts &lt;/em&gt;and &lt;em&gt;allowedPipes&lt;/em&gt; attributes&#xD;
define with TCP ports and/or which local named pipes are accessible. Examples:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&#xD;
            &lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&#xD;
            &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;localhost&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPorts&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;3389&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project&#xD;
the local machine into Service Bus and only allow Remote Desktop (3389) &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&#xD;
            &lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&#xD;
            &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;localhost&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPorts&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;3389,1433&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project&#xD;
the local machine into Service Bus and allow Remote Desktop (3389) and SQL Server&#xD;
TDS (1433) &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&#xD;
            &lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&#xD;
            &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;localhost&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPorts&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;*&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project&#xD;
the local machine into Service Bus and only allow any TCP port connection &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&#xD;
            &lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&#xD;
            &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;localhost&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPipes&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;sql/query&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project&#xD;
the local machine into Service Bus and allow no TCP connections but all named pipe&#xD;
connections to \.\pipes\sql\query &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&#xD;
            &lt;span style="COLOR: #a31515"&gt;add &lt;/span&gt;&#xD;
            &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&#xD;
            &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;otherbox&lt;/span&gt;" &lt;span style="COLOR: red"&gt;allowedPorts&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;1433&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project&#xD;
the machine “otherbox” into Service Bus and allow SQL Server TDS connections via TCP &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Agent&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The agent’s exe file is “PortBridgeAgent.exe” and is also both a console app and a&#xD;
Windows Service. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The app.config file on the Agent side (PortBridgeAgent/app.config, PortBridgeAgent.exe.config&#xD;
in the binaries folder) specifies which ports or pipes you want to project into the&#xD;
Agent machine and whether and how you want to firewall these ports. The firewall rules&#xD;
here are not interacting with your local firewall. This is an additional layer of&#xD;
protection.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="code"&gt;&#xD;
          &lt;span style="COLOR: blue"&gt; &amp;lt;&lt;/span&gt;&#xD;
          &lt;span style="COLOR: #a31515"&gt;portBridgeAgent &lt;/span&gt;&#xD;
          &lt;span style="COLOR: red"&gt;serviceBusNamespace&lt;/span&gt;&#xD;
          &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;mysolution&lt;/span&gt;" &lt;span style="COLOR: red"&gt;serviceBusIssuerName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;owner&lt;/span&gt;" &lt;span style="COLOR: red"&gt;serviceBusIssuerSecret&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;xxxxxxxx&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;port &lt;/span&gt;&lt;span style="COLOR: red"&gt;localTcpPort&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;13389&lt;/span&gt;" &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;mymachine&lt;/span&gt;" &lt;span style="COLOR: red"&gt;remoteTcpPort&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;3389&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;firewallRules&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;rule &lt;/span&gt;&lt;span style="COLOR: red"&gt;source&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;127.0.0.1&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;rule &lt;/span&gt;&lt;span style="COLOR: red"&gt;sourceRangeBegin&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;10.0.0.0&lt;/span&gt;" &lt;span style="COLOR: red"&gt;sourceRangeEnd&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;10.255.255.255&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;firewallRules&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;port&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portBridgeAgent&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
        &lt;a href="http://11011.net/software/vspaste"&gt;&#xD;
        &lt;/a&gt;&#xD;
        &lt;p&gt;&#xD;
Again, the &lt;em&gt;serviceBusNamespace&lt;/em&gt; attribute takes your Service Bus namespace&#xD;
name, and the &lt;em&gt;serviceBusIssuerSecret&lt;/em&gt; the respective secret. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;portMappings&lt;/em&gt; collection holds the individual ports or pipes you want&#xD;
to bring onto the local machine. Shown above is a mapping of Remote Desktop (port&#xD;
3389 on the machine with the computer name or &lt;em&gt;localHostName&lt;/em&gt; ‘mymachine’)&#xD;
to the local port 13389. Once Service and Agent are running, you can connect to the&#xD;
agent machine on port 13389 using the Remote Desktop client – with PortBridge mapping&#xD;
that to port 3389 on the remote box. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;firewallRules&lt;/em&gt; collection allows (un-)constraining the TCP clients that&#xD;
may connect to the projected port. By default, only connections from the same machine&#xD;
are permitted.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For named pipes, the configuration is similar, even though there are no firewall rules&#xD;
and named pipes are always constrained to local connectivity by a set of ACLs that&#xD;
are applied to the pipe. Pipe names must be relative. Here’s how a named pipe projection&#xD;
of a default SQL Server instance could look like:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;span style="COLOR: blue"&gt;     &amp;lt;&lt;/span&gt;&#xD;
          &lt;span style="COLOR: #a31515"&gt;port &lt;/span&gt;&#xD;
          &lt;span style="COLOR: red"&gt;localPipe&lt;/span&gt;&#xD;
          &lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;sql/remote&lt;/span&gt;" &lt;span style="COLOR: red"&gt;targetHost&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;mymachine&lt;/span&gt;" &lt;span style="COLOR: red"&gt;remotePipe&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;sql/query&lt;/span&gt;"/&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
        &lt;a href="http://11011.net/software/vspaste"&gt;&#xD;
        &lt;/a&gt;&#xD;
        &lt;p&gt;&#xD;
There’s more to write about this, but how about I let you take a look at the code&#xD;
first. I’ve also included two setup projects that can easily install Agent and Service&#xD;
as Windows Services. You obviously don’t have to use those. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;em&gt;[Updated archive (2010-06-10) fixing config issue:]&lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;a href="http://vasters.com/clemensv/content/binary/PortBridge20100610.zip"&gt;PortBridge20100610.zip&#xD;
(90.99 KB)&lt;/a&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3e35d8bd-b755-453f-8c63-1a57c570eb4c"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=oSy2PCaDXTU:FiLa2S8u_nE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=oSy2PCaDXTU:FiLa2S8u_nE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=oSy2PCaDXTU:FiLa2S8u_nE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=oSy2PCaDXTU:FiLa2S8u_nE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=oSy2PCaDXTU:FiLa2S8u_nE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/oSy2PCaDXTU" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</comments>
      <category>.NET Services</category>
      <category>Azure</category>
      <category>Technology/ISB</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=26dc5df1-8b8c-4f71-8765-8904e584505b</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=26dc5df1-8b8c-4f71-8765-8904e584505b</wfw:commentRss>
      
      <title>SocketShifter - Network virtualization over the .NET Service Bus</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/nH5yxMeevvk/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</link>
      <pubDate>Mon, 06 Jul 2009 16:06:48 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Anyone using the .NET Service Bus should take a good look at the &lt;a href="http://blogs.aws.net/atc/post/SocketShifter-Warping-the-Internet-Space-Time-Continuum-with-the-Azure-NET-Service-Bus.aspx"&gt;SocketShifter&#xD;
project&lt;/a&gt; started by Rob Blackwell and Richard Prodger from AWS in the UK. AWS stands&#xD;
for &lt;a href="http://www.aws.net"&gt;Active Web Solutions&lt;/a&gt;, not for the "other" AWS.&#xD;
The full project is up on &lt;a href="http://socketshifter.codeplex.com/"&gt;Codeplex&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What makes SocketShifter significant is that it takes the network abstraction of SOAP,&#xD;
WS-Addressing, and the Service Bus full circle and layers the very bottom of that&#xD;
stack - plain TCP connections - as a virtualization on top of the the stack. In other&#xD;
words: SocketShifter allows you to create full-fidelity, bi-directional socket connections&#xD;
through the .NET Service Bus.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We've created something very similar to SocketShifter last year (we're using&#xD;
it for a few internal purposes), but haven't made it public so far. I'm glad that&#xD;
the AWS folks built this, so that you get to play with it.   &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=26dc5df1-8b8c-4f71-8765-8904e584505b"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=nH5yxMeevvk:DCaJxbAjufo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=nH5yxMeevvk:DCaJxbAjufo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=nH5yxMeevvk:DCaJxbAjufo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=nH5yxMeevvk:DCaJxbAjufo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=nH5yxMeevvk:DCaJxbAjufo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/nH5yxMeevvk" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</comments>
      <category>.NET Services</category>
      <category>Architecture</category>
      <category>Technology</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=b703725d-3e6a-4dbb-a613-890c31505fe8</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=b703725d-3e6a-4dbb-a613-890c31505fe8</wfw:commentRss>
      
      <title>.NET Services March 2009 CTP - Service Bus Routers and Queues - Part 5: The Queue API for the rest of us</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/sTz0wsE64UQ/PermaLink,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</link>
      <pubDate>Tue, 07 Apr 2009 06:38:26 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
In Parts &lt;a href="http://vasters.com/clemensv/PermaLink,guid,413c6128-a6a6-4894-9cc9-701ffb674ab0.aspx"&gt;3&lt;/a&gt; and &lt;a href="http://vasters.com/clemensv/PermaLink,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx"&gt;4&lt;/a&gt; of&#xD;
this series I’ve explained the REST protocol for the .NET Service Bus Queue capability.&#xD;
If that looked a little too complicated for your taste and you’d rather clean with&#xD;
a simple API surface, here’s the API that you’ll prefer. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We’ve got two simple classes in the SDK (in the Microsoft.ServiceBus assembly/namespace)&#xD;
that do the job. The &lt;em&gt;QueueManagementClient&lt;/em&gt; allows you to create, renew and&#xD;
delete queues in/from the .NET Service Bus namespace:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;class&lt;/span&gt; QueueManagementClient &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:    &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; QueueClient&#xD;
CreateQueue(TransportClientEndpointBehavior credential, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:                                          Uri queueUri, QueuePolicy queuePolicy);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:    &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; DeleteQueue(TransportClientEndpointBehavior&#xD;
credential, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:                                   Uri queueUri);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:    &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; QueueClient&#xD;
GetQueue(TransportClientEndpointBehavior credential, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:                                       Uri queueUri);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:    &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; QueuePolicy&#xD;
GetQueuePolicy(TransportClientEndpointBehavior credential, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:                                             Uri queueUri);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:    &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; DateTime&#xD;
RenewQueue(TransportClientEndpointBehavior credential, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:                                      Uri queueUri, TimeSpan requestedExpiration);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13: }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The most striking difference between this API (and the underlying SOAP protocol for&#xD;
which we still owe you some docs) and the REST API/Protocol is that there’s only a&#xD;
single URI to deal with. The WS-Transfer aligned protocol to manage the policy, the&#xD;
“Queue Transfer” protocol used to dequeue messages, and the “Enqueue” protocol to&#xD;
add messages to the queue are all overlaid over the exact same URI.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The only somewhat ugly element here is the &lt;em&gt;TransportClientEndpointBehavior&lt;/em&gt; that’s&#xD;
our awkwardly named credentials container. That class was meant to evolve into something&#xD;
else and then we changed our mind at some point, which is how the baby got stuck with&#xD;
that name. We’ll give that a prettier moniker in one of the next CTPs and as part&#xD;
of an overhaul of the .NET Access Control integration into Service Bus.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The function of the methods themselves should be quite obvious. You can create a queue&#xD;
by applying a &lt;a href="http://vasters.com/clemensv/PermaLink,guid,0f64f592-7239-42fc-aed2-f0993701c5f6.aspx"&gt;policy&lt;/a&gt;,&#xD;
you can delete a queue, attach to an existing queue, get the latest queue policy,&#xD;
and renew (extend the lifetime) of a queue. For completeness, here’s CreateQueue in&#xD;
context:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: Uri queueUri = ServiceBusEnvironment.CreateServiceUri("&lt;span style="COLOR: #8b0000"&gt;sb&lt;/span&gt;",&#xD;
solutionName, "&lt;span style="COLOR: #8b0000"&gt;/MyQueue/&lt;/span&gt;"); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: QueuePolicy queuePolicy = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; QueuePolicy(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: queuePolicy.ExpirationInstant = DateTime.UtcNow + TimeSpan.FromHours(1);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: QueueClient client = QueueManagementClient.CreateQueue(credential, queueUri, queuePolicy);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: queuePolicy = client.GetPolicy(); &lt;span style="COLOR: #008000"&gt;//&#xD;
get effective policy&lt;/span&gt;&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;em&gt;QueueClient&lt;/em&gt; class allows interaction with a Queue. QueueClient instances&#xD;
cannot be created directly, but must be created via the QueueManagementClient factory.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;sealed&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;class&lt;/span&gt; QueueClient &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; DeleteLockedMessage(Message&#xD;
message); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; DeleteQueue(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; DateTime&#xD;
GetExpiration(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; QueuePolicy&#xD;
GetPolicy(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; Message&#xD;
PeekLock(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; Message&#xD;
PeekLock(TimeSpan timeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Message&amp;gt;&#xD;
PeekLockMultiple(&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt; maxMessages); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Message&amp;gt;&#xD;
PeekLockMultiple(&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt; maxMessages, TimeSpan timeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; Purge(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; ReleaseLock(Message&#xD;
message); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; DateTime&#xD;
Renew(TimeSpan requestedExpiration); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; Message&#xD;
Retrieve(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; Message&#xD;
Retrieve(TimeSpan timeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Message&amp;gt;&#xD;
RetrieveMultiple(&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt; maxMessages); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Message&amp;gt;&#xD;
RetrieveMultiple(&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt; maxMessages, TimeSpan timeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 18:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt; Send(Message&#xD;
message, TimeSpan timeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 19:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; RouterSubscriptionClient&#xD;
SubscribeToRouter(RouterClient routerClient, TimeSpan requestedTimeout); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 20: }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
As you can tell, the class is – well – a queue client. It’s using WCF’s &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.message.aspx"&gt;Message&lt;/a&gt;&lt;/em&gt; class&#xD;
as its message abstraction and supports sending messages into the queue, reading messages&#xD;
off the queue in a destructive fashion (Retrieve), and reading messages off the queue&#xD;
using the Peek/Lock pattern which provides resilience against message loss if the&#xD;
message were to be lost in transfer or the receiver fumbled the message. What you’ll&#xD;
also notice is that there are RetrieveMultiple and PeekLockMultiple variants of the&#xD;
retrieval functions which allow for getting more data with fewer network roundtrips. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Again, there should be no surprises using the API. Here’s how you send:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: queueClient.Send(Message.CreateMessage(MessageVersion.Default, "&lt;span style="COLOR: #8b0000"&gt;Hello&lt;/span&gt;",&#xD;
input), TimeSpan.MaxValue);&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
and here’s how you do a destructive read:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: Message message = queueClient.Retrieve();&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
and here’s how you use the Peek/Lock pattern:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: Message message = queueClient.PeekLock();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; content&#xD;
= message.GetBody&amp;lt;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;gt;(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: queueClient.DeleteLockedMessage(message);&#xD;
&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
There are several examples in the SDK showing how to use the API for Queues. The OnewayQueueSender&#xD;
and SoapHttpQueueSender samples are particularly interesting since they just use WCF&#xD;
channels to enqueue, including all the bells and whistles you get from using a WCF&#xD;
channel. Here’s how the OnewayQueueSender does it:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: ChannelFactory&amp;lt;IOnewayChannel&amp;gt; channelFactory = &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:      &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; ChannelFactory&amp;lt;IOnewayChannel&amp;gt;(&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; NetOnewayRelayBinding(), &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:                                         &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; EndpointAddress(queueUri)); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: channelFactory.Endpoint.Behaviors.Add(userNamePasswordServiceBusCredential);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: IOnewayChannel onewayChannel = channelFactory.CreateChannel();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; input&#xD;
= Console.ReadLine(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: onewayChannel.Hello(&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; HelloMessage(input)); &lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The logical next question is: So why is the Queue not hooked up to a WCF listener?&#xD;
Answer: That’s what we’ve got “buffered Routers” for. The queue very explicitly provides&#xD;
a ‘pull’ model and the WCF listener would abstract that away and turn it into ‘push’.&#xD;
Routers provide ‘push’ natively &lt;em&gt;and&lt;/em&gt; they can embed a Queue. More on Routers&#xD;
in the next set of posts in this series. &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b703725d-3e6a-4dbb-a613-890c31505fe8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=sTz0wsE64UQ:pphlyOFJ4vw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=sTz0wsE64UQ:pphlyOFJ4vw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=sTz0wsE64UQ:pphlyOFJ4vw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=sTz0wsE64UQ:pphlyOFJ4vw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=sTz0wsE64UQ:pphlyOFJ4vw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/sTz0wsE64UQ" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</comments>
      <category>.NET Services</category>
      <category>Azure</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,b703725d-3e6a-4dbb-a613-890c31505fe8.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=4aefc36e-4476-4543-9574-13727c8f615d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=4aefc36e-4476-4543-9574-13727c8f615d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>.NET Services March 2009 CTP - Service Bus Routers and Queues - Part 4: The REST Queue Protocol in Code Snippets</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/n3vSBettHgA/PermaLink,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</link>
      <pubDate>Tue, 07 Apr 2009 05:40:58 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
After I’ve gone through the dry facts of the REST Queue Protocol in &lt;a href="http://vasters.com/clemensv/PermaLink,guid,413c6128-a6a6-4894-9cc9-701ffb674ab0.aspx"&gt;Part&#xD;
3 of this series&lt;/a&gt;, here’s some code to look at. The code snippets are ripped from&#xD;
the HTTP Queue sample we’ve got in the .NET Services &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8d1d1d5e-1332-4186-b33f-26d053759e49&amp;amp;displaylang=en"&gt;SDK&lt;/a&gt; and&#xD;
you can get the copy/paste ready code from there. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The most straightforward way to acquire the required hashed security token (&lt;a href="http://vasters.com/clemensv/PermaLink,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx"&gt;see&#xD;
my comments to Stefan Tilkov&lt;/a&gt;) using HttpWebRequest looks like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; HttpGetAuthenticationToken(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; username, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; password) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:     &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; tokenUri&#xD;
= &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;.Format("&lt;span style="COLOR: #8b0000"&gt;https://{0}/issuetoken.aspx?u={1}&amp;amp;p={2}&lt;/span&gt;", &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:                                     ServiceBusEnvironment.DefaultIdentityHostName, &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:                                     username, Uri.EscapeDataString(password));&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:     HttpWebRequest tokenRequest = (HttpWebRequest)WebRequest.Create(tokenUri);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
tokenResponse = tokenRequest.GetResponse()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
tokenResponseStream = tokenResponse.GetResponseStream()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:             &lt;span style="COLOR: #0000ff"&gt;byte&lt;/span&gt;[]&#xD;
tokenBody = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;byte&lt;/span&gt;[500]; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:             &lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt; tokenBodyLength&#xD;
= tokenResponseStream.Read(tokenBody, 0, 500); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:             &lt;span style="COLOR: #0000ff"&gt;return&lt;/span&gt; Encoding.UTF8.GetString(tokenBody,&#xD;
0, tokenBodyLength); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17: }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 18: &lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Once you’ve got the token, you need to pick a place in the Service Bus namespace.&#xD;
We’ve got a built-in helper function in the SDK that sits on &lt;em&gt;ServiceBusEnvironment&lt;/em&gt; and&#xD;
which knows all the right incantations:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1:  Uri queueUri = ServiceBusEnvironment.CreateServiceUri(&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:                    Uri.UriSchemeHttps, &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:                    solutionName, &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:                    "&lt;span style="COLOR: #8b0000"&gt;/MyHttpQueue/&lt;/span&gt;"); &lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Invoked in this way, the method yields the URI &lt;strong&gt;https://yourproject.&lt;font color="#ff8040"&gt;servicebus.windows.net&lt;/font&gt;/MyHttpQueue/&lt;/strong&gt; so&#xD;
there’s spectacularly little magic to it. The reason why we recommend that you use&#xD;
the method in .NET applications is that we’ve broken everyone’s apps going from the&#xD;
previous CTP to the current CTP due to the namespace restructuring and we’d like to&#xD;
avoid doing that again as we improve the namespace story. I don’t foresee any further&#xD;
change of the magnitude we had this time, however. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To create a new Queue, you first &lt;a href="http://vasters.com/clemensv/PermaLink,guid,0f64f592-7239-42fc-aed2-f0993701c5f6.aspx"&gt;create&#xD;
a Queue policy&lt;/a&gt; and then apply it to the Service Bus namespace name. We’ve got&#xD;
a Queue Policy object in the SDK that I’ll use here to keep things short. I’m accepting&#xD;
all the defaults that are spelled out in &lt;a href="http://vasters.com/clemensv/PermaLink,guid,0f64f592-7239-42fc-aed2-f0993701c5f6.aspx"&gt;Part&#xD;
2 of the series&lt;/a&gt;, but explicitly I’m setting the expiration to 1 hour. The Queue&#xD;
Policy XSD schema in the the HTTP Queue sample’s &lt;em&gt;readme&lt;/em&gt; document, by the&#xD;
way. &#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: QueuePolicy queuePolicy = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; QueuePolicy(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: queuePolicy.ExpirationInstant = DateTime.UtcNow + TimeSpan.FromHours(1);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: queueManageUri = HttpCreateQueue(token, queueUri, queuePolicy);&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The code for creating the Queue shouldn’t be very surprising. It’s a POST of an Atom&#xD;
1.0 entry for which I’m using HttpWebRequest and the WCF 3.5 Syndication API. The&#xD;
SDK sample is using a rather terse version of the ‘correct’ way of doing things. I’m&#xD;
quoting the expanded variant from the Text140 sample that I showed at MIX’09:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; QueuePolicy&#xD;
HttpCreateQueue(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; token, Uri queueUri, QueuePolicy&#xD;
policy, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:                                           &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; Uri&#xD;
queueSelfUri, &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; Uri queueHeadUri) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:     HttpWebRequest webRequest;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:     HttpWebResponse webResponse;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:     queueSelfUri = &lt;span style="COLOR: #0000ff"&gt;null&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     queueHeadUri = &lt;span style="COLOR: #0000ff"&gt;null&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:     &lt;span style="COLOR: #008000"&gt;//&#xD;
Create a new syndication item and add the queue policy as an extension&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     SyndicationItem syndicationItem = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; SyndicationItem(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:     syndicationItem.ElementExtensions.Add(&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:         &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; SyndicationElementExtension("&lt;span style="COLOR: #8b0000"&gt;QueuePolicy&lt;/span&gt;", &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:                                         "&lt;span style="COLOR: #8b0000"&gt;http://schemas.microsoft.com/ws/2007/08/connect&lt;/span&gt;", &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:                                         policy));&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17:     &lt;span style="COLOR: #008000"&gt;//&#xD;
create a new POST request and set the Content-Type to represent an Atom 1.0 entry&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 18:     webRequest = HttpWebRequest.Create(queueUri) &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebRequest; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 19:     webRequest.ConnectionGroupName = "&lt;span style="COLOR: #8b0000"&gt;queueclient&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 20:     webRequest.KeepAlive = &lt;span style="COLOR: #0000ff"&gt;false&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 21:     webRequest.Method = "&lt;span style="COLOR: #8b0000"&gt;POST&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 22:     webRequest.Headers.Add("&lt;span style="COLOR: #8b0000"&gt;X-MS-Identity-Token&lt;/span&gt;",&#xD;
token); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 23:     webRequest.ContentType = "&lt;span style="COLOR: #8b0000"&gt;application/atom+xml;type=entry;charset=utf-8&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 24: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 25:     &lt;span style="COLOR: #008000"&gt;//&#xD;
write the item to the request stream&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 26:     &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
requestStream = webRequest.GetRequestStream()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 27:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 28:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
textWriter = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; XmlTextWriter(requestStream,&#xD;
Encoding.UTF8)) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 29:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 30:             syndicationItem.GetAtom10Formatter().WriteTo(textWriter);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 31:             textWriter.Flush();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 32:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 33:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 34: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 35:     &lt;span style="COLOR: #008000"&gt;//&#xD;
get the response&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 36:     &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (webResponse&#xD;
= webRequest.GetResponse() &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebResponse) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 37:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 38:         &lt;span style="COLOR: #0000ff"&gt;return&lt;/span&gt; GetQueueInfoFromResponse(webResponse,&#xD;
queueUri, &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; queueSelfUri, &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; queueHeadUri); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 39:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 40: }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 41: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 42: &lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt; QueuePolicy&#xD;
GetQueueInfoFromResponse(HttpWebResponse webResponse, Uri queueUri, &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 43:                                                     &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; Uri&#xD;
queueSelfUri, &lt;span style="COLOR: #0000ff"&gt;out&lt;/span&gt; Uri queueHeadUri) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 44: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 45:     queueHeadUri = &lt;span style="COLOR: #0000ff"&gt;null&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 46:     queueSelfUri = &lt;span style="COLOR: #0000ff"&gt;null&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 47: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 48:     &lt;span style="COLOR: #0000ff"&gt;if&lt;/span&gt; (webResponse.ContentType.StartsWith("&lt;span style="COLOR: #8b0000"&gt;application/atom+xml;type=entry&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase)) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 49:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 50:         Atom10ItemFormatter atomItemFormatter = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; Atom10ItemFormatter(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 51:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseReader = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; XmlTextReader(webResponse.GetResponseStream())) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 52:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 53:             atomItemFormatter.ReadFrom(responseReader);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 54:             &lt;span style="COLOR: #008000"&gt;//&#xD;
we found it. let's get the policy and the queue head URI&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 55:             &lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt; (SyndicationLink&#xD;
queueSelfLink &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 56:                            from link &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; atomItemFormatter.Item.Links &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 57:                            where link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;self&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 58:                            select link)&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 59:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 60:                 queueSelfUri = queueSelfLink.Uri;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 61:                 &lt;span style="COLOR: #0000ff"&gt;break&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 62:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 63: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 64:             &lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt; (SyndicationLink&#xD;
queueHeadLink &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 65:                            from link &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; atomItemFormatter.Item.Links &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 66:                            where link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;queuehead&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 67:                            select link)&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 68:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 69:                 queueHeadUri = queueHeadLink.Uri;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 70:                 &lt;span style="COLOR: #0000ff"&gt;break&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 71:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 72: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 73:             &lt;span style="COLOR: #0000ff"&gt;return&lt;/span&gt; atomItemFormatter.Item.ElementExtensions.ReadElementExtensions&amp;lt;QueuePolicy&amp;gt;( &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 74:                  "&lt;span style="COLOR: #8b0000"&gt;QueuePolicy&lt;/span&gt;", &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 75:                  "&lt;span style="COLOR: #8b0000"&gt;http://schemas.microsoft.com/ws/2007/08/connect&lt;/span&gt;").FirstOrDefault(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 76:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 77:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 78:     &lt;span style="COLOR: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 79:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 80:         Atom10FeedFormatter atomFeedFormatter = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; Atom10FeedFormatter(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 81:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseReader = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; XmlTextReader(webResponse.GetResponseStream())) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 82:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 83:             atomFeedFormatter.ReadFrom(responseReader);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 84: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 85:             &lt;span style="COLOR: #008000"&gt;//&#xD;
look for an item whose alternate-link equals the desired queue URI. The alternate &lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 86:             &lt;span style="COLOR: #008000"&gt;//&#xD;
URI is the 'tail' endpoint by which the queue is mapped into the namespace. We are &lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 87:             &lt;span style="COLOR: #008000"&gt;//&#xD;
comparing Authority and Path since the scheme might be http or https and we want to&#xD;
match&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 88:             &lt;span style="COLOR: #008000"&gt;//&#xD;
either.&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 89:             &lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt; (SyndicationItem&#xD;
requestedItem &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 90:                          from item &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; atomFeedFormatter.Feed.Items &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 91:                          from link &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; item.Links &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 92:                          where &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 93:                            (link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;alternate&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &amp;amp;&amp;amp; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 94:                             link.Uri.Authority.Equals(queueUri.Authority, StringComparison.OrdinalIgnoreCase) &amp;amp;&amp;amp;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 95:                             link.Uri.AbsolutePath.Equals(queueUri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) ||&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 96:                            (link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;self&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &amp;amp;&amp;amp; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 97:                             link.Uri.Equals(queueUri))&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 98:                          select item)&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 99:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;100:                 &lt;span style="COLOR: #008000"&gt;//&#xD;
we found it. let's get the policy and the queue head URI&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;101:                 &lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt; (SyndicationLink&#xD;
queueSelfLink &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;102:                                from link &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; requestedItem.Links &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;103:                                where link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;self&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;104:                                select link)&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;105:                 {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;106:                     queueSelfUri = queueSelfLink.Uri;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;107:                     &lt;span style="COLOR: #0000ff"&gt;break&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;108:                 }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;109: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;110:                 &lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt; (SyndicationLink&#xD;
queueHeadLink &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;111:                                from link &lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt; requestedItem.Links &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;112:                                where link.RelationshipType.Equals("&lt;span style="COLOR: #8b0000"&gt;queuehead&lt;/span&gt;",&#xD;
StringComparison.OrdinalIgnoreCase) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;113:                                select link)&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;114:                 {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;115:                     queueHeadUri = queueHeadLink.Uri;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;116:                     &lt;span style="COLOR: #0000ff"&gt;break&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;117:                 }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;118: &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;119:                 &lt;span style="COLOR: #0000ff"&gt;return&lt;/span&gt; requestedItem.ElementExtensions.ReadElementExtensions&amp;lt;QueuePolicy&amp;gt;( &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;120:                      "&lt;span style="COLOR: #8b0000"&gt;QueuePolicy&lt;/span&gt;", &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;121:                      "&lt;span style="COLOR: #8b0000"&gt;http://schemas.microsoft.com/ws/2007/08/connect&lt;/span&gt;").FirstOrDefault(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;122:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;123:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;124:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;125:     &lt;span style="COLOR: #0000ff"&gt;return&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;null&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;126: }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The “magic” that isn’t straight up Atom Pub is in lines 10-15 above. I’m attaching&#xD;
the policy object to the SyndicationItem abstraction that will be written out as an&#xD;
Atom 1.0 entry. [I know that copy/paste is difficult using this format – I need to&#xD;
clean up that expanded utility class and will post it in downloadable form within&#xD;
the next few days]&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The method returns the effective policy that the Service Bus is using, and yields&#xD;
the management URI for the queue where the Atom entry resides (self-link) as well&#xD;
as the head of the queue as output arguments. The &lt;em&gt;queueUri&lt;/em&gt; to which you applied&#xD;
the entry has morphed into the Queue’s tail when the method returns successfully.&#xD;
Having the Queue by its tail, submitting messages into it is very simple. Just do&#xD;
a plain POST. Here we’re just writing a simple string from the local variable &lt;em&gt;input&lt;/em&gt; as&#xD;
the entity body and send it.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #008000"&gt;//&#xD;
send&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: HttpWebRequest sendRequest = HttpWebRequest.Create(queueUri) &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebRequest; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: sendRequest.Method = "&lt;span style="COLOR: #8b0000"&gt;POST&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: sendRequest.Headers.Add("&lt;span style="COLOR: #8b0000"&gt;X-MS-Identity-Token&lt;/span&gt;",&#xD;
token); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: sendRequest.ContentType = "&lt;span style="COLOR: #8b0000"&gt;text/plain;charset=utf-8&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
sendStream = sendRequest.GetRequestStream()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
writer = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; StreamWriter(sendStream, Encoding.UTF8)) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:         writer.Write(input);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:         writer.Flush();&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13: }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14: sendRequest.GetResponse().Close();&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
For a simple destructive read, you use the ‘queue head’ URI and do a DELETE:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: HttpWebRequest dequeueRequest = &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:     HttpWebRequest.Create(queueHeadUri.AbsoluteUri+&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:                           "&lt;span style="COLOR: #8b0000"&gt;?encoding=asreply&amp;amp;maxmessages=1&amp;amp;timeout=60&lt;/span&gt;") &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebRequest; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: dequeueRequest.ConnectionGroupName = "&lt;span style="COLOR: #8b0000"&gt;dequeue&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: dequeueRequest.Method = "&lt;span style="COLOR: #8b0000"&gt;DELETE&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: dequeueRequest.ContentLength = 0;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: dequeueRequest.Headers.Add("&lt;span style="COLOR: #8b0000"&gt;X-MS-Identity-Token&lt;/span&gt;",&#xD;
token); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (HttpWebResponse&#xD;
response = dequeueRequest.GetResponse() &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebResponse) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:     &lt;span style="COLOR: #0000ff"&gt;if&lt;/span&gt; (response.StatusCode&#xD;
== HttpStatusCode.OK) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseBody = response.GetResponseStream()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:             &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseReader = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; StreamReader(responseBody,&#xD;
Encoding.UTF8)) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16:                 &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; data&#xD;
= responseReader.ReadToEnd(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17:                 Console.WriteLine(data);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 18:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 19:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 20:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 21: }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
For a peek/lock read where you first lock the message and then delete the lock when&#xD;
you want to keep the message, you do a POST on the head and remember the &lt;em&gt;X-MS-Message-Lock&lt;/em&gt; header&#xD;
value:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: HttpWebRequest dequeueRequest = &#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:      HttpWebRequest.Create(queueHeadUri.AbsoluteUri+&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:                            "&lt;span style="COLOR: #8b0000"&gt;?encoding=asreply&amp;amp;maxmessages=1&amp;amp;timeout=60&lt;/span&gt;") &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebRequest; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: dequeueRequest.ConnectionGroupName = "&lt;span style="COLOR: #8b0000"&gt;dequeue&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: dequeueRequest.Method = "&lt;span style="COLOR: #8b0000"&gt;POST&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: dequeueRequest.ContentLength = 0;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: dequeueRequest.Headers.Add("&lt;span style="COLOR: #8b0000"&gt;X-MS-Identity-Token&lt;/span&gt;",&#xD;
token); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (HttpWebResponse&#xD;
response = dequeueRequest.GetResponse() &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebResponse) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9: {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:     &lt;span style="COLOR: #0000ff"&gt;if&lt;/span&gt; (response.StatusCode&#xD;
== HttpStatusCode.OK) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:         lockUri = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; Uri(response.Headers["&lt;span style="COLOR: #8b0000"&gt;X-MS-Message-Lock&lt;/span&gt;"]); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:         &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseBody = response.GetResponseStream()) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:         {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:             &lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt; (var&#xD;
responseReader = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; StreamReader(responseBody,&#xD;
Encoding.UTF8)) &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16:             {&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17:                 &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; data&#xD;
= responseReader.ReadToEnd(); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 18:                 Console.WriteLine(data);&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 19:             }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 20:         }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 21:     }&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 22: }&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
If you decide to keep the message (i.e. your app didn’t puke processing it), you DELETE&#xD;
the lock, otherwise you do a PUT. The code is practically the same except for the&#xD;
method so I’ll just quote DELETE:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: HttpWebRequest deleteLockedMessageRequest = HttpWebRequest.Create(lockUri) &lt;span style="COLOR: #0000ff"&gt;as&lt;/span&gt; HttpWebRequest; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: deleteLockedMessageRequest.ConnectionGroupName = "&lt;span style="COLOR: #8b0000"&gt;lock&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: deleteLockedMessageRequest.Method = "&lt;span style="COLOR: #8b0000"&gt;DELETE&lt;/span&gt;"; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: deleteLockedMessageRequest.KeepAlive=&lt;span style="COLOR: #0000ff"&gt;false&lt;/span&gt;; &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5: deleteLockedMessageRequest.ContentLength = 0;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6: deleteLockedMessageRequest.Headers.Add("&lt;span style="COLOR: #8b0000"&gt;X-MS-Identity-Token&lt;/span&gt;",&#xD;
token); &lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: deleteLockedMessageRequest.ContentLength = 0;&#xD;
&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: deleteLockedMessageRequest.GetResponse().Close();&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
That’s it. Create, Enqueue, Destructive Read, Peek/Lock Read, and .. oh .. yes.. forgot&#xD;
Delete the Queue. Take the snippet above and swap out the lockUri for the queueSelfUri.&#xD;
Done.  &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Ah, yes, and please … don’t blame me for HTTP or HttpWebRequest or Clemens’ demo coding&#xD;
style requiring too many lines of code. I could have applied a bit of code-compression&#xD;
here, but I’m intentionally trying not to abstract away too much of the protocol here.&#xD;
I’m generally with you, though. The guys putting together the &lt;a href="http://msdn.microsoft.com/wcf/rest"&gt;WCF&#xD;
REST Starter Kit&lt;/a&gt; are working on making code like that shrink.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=4aefc36e-4476-4543-9574-13727c8f615d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=n3vSBettHgA:0RXhDqqncxg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=n3vSBettHgA:0RXhDqqncxg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=n3vSBettHgA:0RXhDqqncxg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=n3vSBettHgA:0RXhDqqncxg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=n3vSBettHgA:0RXhDqqncxg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/n3vSBettHgA" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</comments>
      <category>.NET Services</category>
      <category>Azure</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,4aefc36e-4476-4543-9574-13727c8f615d.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=19e938fc-e6ec-42df-96d9-e2f6a31f7399</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=19e938fc-e6ec-42df-96d9-e2f6a31f7399</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>The .NET Service Bus REST protocol for Queues - Some comments, some answers</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/QIQ93P_kjrA/PermaLink,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</link>
      <pubDate>Tue, 07 Apr 2009 04:14:16 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.innoq.com/blog/st/2009/04/net_services_rest_queue_protoc.html"&gt;Stefan&#xD;
Tilkov has several interesting remarks&lt;/a&gt; regarding our &lt;a href="http://vasters.com/clemensv/PermaLink,guid,413c6128-a6a6-4894-9cc9-701ffb674ab0.aspx"&gt;.NET&#xD;
Service Bus REST Queue Protocol&lt;/a&gt; that are worth addressing.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      Putting a password in the&#xD;
URI to get an identity token seems to expose information unnecessarily&lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That’s an area where we know that we’re going to change the protocol. We’ve already&#xD;
labeled that protocol as temporary in the documentation for the PDC CTP and we didn’t&#xD;
get all the pieces in the .NET Access Control service together, yet. Since it’s a&#xD;
HTTPS call, the data doesn’t get exposed on the wire, though. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;Queue&#xD;
creation seems fine, even though I feel a little uneasy about wrapping this in an&#xD;
Atom entry &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Using Atom 1.0 and the Atom Publishing Protocol as the framework for managing the&#xD;
namespace is very intentional - for several reasons. First of all, it’s a standardized&#xD;
protocol for managing generic lists and the elements in those lists. With that we&#xD;
have a stable and accepted protocol framework and there’s plenty of tooling and framework&#xD;
support around it. That’s worth something. All we need to do is to add some simple&#xD;
extensions – the policies – on top of that stack. Beats having to define, version,&#xD;
and maintain a whole protocol.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;On&#xD;
the other hand, Atom seems reasonable considering you get an Atom feed from the queue’s&#xD;
“parent” resource &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That’s what I mean. All sorts of tools know how to navigate and display Atom.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;Very&#xD;
nice to see the use of link/rel to get to the detailed Queue URIs; it would be even&#xD;
better if the rel values themselves were URIs in an MS namespace &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;br&gt;&#xD;
I don’t see much potential for collision here and I would find it odd to have something&#xD;
as simple “self” and “alternate” and then add some unsightly QName for my rel expressions.&#xD;
Simple is good.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;Using&#xD;
“alternate” for the tail seems strange &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
“self” refers to the location where the Atom &amp;lt;entry&amp;gt; resides. “alternate” is&#xD;
what the entry points to. Since the Queue gets mapped into the namespace by “sticking&#xD;
its tail out”, the choice of the alternate link is the simplest possible mapping I&#xD;
could think of.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;“The&#xD;
queue’s tail endpoint accepts requests with any HTTP Content-Type and any HTTP method&#xD;
except GET, HEAD, and OPTIONS.” The tail does not accept GET. Why not? Can’t think&#xD;
of a reason. Also, I don’t get why any method is allowed. It seems to me a POST/PUT&#xD;
combination or an idempotent POST variant would be the way to go. &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The way to look at this is that the Queue’s tail is acting on behalf of the receiver/resource&#xD;
that’ll eventually pick up and process the messages. POST, PUT, DELETE, and BOOYAH&#xD;
are all operations that cleanly map to processing operations and can often be delivered&#xD;
asynchronously with a 202 receipt reply. GET and HEAD don’t make much sense when executed&#xD;
in an asynchronous fashion without getting a reply that’s backed by a response for&#xD;
the receiver. OPTIONS is simply reserved for future use. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;“DELETE&#xD;
performing a destructive read” – huh? What happens if I don’t get back a response?&#xD;
How can I retry (as I can’t tell whether I get the same or a different message)? Maybe&#xD;
it’s intended to be used only if you don’t care about losing messages. &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
DELETE is indeed the dequeue operation variant that you’d use if you are ok with occasional&#xD;
message loss and want to trade transfer reliability for fewer roundtrips. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;The&#xD;
POST lock/delete approach, on the other hand, is very nice. Maybe it should be made&#xD;
idempotent, again e.g. using POE &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
POST lock/delete is the dequeue variant where you are doing the trade the other way&#xD;
around. More reliability bought with an extra roundtrip. In my view, idempotent access&#xD;
to individual messages isn’t much of a practical priority for a competing consumer&#xD;
queue. You’ll get a message or a set of messages to look at under a lock and if you&#xD;
walk away from the message(s), those messages pop back into the queue for someone&#xD;
else to look at. There are obviously scenarios where you want to look at a message&#xD;
sequence in other ways than an ordered queue where you can only get at messages as&#xD;
they appear on the head of the sequence – direct message access and per-message idempotent&#xD;
access matter in those scenarios and we’re looking to give you a capability of that&#xD;
sort in a different kind of messaging primitive.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;“The&#xD;
Delete request is sent without any entity body and MUST have a Content-Length header&#xD;
that is set to zero (0)”; although my immediate reaction was to question whether DELETE&#xD;
ever carries a body, the HTTP spec indeed doesn’t say anything about this &lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
One of the great things about working here is that there are all sorts of interesting&#xD;
people around. I’ve discussed the use of DELETE and whether you can provide an entity&#xD;
body in either direction with &lt;a href="http://en.wikipedia.org/wiki/Henrik_Frystyk_Nielsen"&gt;Henrik&#xD;
Frystyk Nielsen&lt;/a&gt;, who works as an architect on the WCF team and is one of the co-authors&#xD;
of HTTP 1.1. Henrik’s stance is that all operations allow entity-bodies unless it’s&#xD;
explicitly forbidden in the spec. I don’t have a better authority to talk to.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;font color="#0080c0"&gt;&#xD;
            &lt;em&gt;      &lt;/em&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;em&gt;&#xD;
            &lt;font color="#0080c0"&gt;“The&#xD;
DELETE and POST operation have a set of options that are expressed as query parameters&#xD;
appended to the queue’s head URI” - the wording is worse than the actual approach.&lt;/font&gt;&#xD;
          &lt;/em&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’m sorry that my writing is so clumsy ;-)&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=19e938fc-e6ec-42df-96d9-e2f6a31f7399"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=QIQ93P_kjrA:3hqD_pmsnlI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=QIQ93P_kjrA:3hqD_pmsnlI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=QIQ93P_kjrA:3hqD_pmsnlI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=QIQ93P_kjrA:3hqD_pmsnlI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=QIQ93P_kjrA:3hqD_pmsnlI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/QIQ93P_kjrA" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</comments>
      <category>.NET Services</category>
      <category>Azure</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,19e938fc-e6ec-42df-96d9-e2f6a31f7399.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=4ad4d780-97aa-45e8-8615-c22c3ad6c5d5</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=4ad4d780-97aa-45e8-8615-c22c3ad6c5d5</wfw:commentRss>
      
      <title>Hang In There. Not Done With Explaining Routers and Queues, Yet :)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/a0dRfsDdE4I/PermaLink,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</link>
      <pubDate>Tue, 07 Apr 2009 03:20:24 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I’m far from being done with my blog series on Queues and Routers. Here’s how far&#xD;
I’ve yet gotten: &lt;a href="http://vasters.com/clemensv/PermaLink,guid,8e30d2eb-6e2d-4dc5-8aba-5aa410e450de.aspx"&gt;Part&#xD;
1 – Fundamentals&lt;/a&gt;, &lt;a href="http://vasters.com/clemensv/PermaLink,guid,0f64f592-7239-42fc-aed2-f0993701c5f6.aspx"&gt;Part&#xD;
2 - Queue Policies&lt;/a&gt;, &lt;a href="http://vasters.com/clemensv/PermaLink,guid,413c6128-a6a6-4894-9cc9-701ffb674ab0.aspx"&gt;Part&#xD;
3 - Queue REST Protocol&lt;/a&gt;. I still owe you the Queue API, the Router Policies, the&#xD;
Router REST Protocol, and the Router API. It’s simply that the planning work for the&#xD;
next milestone slows me down a bit - sorry. If you also want the smaller bits of info,&#xD;
start &lt;a href="http://twitter.com/clemensv"&gt;following me on Twitter&lt;/a&gt; in the meantime.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=4ad4d780-97aa-45e8-8615-c22c3ad6c5d5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=a0dRfsDdE4I:ZUeV8Hk7g48:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=a0dRfsDdE4I:ZUeV8Hk7g48:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=a0dRfsDdE4I:ZUeV8Hk7g48:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=a0dRfsDdE4I:ZUeV8Hk7g48:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=a0dRfsDdE4I:ZUeV8Hk7g48:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/a0dRfsDdE4I" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</comments>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,4ad4d780-97aa-45e8-8615-c22c3ad6c5d5.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=83edb04a-5696-401c-a919-8c1f379d130c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=83edb04a-5696-401c-a919-8c1f379d130c</wfw:commentRss>
      
      <title>.NET Services March 2009 CTP: Host a Public Website At The Kitchen Table or from a Coffee Shop! No Kidding.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</guid>
      <link>http://feedproxy.google.com/~r/clemensv/~3/-3yW45j_EiA/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</link>
      <pubDate>Sun, 05 Apr 2009 19:41:36 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:2fa07bff-113a-425e-98ba-b07fc54b0584" class="wlWriterEditableSmartContent"&gt;&#xD;
          &lt;p&gt;&#xD;
.NET Service Bus Reverse Web Proxy: &lt;a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/NETServicesMarch2009CTPHostaPublicWebs_9AB2/ServiceBusReverseWebProxy.zip"&gt;Click&#xD;
here to download the source&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;/div&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;&#xD;
          &lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/NETServicesMarch2009CTPHostaPublicWebs_9AB2/image_2.png"&gt;&#xD;
            &lt;img style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 10px 20px 10px 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" align="left" src="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/NETServicesMarch2009CTPHostaPublicWebs_9AB2/image_thumb.png" width="383" height="500"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
Using the application/service built from the sample linked at the top of this post&#xD;
you can &lt;strong&gt;host&lt;/strong&gt; a &lt;strong&gt;publicly discoverable and accessible website&lt;/strong&gt; or&#xD;
Web service &lt;strong&gt;from your Windows notebook&lt;/strong&gt; or desktop machine from within&#xD;
most network environments &lt;strong&gt;without&lt;/strong&gt; having to &lt;strong&gt;open up a port&#xD;
on the firewall&lt;/strong&gt;, mapping a port on your NAT, or using some type of dynamic&#xD;
DNS service to make the site discoverable. All those essential connectivity features&#xD;
are provided by the .NET Service Bus and with the help of the included sample code.&#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
I’m intentionally not bundling this up as a conveniently installable binary along&#xD;
with a nice configuration UI – that’s not my role here. If &lt;strong&gt;you&lt;/strong&gt; want&#xD;
to grab the code and make it part of a cool personal media sharing app, provide external&#xD;
access to a departmental enterprise app, put a prototype out there for a client to&#xD;
play with, host a web service you want to show off, or or provide an installable version&#xD;
with a nice configuration UI – go ahead. &#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
The attached sample application/service has two key capabilities that I’ve repeatedly&#xD;
been asked for:&#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
a) It is a &lt;strong&gt;reverse web proxy&lt;/strong&gt; that can run either as a console application&#xD;
or as a Windows (NT-) service. The reverse web proxy can sit in front of any web server&#xD;
and forward requests to it. I’ve tested this only with IIS as the backend, but I don’t&#xD;
see a reason why this shouldn’t work with Apache or the Web Server built into some&#xD;
J2EE application server. &#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
b) It is a scripting &lt;strong&gt;policy host&lt;/strong&gt; that projects the &lt;em&gt;crossdomain.xml&lt;/em&gt; and &lt;em&gt;ClientPolicyAccess.xml&lt;/em&gt; files&#xD;
required by &lt;strong&gt;Adobe Flash&lt;/strong&gt; and &lt;strong&gt;Microsoft Silverlight&lt;/strong&gt; into&#xD;
the root of a .NET Services namespace, permitting cross-domain script access from&#xD;
Flash and Silverlight for all endpoints hosted within the namespace. You can easily&#xD;
adjust the code in the sample to restrict access to particular resources within the&#xD;
namespace.&#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
The fundamental architecture is illustrated in the picture. The web application that&#xD;
you want to project out to the public internet sits on some web server on your machine.&#xD;
“Your machine” may be a desktop machine at home or at work or a notebook in a hotel&#xD;
lobby or an airport on WiFi. As long as you’ve got line-of-sight to the .NET Service&#xD;
Bus and the TCP ports 828 and 818 are available for outbound traffic, you’re good.&#xD;
The reverse web proxy app will map any local HTTP server to a name in the .NET Service&#xD;
Bus and forward the traffic between the .NET Service Bus and the HTTP server. The&#xD;
client (any web browser, but also any HTTP Web Service client) will talk to the .NET&#xD;
Service Bus at the given name, the traffic flows to the reverse proxy on your machine&#xD;
and from there to the HTTP server.&#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
I’m hosting (for a few days) a sample &lt;a href="http://www.dasblog.info"&gt;dasBlog&lt;/a&gt; site&#xD;
instance at &lt;a title="http://clemensv6.servicebus.windows.net/dasblog/" href="http://clemensv6.servicebus.windows.net/dasblog/"&gt;http://clemensv6.servicebus.windows.net/dasblog/&lt;/a&gt;.&#xD;
The hosting machine for that blog is one of my personal machines. It’s got a local&#xD;
network address assigned by DHCP, it’s not listed in any NAT mappings, and it’s local&#xD;
Firewall isn’t even open for inbound HTTP traffic.  &#xD;
&lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
          &lt;strong&gt;How to install, build, and run&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
As a prerequisite you will need three things:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;div style="MARGIN-TOP: 5px"&gt;Visual Studio 2008 SP1 with the .NET Framework 3.5 SP1.&#xD;
&lt;/div&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;div style="MARGIN-TOP: 5px"&gt;A .NET Services project account. The quickest route is&#xD;
to go to &lt;a href="http://portal.ex.azure.microsoft.com"&gt;http://portal.ex.azure.microsoft.com&lt;/a&gt; and&#xD;
click “Sign up”. The approval/provisioning is pretty much instantaneous (plus 20 seconds&#xD;
for the provisioning to run through) once you provide your Windows Live ID. No more&#xD;
access codes.&#xD;
&lt;/div&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;div style="MARGIN-TOP: 5px"&gt;The .NET Services SDK for the March 2009 CTP. &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8D1D1D5E-1332-4186-B33F-26D053759E49&amp;amp;displaylang=en"&gt;Click&#xD;
here to get it&lt;/a&gt;.&#xD;
&lt;/div&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p style="MARGIN-TOP: 5px"&gt;&#xD;
Unpack the files, and open &lt;em&gt;ServiceBusReverseWebProxy.sln&lt;/em&gt; with Visual Studio&#xD;
2008. In the ServiceBusReverseWebProxy project, find the &lt;strong&gt;app.config&lt;/strong&gt; file&#xD;
and open it. Here’s where you need to put your project name and password and where&#xD;
you map your sites:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: &lt;span style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0" encoding="utf-8" &lt;span style="COLOR: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;configuration&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:     &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;configSections&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:         &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;section&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"reverseWebProxy"&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:                  &lt;span style="COLOR: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"Microsoft.Samples.ServiceBusReverseWebProxy.ReverseWebProxySection,&#xD;
ServiceBusReverseWebProxy"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:     &lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;configSections&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:     &lt;span style="COLOR: #008000"&gt;&amp;lt;!--&#xD;
Add your .NET Services project account information here --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     &lt;span style="COLOR: #008000"&gt;&amp;lt;!--&#xD;
Create a project at http://portal.ex.azure.microsoft.com/ --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:     &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;reverseWebProxy&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;netServicesProjectName&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"!!myproject!!"&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;netServicesProjectPassword&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"!!mypassword!!"&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:                      &lt;span style="COLOR: #ff0000"&gt;enableSilverlightPolicy&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;pathMappings&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:       &lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;add&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;namespacePath&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"mysite"&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;localUri&lt;/span&gt;=&lt;span style="COLOR: #0000ff"&gt;"http://localhost/mysite/"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:     &lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;pathMappings&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:   &lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;reverseWebProxy&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
          &lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15: &lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;configuration&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
        &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Put your .NET Services project/solution name into the &lt;em&gt;netServicesProjectName&lt;/em&gt; and&#xD;
the password into &lt;em&gt;netServicesProjectPassword&lt;/em&gt;. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Then pick a local HTTP server or site and give it a name in your .NET Service Bus&#xD;
namespace. That mapping is done in the &lt;em&gt;&amp;lt;pathMappings&amp;gt;&lt;/em&gt; section. There&#xD;
are a few things that are important to note here:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
If your project name were ‘&lt;strong&gt;clemensv6&lt;/strong&gt;’ and you map some local URI&#xD;
to the namespacePath ‘&lt;strong&gt;dasBlog&lt;/strong&gt;’, the resulting .NET Service Bus URI&#xD;
would be &lt;a title="http://clemensv6.servicebus.windows.net/dasblog/" href="http://clemensv6.servicebus.windows.net/dasblog/"&gt;http://&lt;strong&gt;clemensv6&lt;/strong&gt;.servicebus.windows.net/&lt;strong&gt;dasblog&lt;/strong&gt;/&lt;/a&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The web application should only emit relative paths for links or, otherwise, should&#xD;
have a way to specify the external host address for links. That means that the web&#xD;
application needs to be able to deal with the presence of a reverse proxy. There is&#xD;
no content-level URL rewriter in this sample that would make any corrections to HTML&#xD;
or XML that’s handed upstream. DasBlog allows you to specify the blog site address&#xD;
as some external address and therefore satisfies that requirements. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Redirects and any other HTTP responses that emit the HTTP ‘Location’ header or any&#xD;
other HTTP headers where URIs are returned are rewritten to map the internal view&#xD;
to the external view. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you set &lt;em&gt;enableSilverlightPolicy&lt;/em&gt; to &lt;em&gt;true&lt;/em&gt;, there will be &lt;em&gt;crossdomain.xml&lt;/em&gt; and &lt;em&gt;ClientPolicyAccess.xml&lt;/em&gt; endpoints&#xD;
projected into the root of your project’s namespace, ie. &lt;a title="http://clemensv6.servicebus.windows.net/dasblog/" href="http://clemensv6.servicebus.windows.net/crossdomain.xml"&gt;http://clemensv6.servicebus.windows.net/crossdomain.xml&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Build. Run. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
By default, the ServiceBusReverseWebProxy.exe application will simply run as a console&#xD;
application. If you use &lt;strong&gt;installutil –i ServiceBusReverseWebProxy.exe&lt;/strong&gt; the&#xD;
application will be installed as a Windows Service. The default identity that it is&#xD;
installed under is ‘NETWORK SERVICE’. In restricted networks with constrained IPSec&#xD;
policies (such as the Microsoft Corporate Network), you may have to use a user account&#xD;
instead. You may also have to use some special Firewall-gateway software such as the&#xD;
ISA Firewall client to allow for outbound access to ports 828 and 818. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The actual application code isn’t really all that complicated. The ‘beef’ is in &lt;strong&gt;ReverseWebProxy.cs&lt;/strong&gt;.&#xD;
What might be surprising here is that this class doesn’t use the WCF Service Model,&#xD;
but is using naked WCF channels for the upstream traffic to .NET Services and it’s&#xD;
using HttpWebRequest for the downstream traffic to the local Web Server. The reason&#xD;
for using channels is that the app is never doing any processing on the messages,&#xD;
so the channel model is the most straightforward and efficient way. The reason for&#xD;
using HttpWebRequest is that you can’t suppress auto-redirects on a WCF HTTP client.&#xD;
Since the stack needs to be completely transparent to redirects so that it’s the browser&#xD;
client up on top that gets redirected instead of someone on the way, I simply couldn’t&#xD;
use a WCF channel downstream. Seems to be one of these edge cases that the WCF team&#xD;
downstairs didn’t think anyone would ever need.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Let me know whether and how this works for you. Share the code, improve it, re-blog,&#xD;
let me know. @clemensv on Twitter, same name @microsoft.com for email.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=83edb04a-5696-401c-a919-8c1f379d130c"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=-3yW45j_EiA:HmKubiJorcQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=-3yW45j_EiA:HmKubiJorcQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=-3yW45j_EiA:HmKubiJorcQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/clemensv?a=-3yW45j_EiA:HmKubiJorcQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/clemensv?i=-3yW45j_EiA:HmKubiJorcQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/clemensv/~4/-3yW45j_EiA" height="1" width="1"/&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</comments>
      <category>.NET Services</category>
      <category>Architecture</category>
    <feedburner:origLink>http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx</feedburner:origLink></item>
  </channel>
</rss>
