<?xml version="1.0" encoding="utf-8"?>
<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/" version="2.0">
  <channel>
    <title>Clemens Vasters - Technology|ISB</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Cloud Development and Alien Abductions</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Fri, 16 Sep 2011 14:49:01 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>cvasters@guhhome.com</managingEditor>
    <webMaster>cvasters@guhhome.com</webMaster>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=981f28ab-0743-4c34-9130-8811a8d523da</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,981f28ab-0743-4c34-9130-8811a8d523da.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,981f28ab-0743-4c34-9130-8811a8d523da.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=981f28ab-0743-4c34-9130-8811a8d523da</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
From //build in Anaheim
</p>
        <iframe style="WIDTH: 960px; HEIGHT: 544px" src="http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-862T/player?w=960&amp;h=544" frameborder="0" scrolling="no">
        </iframe>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=981f28ab-0743-4c34-9130-8811a8d523da" />
      </body>
      <title>Building loosely-coupled Apps with Windows Azure Service Bus Topics and Queues</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,981f28ab-0743-4c34-9130-8811a8d523da.aspx</guid>
      <link>http://vasters.com/clemensv/2011/09/16/Building+Looselycoupled+Apps+With+Windows+Azure+Service+Bus+Topics+And+Queues.aspx</link>
      <pubDate>Fri, 16 Sep 2011 14:49:01 GMT</pubDate>
      <description>&lt;p&gt;
From //build in Anaheim
&lt;/p&gt;
&lt;iframe style="WIDTH: 960px; HEIGHT: 544px" src="http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-862T/player?w=960&amp;amp;h=544" frameborder=0 scrolling=no&gt;
&lt;/iframe&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=981f28ab-0743-4c34-9130-8811a8d523da" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,981f28ab-0743-4c34-9130-8811a8d523da.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/ISB</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=d41ef7d0-63cd-42ad-8455-ccfcd40997a6</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,d41ef7d0-63cd-42ad-8455-ccfcd40997a6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,d41ef7d0-63cd-42ad-8455-ccfcd40997a6.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=d41ef7d0-63cd-42ad-8455-ccfcd40997a6</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Our team’s Development Manager MK (Murali Krishnaprasad) and me were interviewed by
Michael Washam on May 2011 CTP release of Windows Azure AppFabric. We discuss new
technologies such as Topics, Queues, Subscriptions and how this relates to doing async
development in the cloud.
</p>
        <p>
 <iframe style="WIDTH: 512px; HEIGHT: 288px" src="http://channel9.msdn.com/Blogs/Server-Side/Understanding-Windows-Azure-AppFabric-Queues/player?w=512&amp;h=288" frameborder="0" scrolling="no"></iframe></p>
        <p>
Republished from <a href="http://channel9.msdn.com/Blogs/Server-Side/Understanding-Windows-Azure-AppFabric-Queues" target="_blank">Channel
9</a></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=d41ef7d0-63cd-42ad-8455-ccfcd40997a6" />
      </body>
      <title>Understanding Windows Azure AppFabric Queues (and Topics)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,d41ef7d0-63cd-42ad-8455-ccfcd40997a6.aspx</guid>
      <link>http://vasters.com/clemensv/2011/06/11/Understanding+Windows+Azure+AppFabric+Queues+And+Topics.aspx</link>
      <pubDate>Sat, 11 Jun 2011 01:29:21 GMT</pubDate>
      <description>&lt;p&gt;
Our team’s Development Manager MK (Murali Krishnaprasad) and me were interviewed by
Michael Washam on May 2011 CTP release of Windows Azure AppFabric. We discuss new
technologies such as Topics, Queues, Subscriptions and how this relates to doing async
development in the cloud.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;iframe style="WIDTH: 512px; HEIGHT: 288px" src="http://channel9.msdn.com/Blogs/Server-Side/Understanding-Windows-Azure-AppFabric-Queues/player?w=512&amp;amp;h=288" frameborder=0 scrolling=no&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
Republished from &lt;a href="http://channel9.msdn.com/Blogs/Server-Side/Understanding-Windows-Azure-AppFabric-Queues" target=_blank&gt;Channel
9&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=d41ef7d0-63cd-42ad-8455-ccfcd40997a6" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,d41ef7d0-63cd-42ad-8455-ccfcd40997a6.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture</category>
      <category>Technology/ISB</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=a14d84f7-0d07-49da-a5d8-35088052c3e5</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=a14d84f7-0d07-49da-a5d8-35088052c3e5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In case you need a refresher or update about the things me and our team work on at
Microsoft, <a href="http://www.msteched.com/2010/Australia/COS230">go here</a> for
a very recent and very good presentation by my PM colleague <a href="http://twitter.com/mmyslin">Maggie
Myslinska</a> from TechEd Australia 2010 about Windows Azure AppFabric with Service
Bus demos and a demo of the new Access Control V2 CTP
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=a14d84f7-0d07-49da-a5d8-35088052c3e5" />
      </body>
      <title>Windows Azure AppFabric Overview session from TechEd Australia 2010 </title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</guid>
      <link>http://vasters.com/clemensv/2010/09/09/Windows+Azure+AppFabric+Overview+Session+From+TechEd+Australia+2010.aspx</link>
      <pubDate>Thu, 09 Sep 2010 01:08:52 GMT</pubDate>
      <description>&lt;p&gt;
In case you need a refresher or update about the things me and our team work on at
Microsoft, &lt;a href="http://www.msteched.com/2010/Australia/COS230"&gt;go here&lt;/a&gt; for
a very recent and very good presentation by my PM colleague &lt;a href="http://twitter.com/mmyslin"&gt;Maggie
Myslinska&lt;/a&gt; from TechEd Australia 2010 about Windows Azure AppFabric with Service
Bus demos and a demo of the new Access Control V2 CTP
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=a14d84f7-0d07-49da-a5d8-35088052c3e5" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture/SOA</category>
      <category>Azure</category>
      <category>Technology</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </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>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Building “hybrid” cloud applications where parts of an an app lives up in a cloud
infrastructure and other parts of the infrastructure live at a hosting site, or a
data center, or even in your house ought to be simple – especially in this day and
age of Web services. You create a Web service, make it accessible through your firewall
and NAT, and the the cloud-hosted app calls it. That’s as easy as it ought to be.
</p>
        <p>
Unfortunately it’s not always that easy. If the server sits behind an Internet connection
with dynamically assigned IP addresses, if the upstream ISP is blocking select ports,
if it’s not feasible to open up inbound firewall ports, or if you have no influence
over the infrastructure whatsoever, reaching an on-premise service from the cloud
(or anywhere else) is a difficult thing to do. For these scenarios (and others) our
team is building the <em><a href="http://msdn.microsoft.com/en-us/azure/netservices.aspx">Windows
Azure platform AppFabric</a> Service Bus</em> (friends call us just <em>Service Bus</em>). 
</p>
        <p>
Now – the Service Bus and the client bits in the <em>Microsoft.ServiceBus.dll </em>assembly
are great if you have services can can be readily hooked up into the Service Bus because
they’re built with WCF. For services that aren’t built with WCF, but are at least
using HTTP, I’ve <a href="http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx">previously
shown a way</a> to hook them into Service Bus and have also demoed an updated version
of that capability at Sun’s Java One. I’ll release an update for those bits tomorrow
after my talk at PDC09 – the version currently here on my blog (ironically) doesn’t
play well with SOAP and also doesn’t have rewrite capabilities for WSDL. The new version
does. 
</p>
        <p>
But what if your service isn’t a WCF service or doesn’t speak HTTP? What if it speaks
SMTP, SNMP, POP, IMAP, RDP, TDS, SSH, ETC? 
</p>
        <p>
          <strong>Introducing Port Bridge</strong>
        </p>
        <p>
“Port Bridge” – which is just a descriptive name for this code sample, not an attempt
at branding – is a point-to-point tunneling utility to help with these scenarios.
Port Bridge consists of two components, the “Port Bridge Service” and the “Port Bridge
Agent”. Here’s a picture:
</p>
        <p>
          <a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/865a80e15ca0_D9A4/image_2.png">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="image" border="0" alt="image" src="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/865a80e15ca0_D9A4/image_thumb.png" width="611" height="220" />
          </a>
        </p>
        <p>
The Agent’s job is to listen for and accept TCP or Named Pipe connections on a configurable
port or local pipe name. The Service’s job is to accept for incoming connections from
the Agent, establish a duplex channel with the Agent, and pump the data from the Agent
to the actual listening service – and vice versa. It’s actually quite simple. In the
picture above you see that the Service is configured to connect to a SQL Server listening
at the SQL Server default port 1433 and that the Agent – running on a different machine,
is listening on port 1433 as well, thus mapping the remote SQL Server onto the Agent
machine as if it ran there. You can (and I think of that as to be more common) map
the service on the Agent to any port you like – say higher up at 41433.
</p>
        <p>
In order to increase the responsiveness and throughput for protocols that are happy
to kill and reestablish connections such as HTTP does, “Port Bridge” is always multiplexing
concurrent traffic that’s flowing between two parties on the same logical socket.
When using Port Bridge to bridge to a remote HTTP proxy that the Service machine can
see, but the Agent machine can’t see (which turns out to be the at-home scenario that
this capability emerged from) there are very many and very short-lived connections
being tunneled through the channel. Creating a new Service Bus channel for each of
these connections is feasible – but not very efficient. Holding on to a connection
for an extended period of time and multiplexing traffic over it is also beneficial
in the Port Bridge case because it is using the Service Bus <em>Hybrid</em> connection
mode by default. With <em>Hybrid</em>, all connections are first established through
the Service Bus Relay and then our bits do a little “NAT dance” trying to figure out
whether there’s a way to connect both parties with a direct socket – if that works
the connection gets upgraded to the most direct connections in-flight. The probing,
handshake, and upgrade of the socket may take 2-20 seconds and there’s some degree
of luck involved to get that direct socket established on a very busy NAT – and thus
we want to maximize the use of that precious socket instead of throwing it away all
the time.
</p>
        <p>
          <strong>That seems familiar?!</strong>
        </p>
        <p>
You may notice that <a href="http://vasters.com/clemensv/PermaLink,guid,26dc5df1-8b8c-4f71-8765-8904e584505b.aspx">SocketShifter</a> (built
by our friends at <a href="http://www.aws.net/">AWS in the UK</a>) is quite similar
to Port Bridge. Even though the timing of the respective releases may not suggest
it, Port Bridge is indeed Socketshifter’s older brother. Because we couldn’t make
up our mind on whether to release Port Bridge for a while, I had AWS take a look at
the service contract shown below and explained a few principles that I’m also explaining
here and they had a first version of Socketshifter running within a few hours. There’s
nothing wrong with having two variants of the same thing. 
</p>
        <p>
          <strong>How does it work?</strong>
        </p>
        <p>
Since I’m publishing this as a sample, I obviously need to spend a little time on
the “how”, even I’ll limit that here and will explain that in more detail in a future
post. At the heart of the app, the contract that’s used between the Agent and the
Service is a simple duplex WCF contract:
</p>
        <pre class="code">    [<span style="COLOR: #2b91af">ServiceContract</span>(Namespace=<span style="COLOR: #a31515">"n:"</span>,
Name=<span style="COLOR: #a31515">"idx"</span>, CallbackContract=<span style="COLOR: blue">typeof</span>(<span style="COLOR: #2b91af">IDataExchange</span>),
SessionMode=<span style="COLOR: #2b91af">SessionMode</span>.Required)] <span style="COLOR: blue">public
interface </span><span style="COLOR: #2b91af">IDataExchange </span>{ [<span style="COLOR: #2b91af">OperationContract</span>(Action=<span style="COLOR: #a31515">"c"</span>,
IsOneWay = <span style="COLOR: blue">true</span>, IsInitiating=<span style="COLOR: blue">true</span>)] <span style="COLOR: blue">void </span>Connect(<span style="COLOR: blue">string </span>i);
[<span style="COLOR: #2b91af">OperationContract</span>(Action = <span style="COLOR: #a31515">"w"</span>,
IsOneWay = <span style="COLOR: blue">true</span>)] <span style="COLOR: blue">void </span>Write(<span style="COLOR: #2b91af">TransferBuffer </span>d);
[<span style="COLOR: #2b91af">OperationContract</span>(Action = <span style="COLOR: #a31515">"d"</span>,
IsOneWay = <span style="COLOR: blue">true</span>, IsTerminating = <span style="COLOR: blue">true</span>)] <span style="COLOR: blue">void </span>Disconnect();
}</pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
There’s a way to establish a session, send data either way, and close the session.
The <em>TransferBuffer</em> type is really just a trick to avoid extra buffer copies
during serialization for efficiency reasons. But that’s it. The rest of Port Bridge
is a set of queue-buffered streams and pumps to make the data packets flow smoothly
and to accept inbound sockets/pipes and dispatch them out to the proxied services.
What’s noteworthy is that Port Bridge doesn’t use WCF streaming, but sends data in
chunks – which allows for much better flow control and enables multiplexing.
</p>
        <p>
Now you might say <em>You are using a WCF ServiceContract?</em> <em>Isn’t that
using SOAP and doesn’t that cause ginormous overhead?</em> No, it doesn’t. We’re using
the WCF binary encoder in session mode here. That’s about as efficient as you can
get it on the wire with serialized data. The per-frame SOAP overhead for net.tcp with
the binary encoder in session mode is in the order of 40-50 bytes per message because
of dictionary-based metadata compression. The binary encoder also isn’t doing any
base64 trickery but treats binary as binary – one byte is one byte. Port Bridge is
using a default frame size of 64K (which gets filled up in high-volume streaming cases
due to the built-in Nagling support) and so we’re looking at an overhead of far less
than 0.1%. That’s not shabby. 
</p>
        <p>
          <strong>How do I use it?</strong>
        </p>
        <p>
This is a code sample and thus you’ll have to build it using Visual Studio 2008. You’ll
find three code projects: <em>PortBridge</em> (the Service), <em>PortBridgeAgent</em> (the
Agent), and the <em>Microsoft.Samples.ServiceBus.Connections</em> assembly that contains
the bulk of the logic for Port Bridge. It’s mostly straightforward to embed the agent
side or the service side into other hosts and I’ll show that in a separate post. 
</p>
        <p>
          <strong>Service</strong>
        </p>
        <p>
The service’s exe file is “PortBridge.exe” and is both a console app and a Windows
Service. If the Windows Service isn’t registered, the app will always start as a console
app. If the Windows Service is registered (with the installer or with installutil.exe)
you can force console-mode with the –c command line option.
</p>
        <p>
The app.config file on the Service Side (PortBridge/app.config, PortBridge.exe.config
in the binaries folder) specifies what ports or named pipes you want to project into
Service Bus:
</p>
        <pre class="code">
          <span style="COLOR: blue"> &lt;</span>
          <span style="COLOR: #a31515">portBridge </span>
          <span style="COLOR: red">serviceBusNamespace</span>
          <span style="COLOR: blue">=</span>"<span style="COLOR: blue">mynamespace</span>" <span style="COLOR: red">serviceBusIssuerName</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">owner</span>" <span style="COLOR: red">serviceBusIssuerSecret</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">xxxxxxxx</span>" <span style="COLOR: red">localHostName</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">mybox</span>"<span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">hostMappings</span><span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">add </span><span style="COLOR: red">targetHost</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">localhost</span>" <span style="COLOR: red">allowedPorts</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">3389</span>" <span style="COLOR: blue">/&gt;
&lt;/</span><span style="COLOR: #a31515">hostMappings</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">portBridge</span><span style="COLOR: blue">&gt;</span></pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
The <em>serviceBusNamespace</em> attribute takes your Service Bus namespace name,
and the <em>serviceBusIssuerSecret</em> the respective secret. The <em>serviceBusIssuerName</em> should
remain “owner” unless you know why you want to change it. If you don’t have an <em>AppFabric </em>account
you might not understand what I’m writing about: <a href="https://netservices.azure.com">Go
make one</a>.  
</p>
        <p>
The <em>localHostName</em> attribute is optional and when set, it’s the name that’s
being used to map “localhost” into your Service Bus namespace. By default the name
that’s being used is the good old Windows computer-name.
</p>
        <p>
The <em>hostMappings </em>section contains a list of hosts and rules for what you
want to project out to Service Bus. Mind that all inbound connections to the endpoints
generated from the host mappings section are protected by the Access Control service
and require a token that grants access to your namespace – which is already very different
from opening up a port in your firewall. If you open up port 3389 (Remote Desktop)
through your firewall and NAT, everyone can walk up to that port and try their password-guessing
skills. If you open up port 3389 via Port Bridge, you first need to get through the
Access Control gate before you can even get at the remote port. 
</p>
        <p>
New host mappings are added with the <em>add</em> element. You can add any host that
the machine running the Port Bridge service can “see” via the network. The <em>allowedPorts </em>and <em>allowedPipes</em> attributes
define with TCP ports and/or which local named pipes are accessible. Examples:
</p>
        <ul>
          <li>
            <span style="COLOR: blue">&lt;</span>
            <span style="COLOR: #a31515">add </span>
            <span style="COLOR: red">targetHost</span>
            <span style="COLOR: blue">=</span>"<span style="COLOR: blue">localhost</span>" <span style="COLOR: red">allowedPorts</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">3389</span>" <span style="COLOR: blue">/&gt; </span>project
the local machine into Service Bus and only allow Remote Desktop (3389) 
</li>
          <li>
            <span style="COLOR: blue">&lt;</span>
            <span style="COLOR: #a31515">add </span>
            <span style="COLOR: red">targetHost</span>
            <span style="COLOR: blue">=</span>"<span style="COLOR: blue">localhost</span>" <span style="COLOR: red">allowedPorts</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">3389,1433</span>" <span style="COLOR: blue">/&gt; </span>project
the local machine into Service Bus and allow Remote Desktop (3389) and SQL Server
TDS (1433) 
</li>
          <li>
            <span style="COLOR: blue">&lt;</span>
            <span style="COLOR: #a31515">add </span>
            <span style="COLOR: red">targetHost</span>
            <span style="COLOR: blue">=</span>"<span style="COLOR: blue">localhost</span>" <span style="COLOR: red">allowedPorts</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">*</span>" <span style="COLOR: blue">/&gt; </span>project
the local machine into Service Bus and only allow any TCP port connection 
</li>
          <li>
            <span style="COLOR: blue">&lt;</span>
            <span style="COLOR: #a31515">add </span>
            <span style="COLOR: red">targetHost</span>
            <span style="COLOR: blue">=</span>"<span style="COLOR: blue">localhost</span>" <span style="COLOR: red">allowedPipes</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">sql/query</span>" <span style="COLOR: blue">/&gt; </span>project
the local machine into Service Bus and allow no TCP connections but all named pipe
connections to \.\pipes\sql\query 
</li>
          <li>
            <span style="COLOR: blue">&lt;</span>
            <span style="COLOR: #a31515">add </span>
            <span style="COLOR: red">targetHost</span>
            <span style="COLOR: blue">=</span>"<span style="COLOR: blue">otherbox</span>" <span style="COLOR: red">allowedPorts</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">1433</span>" <span style="COLOR: blue">/&gt; </span>project
the machine “otherbox” into Service Bus and allow SQL Server TDS connections via TCP 
</li>
        </ul>
        <p>
          <strong>Agent</strong>
        </p>
        <p>
The agent’s exe file is “PortBridgeAgent.exe” and is also both a console app and a
Windows Service. 
</p>
        <p>
The app.config file on the Agent side (PortBridgeAgent/app.config, PortBridgeAgent.exe.config
in the binaries folder) specifies which ports or pipes you want to project into the
Agent machine and whether and how you want to firewall these ports. The firewall rules
here are not interacting with your local firewall. This is an additional layer of
protection.
</p>
        <pre class="code">
          <span style="COLOR: blue"> &lt;</span>
          <span style="COLOR: #a31515">portBridgeAgent </span>
          <span style="COLOR: red">serviceBusNamespace</span>
          <span style="COLOR: blue">=</span>"<span style="COLOR: blue">mysolution</span>" <span style="COLOR: red">serviceBusIssuerName</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">owner</span>" <span style="COLOR: red">serviceBusIssuerSecret</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">xxxxxxxx</span>"<span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">portMappings</span><span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">port </span><span style="COLOR: red">localTcpPort</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">13389</span>" <span style="COLOR: red">targetHost</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">mymachine</span>" <span style="COLOR: red">remoteTcpPort</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">3389</span>"<span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">firewallRules</span><span style="COLOR: blue">&gt;
&lt;</span><span style="COLOR: #a31515">rule </span><span style="COLOR: red">source</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">127.0.0.1</span>" <span style="COLOR: blue">/&gt;
&lt;</span><span style="COLOR: #a31515">rule </span><span style="COLOR: red">sourceRangeBegin</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">10.0.0.0</span>" <span style="COLOR: red">sourceRangeEnd</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">10.255.255.255</span>" <span style="COLOR: blue">/&gt;
&lt;/</span><span style="COLOR: #a31515">firewallRules</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">port</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">portMappings</span><span style="COLOR: blue">&gt;
&lt;/</span><span style="COLOR: #a31515">portBridgeAgent</span><span style="COLOR: blue">&gt;</span></pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
Again, the <em>serviceBusNamespace</em> attribute takes your Service Bus namespace
name, and the <em>serviceBusIssuerSecret</em> the respective secret. 
</p>
        <p>
The <em>portMappings</em> collection holds the individual ports or pipes you want
to bring onto the local machine. Shown above is a mapping of Remote Desktop (port
3389 on the machine with the computer name or <em>localHostName</em> ‘mymachine’)
to the local port 13389. Once Service and Agent are running, you can connect to the
agent machine on port 13389 using the Remote Desktop client – with PortBridge mapping
that to port 3389 on the remote box. 
</p>
        <p>
The <em>firewallRules</em> collection allows (un-)constraining the TCP clients that
may connect to the projected port. By default, only connections from the same machine
are permitted.
</p>
        <p>
For named pipes, the configuration is similar, even though there are no firewall rules
and named pipes are always constrained to local connectivity by a set of ACLs that
are applied to the pipe. Pipe names must be relative. Here’s how a named pipe projection
of a default SQL Server instance could look like:
</p>
        <p>
          <span style="COLOR: blue">     &lt;</span>
          <span style="COLOR: #a31515">port </span>
          <span style="COLOR: red">localPipe</span>
          <span style="COLOR: blue">=</span>"<span style="COLOR: blue">sql/remote</span>" <span style="COLOR: red">targetHost</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">mymachine</span>" <span style="COLOR: red">remotePipe</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">sql/query</span>"/<span style="COLOR: blue">&gt;</span></p>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
There’s more to write about this, but how about I let you take a look at the code
first. I’ve also included two setup projects that can easily install Agent and Service
as Windows Services. You obviously don’t have to use those. 
</p>
        <p>
          <em>[Updated archive (2010-06-10) fixing config issue:]</em>
        </p>
        <a href="http://vasters.com/clemensv/content/binary/PortBridge20100610.zip">PortBridge20100610.zip
(90.99 KB)</a>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3e35d8bd-b755-453f-8c63-1a57c570eb4c" />
      </body>
      <title>Port Bridge</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3e35d8bd-b755-453f-8c63-1a57c570eb4c.aspx</guid>
      <link>http://vasters.com/clemensv/2009/11/18/Port+Bridge.aspx</link>
      <pubDate>Wed, 18 Nov 2009 17:37:28 GMT</pubDate>
      <description>&lt;p&gt;
Building “hybrid” cloud applications where parts of an an app lives up in a cloud
infrastructure and other parts of the infrastructure live at a hosting site, or a
data center, or even in your house ought to be simple – especially in this day and
age of Web services. You create a Web service, make it accessible through your firewall
and NAT, and the the cloud-hosted app calls it. That’s as easy as it ought to be.
&lt;/p&gt;
&lt;p&gt;
Unfortunately it’s not always that easy. If the server sits behind an Internet connection
with dynamically assigned IP addresses, if the upstream ISP is blocking select ports,
if it’s not feasible to open up inbound firewall ports, or if you have no influence
over the infrastructure whatsoever, reaching an on-premise service from the cloud
(or anywhere else) is a difficult thing to do. For these scenarios (and others) our
team is building the &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/azure/netservices.aspx"&gt;Windows
Azure platform AppFabric&lt;/a&gt; Service Bus&lt;/em&gt; (friends call us just &lt;em&gt;Service Bus&lt;/em&gt;). 
&lt;/p&gt;
&lt;p&gt;
Now – the Service Bus and the client bits in the &lt;em&gt;Microsoft.ServiceBus.dll &lt;/em&gt;assembly
are great if you have services can can be readily hooked up into the Service Bus because
they’re built with WCF. For services that aren’t built with WCF, but are at least
using HTTP, I’ve &lt;a href="http://vasters.com/clemensv/PermaLink,guid,83edb04a-5696-401c-a919-8c1f379d130c.aspx"&gt;previously
shown a way&lt;/a&gt; to hook them into Service Bus and have also demoed an updated version
of that capability at Sun’s Java One. I’ll release an update for those bits tomorrow
after my talk at PDC09 – the version currently here on my blog (ironically) doesn’t
play well with SOAP and also doesn’t have rewrite capabilities for WSDL. The new version
does. 
&lt;/p&gt;
&lt;p&gt;
But what if your service isn’t a WCF service or doesn’t speak HTTP? What if it speaks
SMTP, SNMP, POP, IMAP, RDP, TDS, SSH, ETC? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Introducing Port Bridge&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
“Port Bridge” – which is just a descriptive name for this code sample, not an attempt
at branding – is a point-to-point tunneling utility to help with these scenarios.
Port Bridge consists of two components, the “Port Bridge Service” and the “Port Bridge
Agent”. Here’s a picture:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/865a80e15ca0_D9A4/image_2.png"&gt;&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;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
The Agent’s job is to listen for and accept TCP or Named Pipe connections on a configurable
port or local pipe name. The Service’s job is to accept for incoming connections from
the Agent, establish a duplex channel with the Agent, and pump the data from the Agent
to the actual listening service – and vice versa. It’s actually quite simple. In the
picture above you see that the Service is configured to connect to a SQL Server listening
at the SQL Server default port 1433 and that the Agent – running on a different machine,
is listening on port 1433 as well, thus mapping the remote SQL Server onto the Agent
machine as if it ran there. You can (and I think of that as to be more common) map
the service on the Agent to any port you like – say higher up at 41433.
&lt;/p&gt;
&lt;p&gt;
In order to increase the responsiveness and throughput for protocols that are happy
to kill and reestablish connections such as HTTP does, “Port Bridge” is always multiplexing
concurrent traffic that’s flowing between two parties on the same logical socket.
When using Port Bridge to bridge to a remote HTTP proxy that the Service machine can
see, but the Agent machine can’t see (which turns out to be the at-home scenario that
this capability emerged from) there are very many and very short-lived connections
being tunneled through the channel. Creating a new Service Bus channel for each of
these connections is feasible – but not very efficient. Holding on to a connection
for an extended period of time and multiplexing traffic over it is also beneficial
in the Port Bridge case because it is using the Service Bus &lt;em&gt;Hybrid&lt;/em&gt; connection
mode by default. With &lt;em&gt;Hybrid&lt;/em&gt;, all connections are first established through
the Service Bus Relay and then our bits do a little “NAT dance” trying to figure out
whether there’s a way to connect both parties with a direct socket – if that works
the connection gets upgraded to the most direct connections in-flight. The probing,
handshake, and upgrade of the socket may take 2-20 seconds and there’s some degree
of luck involved to get that direct socket established on a very busy NAT – and thus
we want to maximize the use of that precious socket instead of throwing it away all
the time.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;That seems familiar?!&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
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
by our friends at &lt;a href="http://www.aws.net/"&gt;AWS in the UK&lt;/a&gt;) is quite similar
to Port Bridge. Even though the timing of the respective releases may not suggest
it, Port Bridge is indeed Socketshifter’s older brother. Because we couldn’t make
up our mind on whether to release Port Bridge for a while, I had AWS take a look at
the service contract shown below and explained a few principles that I’m also explaining
here and they had a first version of Socketshifter running within a few hours. There’s
nothing wrong with having two variants of the same thing. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How does it work?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Since I’m publishing this as a sample, I obviously need to spend a little time on
the “how”, even I’ll limit that here and will explain that in more detail in a future
post. At the heart of the app, the contract that’s used between the Agent and the
Service is a simple duplex WCF contract:
&lt;/p&gt;
&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;,
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;),
SessionMode=&lt;span style="COLOR: #2b91af"&gt;SessionMode&lt;/span&gt;.Required)] &lt;span style="COLOR: blue"&gt;public
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;,
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);
[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;(Action = &lt;span style="COLOR: #a31515"&gt;"w"&lt;/span&gt;,
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);
[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;(Action = &lt;span style="COLOR: #a31515"&gt;"d"&lt;/span&gt;,
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();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
There’s a way to establish a session, send data either way, and close the session.
The &lt;em&gt;TransferBuffer&lt;/em&gt; type is really just a trick to avoid extra buffer copies
during serialization for efficiency reasons. But that’s it. The rest of Port Bridge
is a set of queue-buffered streams and pumps to make the data packets flow smoothly
and to accept inbound sockets/pipes and dispatch them out to the proxied services.
What’s noteworthy is that Port Bridge doesn’t use WCF streaming, but sends data in
chunks – which allows for much better flow control and enables multiplexing.
&lt;/p&gt;
&lt;p&gt;
Now you might say &lt;em&gt;You are using a WCF ServiceContract?&lt;/em&gt;&amp;nbsp;&lt;em&gt;Isn’t that
using SOAP and doesn’t that cause ginormous overhead?&lt;/em&gt; No, it doesn’t. We’re using
the WCF binary encoder in session mode here. That’s about as efficient as you can
get it on the wire with serialized data. The per-frame SOAP overhead for net.tcp with
the binary encoder in session mode is in the order of 40-50 bytes per message because
of dictionary-based metadata compression. The binary encoder also isn’t doing any
base64 trickery but treats binary as binary – one byte is one byte. Port Bridge is
using a default frame size of 64K (which gets filled up in high-volume streaming cases
due to the built-in Nagling support) and so we’re looking at an overhead of far less
than 0.1%. That’s not shabby. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How do I use it?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
This is a code sample and thus you’ll have to build it using Visual Studio 2008. You’ll
find three code projects: &lt;em&gt;PortBridge&lt;/em&gt; (the Service), &lt;em&gt;PortBridgeAgent&lt;/em&gt; (the
Agent), and the &lt;em&gt;Microsoft.Samples.ServiceBus.Connections&lt;/em&gt; assembly that contains
the bulk of the logic for Port Bridge. It’s mostly straightforward to embed the agent
side or the service side into other hosts and I’ll show that in a separate post. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Service&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The service’s exe file is “PortBridge.exe” and is both a console app and a Windows
Service. If the Windows Service isn’t registered, the app will always start as a console
app. If the Windows Service is registered (with the installer or with installutil.exe)
you can force console-mode with the –c command line option.
&lt;/p&gt;
&lt;p&gt;
The app.config file on the Service Side (PortBridge/app.config, PortBridge.exe.config
in the binaries folder) specifies what ports or named pipes you want to project into
Service Bus:
&lt;/p&gt;
&lt;pre class=code&gt;&lt;span style="COLOR: blue"&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portBridge &lt;/span&gt;&lt;span style="COLOR: red"&gt;serviceBusNamespace&lt;/span&gt;&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;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;hostMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&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;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;hostMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&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;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
The &lt;em&gt;serviceBusNamespace&lt;/em&gt; attribute takes your Service Bus namespace name,
and the &lt;em&gt;serviceBusIssuerSecret&lt;/em&gt; the respective secret. The &lt;em&gt;serviceBusIssuerName&lt;/em&gt; should
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
you might not understand what I’m writing about: &lt;a href="https://netservices.azure.com"&gt;Go
make one&lt;/a&gt;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;localHostName&lt;/em&gt; attribute is optional and when set, it’s the name that’s
being used to map “localhost” into your Service Bus namespace. By default the name
that’s being used is the good old Windows computer-name.
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;hostMappings &lt;/em&gt;section contains a list of hosts and rules for what you
want to project out to Service Bus. Mind that all inbound connections to the endpoints
generated from the host mappings section are protected by the Access Control service
and require a token that grants access to your namespace – which is already very different
from opening up a port in your firewall. If you open up port 3389 (Remote Desktop)
through your firewall and NAT, everyone can walk up to that port and try their password-guessing
skills. If you open up port 3389 via Port Bridge, you first need to get through the
Access Control gate before you can even get at the remote port. 
&lt;/p&gt;
&lt;p&gt;
New host mappings are added with the &lt;em&gt;add&lt;/em&gt; element. You can add any host that
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
define with TCP ports and/or which local named pipes are accessible. Examples:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;span style="COLOR: blue"&gt;&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; &lt;/span&gt;project
the local machine into Service Bus and only allow Remote Desktop (3389) 
&lt;li&gt;
&lt;span style="COLOR: blue"&gt;&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,1433&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project
the local machine into Service Bus and allow Remote Desktop (3389) and SQL Server
TDS (1433) 
&lt;li&gt;
&lt;span style="COLOR: blue"&gt;&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;*&lt;/span&gt;" &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;/span&gt;project
the local machine into Service Bus and only allow any TCP port connection 
&lt;li&gt;
&lt;span style="COLOR: blue"&gt;&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;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
the local machine into Service Bus and allow no TCP connections but all named pipe
connections to \.\pipes\sql\query 
&lt;li&gt;
&lt;span style="COLOR: blue"&gt;&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;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
the machine “otherbox” into Service Bus and allow SQL Server TDS connections via TCP 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Agent&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The agent’s exe file is “PortBridgeAgent.exe” and is also both a console app and a
Windows Service. 
&lt;/p&gt;
&lt;p&gt;
The app.config file on the Agent side (PortBridgeAgent/app.config, PortBridgeAgent.exe.config
in the binaries folder) specifies which ports or pipes you want to project into the
Agent machine and whether and how you want to firewall these ports. The firewall rules
here are not interacting with your local firewall. This is an additional layer of
protection.
&lt;/p&gt;
&lt;pre class=code&gt;&lt;span style="COLOR: blue"&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portBridgeAgent &lt;/span&gt;&lt;span style="COLOR: red"&gt;serviceBusNamespace&lt;/span&gt;&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;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&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;
&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;firewallRules&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&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;
&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;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;firewallRules&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;port&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;portMappings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;
&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;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
Again, the &lt;em&gt;serviceBusNamespace&lt;/em&gt; attribute takes your Service Bus namespace
name, and the &lt;em&gt;serviceBusIssuerSecret&lt;/em&gt; the respective secret. 
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;portMappings&lt;/em&gt; collection holds the individual ports or pipes you want
to bring onto the local machine. Shown above is a mapping of Remote Desktop (port
3389 on the machine with the computer name or &lt;em&gt;localHostName&lt;/em&gt; ‘mymachine’)
to the local port 13389. Once Service and Agent are running, you can connect to the
agent machine on port 13389 using the Remote Desktop client – with PortBridge mapping
that to port 3389 on the remote box. 
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;firewallRules&lt;/em&gt; collection allows (un-)constraining the TCP clients that
may connect to the projected port. By default, only connections from the same machine
are permitted.
&lt;/p&gt;
&lt;p&gt;
For named pipes, the configuration is similar, even though there are no firewall rules
and named pipes are always constrained to local connectivity by a set of ACLs that
are applied to the pipe. Pipe names must be relative. Here’s how a named pipe projection
of a default SQL Server instance could look like:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;port &lt;/span&gt;&lt;span style="COLOR: red"&gt;localPipe&lt;/span&gt;&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;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
There’s more to write about this, but how about I let you take a look at the code
first. I’ve also included two setup projects that can easily install Agent and Service
as Windows Services. You obviously don’t have to use those. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;[Updated archive (2010-06-10) fixing config issue:]&lt;/em&gt;
&lt;/p&gt;
&lt;a href="http://vasters.com/clemensv/content/binary/PortBridge20100610.zip"&gt;PortBridge20100610.zip
(90.99 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3e35d8bd-b755-453f-8c63-1a57c570eb4c" /&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>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=634b72d9-e200-45de-82db-2ae4c8ef947e</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,634b72d9-e200-45de-82db-2ae4c8ef947e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,634b72d9-e200-45de-82db-2ae4c8ef947e.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=634b72d9-e200-45de-82db-2ae4c8ef947e</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>… <a href="http://de.wikipedia.org/wiki/Auf_der_Mauer,_auf_der_Lauer">seht Euch
mal die Wa an, wie die Wa ta kann. Auf der Mauer auf der Lauer sitzt ‘ne kleine Wa!</a>.</em>
        </p>
        <p>
It’s a German children’s song. The song starts out with “… sitzt ‘ne kleine Wanze”
(bedbug) and with each verse you leave off a letter: Wanz, Wan, Wa, W, – silence. 
</p>
        <p>
I’ll do the same here, but not with a bedbug:
</p>
        <p>
Let’s sing:
</p>
        <p>
          <font face="Courier New">&lt;soap:Envelope xmlns:soap=”” xmlns:wsaddr=”” xmlns:wsrm=””
xmlns:wsu=”” xmlns:app=””&gt;<br />
   &lt;soap:Header&gt;<br />
         &lt;addr:Action&gt;http://tempuri.org/1.0/Status.set&lt;/addr:Action&gt;<br />
         &lt;wsrm:Sequence&gt;<br />
              &lt;wsrm:Identifier&gt;urn:session-id&lt;/wsrm:Identifier&gt;<br />
              &lt;wsrm:MessageNumber&gt;5&lt;/wsrm:MessageNumber&gt;<br />
          &lt;/wsrm:Sequence&gt;<br />
          &lt;wsse:Security xmlns:wsse=”…”&gt;<br />
              
&lt;wsse:BinarySecurityToken ValueType="</font>
          <font face="Courier New">http://tempuri.org#CustomToken</font>
          <font face="Courier New">" 
<br />
                                        
EncodingType="...#Base64Binary" wsu:Id=" MyID "&gt;<br />
                         
FHUIORv...<br />
               
&lt;/wsse:BinarySecurityToken&gt;<br />
              
&lt;ds:Signature&gt;<br />
                 
&lt;ds:SignedInfo&gt; 
<br />
                     
&lt;ds:CanonicalizationMethod Algorithm="</font>
          <font face="Courier New">http://www.w3.org/2001/10/xml-exc-c14n#"/&gt;</font>
          <br />
          <font face="Courier New">                     
&lt;ds:SignatureMethod Algorithm="</font>
          <font face="Courier New">http://www.w3.org/2000/09/xmldsig#md5"/</font>
          <font face="Courier New">&gt;  
<br />
                     
&lt;ds:Reference URI="#MsgBody"&gt;<br />
                           
&lt;ds:DigestMethod  Algorithm="</font>
          <font face="Courier New">http://www.w3.org/2000/09/xmldsig#md5"/&gt;</font>
          <font face="Courier New"> <br />
                           
&lt;ds:DigestValue&gt;LyLsF0Pi4wPU...&lt;/ds:DigestValue&gt;<br />
                     
&lt;/ds:Reference&gt;<br />
                
&lt;/ds:SignedInfo&gt;   
<br />
                
&lt;ds:SignatureValue&gt;DJbchm5gK...&lt;/ds:SignatureValue&gt; 
<br />
                
&lt;ds:KeyInfo&gt;  
<br />
                 
&lt;wsse:SecurityTokenReference&gt;  
<br />
                   
&lt;wsse:Reference URI="#MyID"/&gt; 
<br />
                  
&lt;/wsse:SecurityTokenReference&gt; 
<br />
              
&lt;/ds:KeyInfo&gt; 
<br />
             &lt;/ds:Signature&gt;<br />
         &lt;/wsse:Security&gt;<br />
         &lt;app:ResponseFormat&gt;Xml&lt;/app:ResponseFormat&gt;<br />
         &lt;app:Key wsu:Id=”AppKey”&gt;27729912882….&lt;/app:Key&gt; 
<br />
    &lt;soap:Header&gt;<br />
    &lt;soap:Body wsu:Id=”MyId”&gt;<br />
          &lt;app:status&gt;Hello, I’m
good&lt;/app:status&gt;<br />
     &lt;/soap:Body&gt;<br />
&lt;/soap:Envelope&gt; </font>
        </p>
        <p>
Not a very pretty song, I’ll admit. Let’s drop a some stuff. Let’s assume that we
don’t need to tell the other party that we’re looking to give it an MD5 signature,
but let’s say that’s implied and so were the canonicalization algorithm. Let’s also
assume that the other side already knows the security token and the key. Since we
only have a single signature digest here and yield a single signature we can just
collapse to the signature value. Heck, you may not even know about what that all means.
Verse 2:
</p>
        <p>
          <font face="Courier New">&lt;soap:Envelope xmlns:soap=”” xmlns:wsaddr=”” xmlns:wsrm=””
xmlns:wsu=”” xmlns:app=””&gt;<br />
   &lt;soap:Header&gt;<br />
         &lt;addr:Action&gt;http://tempuri.org/1.0/Status.set&lt;/addr:Action&gt;<br />
         &lt;wsrm:Sequence&gt;<br />
              &lt;wsrm:Identifier&gt;urn:session-id&lt;/wsrm:Identifier&gt;<br />
              &lt;wsrm:MessageNumber&gt;5&lt;/wsrm:MessageNumber&gt;<br />
          &lt;/wsrm:Sequence&gt;<br />
          &lt;wsse:Security xmlns:wsse=”…”&gt;<br />
              
&lt;ds:Signature&gt;<br />
                 
&lt;ds:SignatureValue&gt;DJbchm5gK...&lt;/ds:SignatureValue&gt; 
<br />
             &lt;/ds:Signature&gt;<br />
         &lt;/wsse:Security&gt;<br />
         &lt;app:ResponseFormat&gt;Xml&lt;/app:ResponseFormat&gt;<br />
         &lt;app:Key wsu:Id=”AppKey”&gt;27729912882….&lt;/app:Key&gt; 
<br />
    &lt;soap:Header&gt;<br />
    &lt;soap:Body wsu:Id=”MyId”&gt;<br />
          &lt;app:status&gt;Hello, I’m
good&lt;/app:status&gt;<br />
     &lt;/soap:Body&gt;<br />
&lt;/soap:Envelope&gt; </font>
        </p>
        <p>
Better. Now let’s strip all these extra XML namespace decorations since there aren’t
any name collisions as far as I can see. We’ll also collapse the rest of the security
elements into one element since there’s no need for three levels of nesting with a
single signature. Verse 3:
</p>
        <p>
          <font face="Courier New">&lt;Envelope&gt;<br />
   &lt;Header&gt;<br />
         &lt;Action&gt;http://tempuri.org/1.0/Status.set&lt;/Action&gt;<br />
         &lt;Sequence&gt;<br />
              &lt;Identifier&gt;urn:session-id&lt;/Identifier&gt;<br />
              &lt;MessageNumber&gt;5&lt;/MessageNumber&gt;<br />
          &lt;/Sequence&gt;<br />
          &lt;SignatureValue&gt;DJbchm5gK...&lt;/SignatureValue&gt;<br />
          &lt;ResponseFormat&gt;Xml&lt;/ResponseFormat&gt;<br />
          &lt;Key&gt;27729912882….&lt;/Key&gt; 
<br />
    &lt;Header&gt;<br />
    &lt;Body&gt;<br />
       &lt;status&gt;Hello, I’m good&lt;/status&gt;<br />
     &lt;/Body&gt;<br />
&lt;/Envelope&gt; </font>
        </p>
        <p>
Much better. The whole angle-bracket stuff and the nesting seems semi-gratuitous and
repetitive here, too. Let’s make that a bit simpler. Verse 4:
</p>
        <p>
          <font face="Courier New">         Action=http://tempuri.org/1.0/Status.set<br />
         Sequence-Identifier=urn:session-id<br />
         Sequence-MessageNumber=5<br />
         SignatureValue=DJbchm5gK...<br />
         ResponseFormat=Xml<br />
         Key=27729912882…. 
<br />
         status=Hello, I’m good</font>
        </p>
        <p>
Much, much better. Now let’s get rid of that weird URI up there and split up the action
and the version info, make some of these keys are little more terse and turn that
into a format that’s easily transmittable over HTTP. By what we have here application/www-form-urlencoded
would probably be best. Verse 5:
</p>
        <p>
          <font face="Courier New">         method=Status.set<br />
         &amp;v=1.0<br />
         &amp;session_key=929872172..<br />
         &amp;call_id=5<br />
         &amp;sig=DJbchm5gK...<br />
         &amp;format=Xml<br />
         &amp;api_key=27729912882…. 
<br />
         &amp;status=Hello,%20I’m%20good</font>
        </p>
        <p>
Oops. <a href="http://wiki.developers.facebook.com/index.php/Status.set">Facebook</a>’s
Status.set API. How did that happen? I thought that was REST?
</p>
        <p>
Now play the song backwards. The “new thing” is largely analogous to where we started
before the WS* Web Services stack and its CORBA/DCE/DCOM predecessors came around
and there are, believe it or not, good reasons for having of that additional “overhead”.
A common way to frame message content and the related control data, a common way to
express complex data structures and distinguish between data domains, a common way
to deal with addressing in multi-hop or store-and-forward messaging scenarios, an
agreed notion of sessions and message sequencing, a solid mechanism for protecting
the integrity of messages and parts of messages. This isn’t all just stupid.
</p>
        <p>
It’s well worth discussing whether messages need to be expressed as XML 1.0 text on
the wire at all times. I don’t think they need to and there are alternatives that
aren’t as heavy. JSON is fine and encodings like the .NET Binary Encoding or Fast
Infoset are viable alternatives as well. It’s also well worth discussing whether WS-Security
and the myriad of related standards that were clearly built by security geniuses for
security geniuses really need to be that complicated or whether we could all live
with a handful of simple profiles and just cut out 80% of the options and knobs and
parameters in that land. 
</p>
        <p>
I find it very sad that the discussion isn’t happening. Instead, people use the “REST”
moniker as the escape hatch to conveniently ignore any existing open standard for
tunnel-through-HTTP messaging and completely avoid the discussion. 
</p>
        <p>
It’s not only sad, it’s actually a bit frustrating. As one of the people responsible
for the protocol surface of the .NET Service Bus, I am absolutely not at liberty to
ignore what exists in the standards space. And this isn’t a mandate handed down to
me, but something I do because I believe it’s the right thing to live with the constraints
of the standards frameworks that exist. 
</p>
        <p>
When we’re sitting down and talk about a REST API, were designing a set of resources
– which may result in splitting a thing like a queue into two resources, head and
tail - and then we put RFC2616 on the table and try to be very precise in picking
the appropriate predefined HTTP method for a given semantic and how the HTTP 2xx,
3xx, 4xx, 5xx status codes map to success and error conditions. We’re also trying
to avoid inventing new ways to express things for which standards exists. There’s
a standard for how to express and manage lists with ATOM and APP and hence we use
that as a foundation. We use the designed extension points to add data to those lists
whenever necessary.
</p>
        <p>
When we’re designing a <strike>RPC</strike> SOAP API, we’re intentionally trying to
avoid inventing new protocol surface and will try to leverage as much from the existing
and standardized stack as we possibly can – at a minimum we’ll stick with established
patterns such as the Create/GetInfo/Renew/Delete patterns for endpoint factories with
renewal (which is used in several standards). I’ll add that we are – ironically -
a bit backlogged on the protocol documentation for our SOAP endpoints and have more
info on the REST endpoint in the latest SDK, but we’ll make that up in the near future.
</p>
        <p>
So - can I build “REST” (mind the quotes) protocols that are as reduced as Facebook,
Twitter, Flickr, etc? Absolutely. There wouldn’t be much new work. It’s just a matter
of how we put messages on and pluck message off the wire. It’s really mostly a matter
of formatting and we have a lot of the necessary building blocks in the shipping WCF
bits today. I would just omit a bunch of decoration as things go out and make a bunch
of assumptions on things that come in.
</p>
        <p>
I just have a sense that I’d be hung upside down from a tree by the press and the
blogging, twittering, facebooking community if I, as someone at Microsoft, wouldn’t
follow the existing open and agreed standards or at least use protocols that we’ve
published under the <a href="http://www.microsoft.com/interop/osp/default.mspx">OSP</a> and
instead just started to do my own interpretative dance - even if that looked strikingly
similar to what the folks down in the Valley are doing. At the very least, someone
would call it a rip-off.
</p>
        <p>
What do you think? What should I/we do? 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=634b72d9-e200-45de-82db-2ae4c8ef947e" />
      </body>
      <title>[Intermission] Auf der Mauer, auf der Lauer sitzt 'ne kleine Wa! - or: When REST isn't REST - or: Why and How I Care About Standards-Compliance</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,634b72d9-e200-45de-82db-2ae4c8ef947e.aspx</guid>
      <link>http://vasters.com/clemensv/2009/04/01/Intermission+Auf+Der+Mauer+Auf+Der+Lauer+Sitzt+Ne+Kleine+Wa+Or+When+REST+Isnt+REST+Or+Why+And+How+I+Care+About+StandardsCompliance.aspx</link>
      <pubDate>Wed, 01 Apr 2009 17:40:41 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;… &lt;a href="http://de.wikipedia.org/wiki/Auf_der_Mauer,_auf_der_Lauer"&gt;seht Euch
mal die Wa an, wie die Wa ta kann. Auf der Mauer auf der Lauer sitzt ‘ne kleine Wa!&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
It’s a German children’s song. The song starts out with “… sitzt ‘ne kleine Wanze”
(bedbug) and with each verse you leave off a letter: Wanz, Wan, Wa, W, – silence. 
&lt;/p&gt;
&lt;p&gt;
I’ll do the same here, but not with a bedbug:
&lt;/p&gt;
&lt;p&gt;
Let’s sing:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;soap:Envelope xmlns:soap=”” xmlns:wsaddr=”” xmlns:wsrm=””
xmlns:wsu=”” xmlns:app=””&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;soap:Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;addr:Action&amp;gt;http://tempuri.org/1.0/Status.set&amp;lt;/addr:Action&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:Identifier&amp;gt;urn:session-id&amp;lt;/wsrm:Identifier&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:MessageNumber&amp;gt;5&amp;lt;/wsrm:MessageNumber&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/wsrm:Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsse:Security xmlns:wsse=”…”&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;wsse:BinarySecurityToken ValueType="&lt;/font&gt;&lt;font face="Courier New"&gt;http://tempuri.org#CustomToken&lt;/font&gt;&lt;font face="Courier New"&gt;" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
EncodingType="...#Base64Binary" wsu:Id=" MyID "&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
FHUIORv...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/wsse:BinarySecurityToken&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:Signature&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:SignedInfo&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:CanonicalizationMethod Algorithm="&lt;/font&gt;&lt;font face="Courier New"&gt;http://www.w3.org/2001/10/xml-exc-c14n#"/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:SignatureMethod Algorithm="&lt;/font&gt;&lt;font face="Courier New"&gt;http://www.w3.org/2000/09/xmldsig#md5"/&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:Reference URI="#MsgBody"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:DigestMethod&amp;nbsp; Algorithm="&lt;/font&gt;&lt;font face="Courier New"&gt;http://www.w3.org/2000/09/xmldsig#md5"/&amp;gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:DigestValue&amp;gt;LyLsF0Pi4wPU...&amp;lt;/ds:DigestValue&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/ds:Reference&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/ds:SignedInfo&amp;gt;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:SignatureValue&amp;gt;DJbchm5gK...&amp;lt;/ds:SignatureValue&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:KeyInfo&amp;gt;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;wsse:SecurityTokenReference&amp;gt;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;wsse:Reference URI="#MyID"/&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/wsse:SecurityTokenReference&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/ds:KeyInfo&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ds:Signature&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/wsse:Security&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:ResponseFormat&amp;gt;Xml&amp;lt;/app:ResponseFormat&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:Key wsu:Id=”AppKey”&amp;gt;27729912882….&amp;lt;/app:Key&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soap:Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soap:Body wsu:Id=”MyId”&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:status&amp;gt;Hello, I’m
good&amp;lt;/app:status&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/soap:Body&amp;gt;&lt;br&gt;
&amp;lt;/soap:Envelope&amp;gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Not a very pretty song, I’ll admit. Let’s drop a some stuff. Let’s assume that we
don’t need to tell the other party that we’re looking to give it an MD5 signature,
but let’s say that’s implied and so were the canonicalization algorithm. Let’s also
assume that the other side already knows the security token and the key. Since we
only have a single signature digest here and yield a single signature we can just
collapse to the signature value. Heck, you may not even know about what that all means.
Verse 2:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;soap:Envelope xmlns:soap=”” xmlns:wsaddr=”” xmlns:wsrm=””
xmlns:wsu=”” xmlns:app=””&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;soap:Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;addr:Action&amp;gt;http://tempuri.org/1.0/Status.set&amp;lt;/addr:Action&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:Identifier&amp;gt;urn:session-id&amp;lt;/wsrm:Identifier&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsrm:MessageNumber&amp;gt;5&amp;lt;/wsrm:MessageNumber&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/wsrm:Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsse:Security xmlns:wsse=”…”&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:Signature&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ds:SignatureValue&amp;gt;DJbchm5gK...&amp;lt;/ds:SignatureValue&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ds:Signature&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/wsse:Security&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:ResponseFormat&amp;gt;Xml&amp;lt;/app:ResponseFormat&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:Key wsu:Id=”AppKey”&amp;gt;27729912882….&amp;lt;/app:Key&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soap:Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soap:Body wsu:Id=”MyId”&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;app:status&amp;gt;Hello, I’m
good&amp;lt;/app:status&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/soap:Body&amp;gt;&lt;br&gt;
&amp;lt;/soap:Envelope&amp;gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Better. Now let’s strip all these extra XML namespace decorations since there aren’t
any name collisions as far as I can see. We’ll also collapse the rest of the security
elements into one element since there’s no need for three levels of nesting with a
single signature. Verse 3:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;Envelope&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Action&amp;gt;http://tempuri.org/1.0/Status.set&amp;lt;/Action&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Identifier&amp;gt;urn:session-id&amp;lt;/Identifier&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MessageNumber&amp;gt;5&amp;lt;/MessageNumber&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Sequence&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SignatureValue&amp;gt;DJbchm5gK...&amp;lt;/SignatureValue&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ResponseFormat&amp;gt;Xml&amp;lt;/ResponseFormat&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Key&amp;gt;27729912882….&amp;lt;/Key&amp;gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Header&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Body&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;status&amp;gt;Hello, I’m good&amp;lt;/status&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Body&amp;gt;&lt;br&gt;
&amp;lt;/Envelope&amp;gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Much better. The whole angle-bracket stuff and the nesting seems semi-gratuitous and
repetitive here, too. Let’s make that a bit simpler. Verse 4:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Action=http://tempuri.org/1.0/Status.set&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sequence-Identifier=urn:session-id&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sequence-MessageNumber=5&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignatureValue=DJbchm5gK...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResponseFormat=Xml&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key=27729912882…. 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status=Hello, I’m good&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Much, much better. Now let’s get rid of that weird URI up there and split up the action
and the version info, make some of these keys are little more terse and turn that
into a format that’s easily transmittable over HTTP. By what we have here application/www-form-urlencoded
would probably be best. Verse 5:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method=Status.set&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;v=1.0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;session_key=929872172..&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;call_id=5&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;sig=DJbchm5gK...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;format=Xml&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;api_key=27729912882…. 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;status=Hello,%20I’m%20good&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Oops. &lt;a href="http://wiki.developers.facebook.com/index.php/Status.set"&gt;Facebook&lt;/a&gt;’s
Status.set API. How did that happen? I thought that was REST?
&lt;/p&gt;
&lt;p&gt;
Now play the song backwards. The “new thing” is largely analogous to where we started
before the WS* Web Services stack and its CORBA/DCE/DCOM predecessors came around
and there are, believe it or not, good reasons for having of that additional “overhead”.
A common way to frame message content and the related control data, a common way to
express complex data structures and distinguish between data domains, a common way
to deal with addressing in multi-hop or store-and-forward messaging scenarios, an
agreed notion of sessions and message sequencing, a solid mechanism for protecting
the integrity of messages and parts of messages. This isn’t all just stupid.
&lt;/p&gt;
&lt;p&gt;
It’s well worth discussing whether messages need to be expressed as XML 1.0 text on
the wire at all times. I don’t think they need to and there are alternatives that
aren’t as heavy. JSON is fine and encodings like the .NET Binary Encoding or Fast
Infoset are viable alternatives as well. It’s also well worth discussing whether WS-Security
and the myriad of related standards that were clearly built by security geniuses for
security geniuses really need to be that complicated or whether we could all live
with a handful of simple profiles and just cut out 80% of the options and knobs and
parameters in that land. 
&lt;/p&gt;
&lt;p&gt;
I find it very sad that the discussion isn’t happening. Instead, people use the “REST”
moniker as the escape hatch to conveniently ignore any existing open standard for
tunnel-through-HTTP messaging and completely avoid the discussion. 
&lt;/p&gt;
&lt;p&gt;
It’s not only sad, it’s actually a bit frustrating. As one of the people responsible
for the protocol surface of the .NET Service Bus, I am absolutely not at liberty to
ignore what exists in the standards space. And this isn’t a mandate handed down to
me, but something I do because I believe it’s the right thing to live with the constraints
of the standards frameworks that exist. 
&lt;/p&gt;
&lt;p&gt;
When we’re sitting down and talk about a REST API, were designing a set of resources
– which may result in splitting a thing like a queue into two resources, head and
tail - and then we put RFC2616 on the table and try to be very precise in picking
the appropriate predefined HTTP method for a given semantic and how the HTTP 2xx,
3xx, 4xx, 5xx status codes map to success and error conditions. We’re also trying
to avoid inventing new ways to express things for which standards exists. There’s
a standard for how to express and manage lists with ATOM and APP and hence we use
that as a foundation. We use the designed extension points to add data to those lists
whenever necessary.
&lt;/p&gt;
&lt;p&gt;
When we’re designing a &lt;strike&gt;RPC&lt;/strike&gt; SOAP API, we’re intentionally trying to
avoid inventing new protocol surface and will try to leverage as much from the existing
and standardized stack as we possibly can – at a minimum we’ll stick with established
patterns such as the Create/GetInfo/Renew/Delete patterns for endpoint factories with
renewal (which is used in several standards). I’ll add that we are – ironically -
a bit backlogged on the protocol documentation for our SOAP endpoints and have more
info on the REST endpoint in the latest SDK, but we’ll make that up in the near future.
&lt;/p&gt;
&lt;p&gt;
So - can I build “REST” (mind the quotes) protocols that are as reduced as Facebook,
Twitter, Flickr, etc? Absolutely. There wouldn’t be much new work. It’s just a matter
of how we put messages on and pluck message off the wire. It’s really mostly a matter
of formatting and we have a lot of the necessary building blocks in the shipping WCF
bits today. I would just omit a bunch of decoration as things go out and make a bunch
of assumptions on things that come in.
&lt;/p&gt;
&lt;p&gt;
I just have a sense that I’d be hung upside down from a tree by the press and the
blogging, twittering, facebooking community if I, as someone at Microsoft, wouldn’t
follow the existing open and agreed standards or at least use protocols that we’ve
published under the &lt;a href="http://www.microsoft.com/interop/osp/default.mspx"&gt;OSP&lt;/a&gt; and
instead just started to do my own interpretative dance - even if that looked strikingly
similar to what the folks down in the Valley are doing. At the very least, someone
would call it a rip-off.
&lt;/p&gt;
&lt;p&gt;
What do you think? What should I/we do? 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=634b72d9-e200-45de-82db-2ae4c8ef947e" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,634b72d9-e200-45de-82db-2ae4c8ef947e.aspx</comments>
      <category>.NET Services</category>
      <category>Architecture</category>
      <category>Azure</category>
      <category>Technology</category>
      <category>Technology/ISB</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=82d7c041-691b-4d37-b552-6de980c3c2b1</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=82d7c041-691b-4d37-b552-6de980c3c2b1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We've got a discussion forum up on MSDN where you can ask questions about Microsoft
.NET Services (Service Bus, Workflow, Access Control): <a href="http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/">http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/</a></p>
        <p>
 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=82d7c041-691b-4d37-b552-6de980c3c2b1" />
      </body>
      <title>Questions about .NET Services? Hit the forums.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</guid>
      <link>http://vasters.com/clemensv/2008/10/28/Questions+About+NET+Services+Hit+The+Forums.aspx</link>
      <pubDate>Tue, 28 Oct 2008 20:20:15 GMT</pubDate>
      <description>&lt;p&gt;
We've got a discussion forum up on MSDN where you can ask questions about Microsoft
.NET Services (Service Bus, Workflow, Access Control): &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/"&gt;http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=82d7c041-691b-4d37-b552-6de980c3c2b1" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</comments>
      <category>Talks</category>
      <category>Technology</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=9dcf76ad-b6e6-47c7-aa81-60970dc6a166</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,9dcf76ad-b6e6-47c7-aa81-60970dc6a166.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,9dcf76ad-b6e6-47c7-aa81-60970dc6a166.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=9dcf76ad-b6e6-47c7-aa81-60970dc6a166</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We’re thrilled to announce that the BizTalk Services “R12” Community Technology Preview
(CTP) is now available for general use. 
</p>
        <p>
“BizTalk Services” is the code-name for a platform-in-the-cloud offering from Microsoft. 
Currently in active development, BizTalk Services provides Messaging, Workflow, and
Identity functionality to enable disparate applications to connect quickly and easily. 
<br />
Combined together in an integrated offering, these capabilities deliver a Service
Bus architectural pattern that is immediately usable by applications that need to
connect across the Internet.  
</p>
        <p>
Many enterprises employ the ‘Enterprise Service Bus’ pattern to interconnect disparate
systems within an organizational domain. Built on Microsoft platform technology, an
ESB might include building blocks such as Windows Server, Active Directory, BizTalk
Server, as well as the Windows Communication Foundation and Windows Workflow Foundation
technologies included in the .NET Framework.  “BizTalk Services” extends the
concept of an ESB to truly exploit the Internet, for instance by exposing individual
service endpoints in a secure fashion or by selectively federating elements of distinct
identity systems to facilitate cross-company collaboration. 
<br />
  
<br />
For ISVs and Solution Providers creating specialized business solutions that enable
collaboration and information exchange across increasingly mobile and distributed
work-forces, “BizTalk Services” provides the cloud-based platform building blocks
to create sophisticated (Internet-) Service Bus solutions with broad reach that could
otherwise only be realized by operating dedicated Data Centers of significant complexity
– which is often out of reach for both, ISVs and their customers. 
</p>
        <p>
          <strong>Major Changes </strong>
        </p>
        <p>
With the release of BizTalk Services “R12”, developers must update all clients and
SDK installations to the new release.  
</p>
        <p>
          <strong>New in R12 - Workflow </strong>
        </p>
        <p>
The most exciting new capability we’ve added in the “R12” CTP is Workflow. These new
cloud-based Workflow capabilities enable ‘service orchestration’ from the cloud. 
This specialized cloud-based, or hosted, Windows Workflow Foundation runtime can orchestrate
services that connect to systems in your enterprise, or to systems running anywhere
on the Internet via Web services messages.  This new power and capability will
enable an entirely new set of application scenarios, and we’re very excited to see
what people will do with it. 
</p>
        <p>
In the SDK you will find  samples showing how to create and control Workflow
instances hosted on the BizTalk Services cloud, including a sample Workflow implementation
that monitors the availability of a website and fires multicast events into the service
bus indicating the state. 
</p>
        <p>
          <strong>New in R12 - Identity</strong>
        </p>
        <p>
For R12, the BizTalk Services Identity Service has been expanded and enhanced to enable
more flexibility for scenarios demanded by our customers.  R12 introduces a new
approach for creating, viewing, and managing access control rules. This approach relies
on a few key principles outlined below:
</p>
        <p>
• Every Identity Service account owns a Security Token Service (STS). 
<br />
• An STS is composed of one or more scopes. 
<br />
• A scope contains zero or more access control rules.<br />
• An STS owner can grant another Identity Service account permission to edit
the access control rules in a scope
</p>
        <p>
A practical illustration to clarify:. The Messaging Service owns an STS whose root
scope is <a href="http://connect.biztalk.net/services/">http://connect.biztalk.net/services/</a>.
When you create a new account (newaccount) in the Identity Service, the messaging
service creates a new scope <a href="http://connect.biztalk.net/services/newaccount">http://connect.biztalk.net/services/newaccount</a>.
The Messaging Service then grants (newaccount) the permission to create access control
rules in that scope. Any communication endpoints hosted there can thus be secured
by the owner of the scope.  Rules from R11 accounts have been migrated to the
“root” scope of the new account.
</p>
        <p>
On the protocols front, we’ve added several new capabilities for ‘REST’ services.
We now support integration with Windows Live ID and have added RFC2617 Basic and HTTPS/Client
Certificate support for acquiring security tokens using simple HTTP GET requests. 
</p>
        <p>
          <strong>New in R12 - Messaging </strong>
        </p>
        <p>
          <em>Connectivity Modes</em>
        </p>
        <p>
The most fundamental new feature area in the Messaging service are the new ‘connectivity
mode’ settings on the RelayBinding. Before this release, BizTalk Services clients
and listeners always required outbound TCP ports 808 and 818 to be available for connecting
to the BizTalk Services cloud for all connection modes except the clients of a listener
running with ConnectionMode.RelayedHttp.  
</p>
        <p>
In this release we are introducing three different connectivity modes: Tcp, Http,
and AutoDetect. The connectivity mode can be set on a static property of the RelayBinding.
The Communication\ExploringFeatures\ConnectionModes\Multicast sample shows how. For
clarity: ‘Connection Mode’ defines the type of end-to-end connection that is to be
established through the Relay. ‘Connectivity Mode’ defines how a particular endpoint
connects up to the Relay. 
</p>
        <p>
The ‘Tcp’ connectivity mode is the most efficient one and works as in previous releases.
The ‘Http’ mode is new. It creates a volatile FIFO buffer for messages in the BizTalk
Services cloud and polls for messages using HTTP ‘parked requests’.  The Http
model exhibits delivery latency characteristics similar to Tcp mode, albeit with slightly
higher bandwidth consumption on idle connections. The ‘AutoDetect’ mode will check
whether TCP connectivity is available and will choose ‘Tcp’ if that’s the case and
‘Http’ otherwise. 
</p>
        <p>
The new HTTP-based connectivity option is only effective for the RelayedOneway, RelayedMulticast
and RelayedDuplex connection modes. RelayedDuplexSession, HybridDuplexSession, and
RelayedHttp (listener only) still require TCP connectivity at this time.  
</p>
        <p>
          <em>Transport Credentials and Unauthenticated Access</em>
        </p>
        <p>
Also, in the “R12” release, the model for specifying the client credentials for the
Relay has now been closely aligned with the standard WCF client credentials model.
Instead of picking and instantiating token providers, there is now a TransportClientEndpointBehavior
that holds all credential information and credential types. The samples in the Communication\ExploringFeatures\RelayAuthentication
of the SDK download clarify the use of this new behavior.
</p>
        <p>
We have added a pair of ‘WebNoAuth’ samples which introduce a new capability that
we had a lot of requests for: Unauthenticated client access. When registering a service
listener you can now explicitly waive the authentication requirement for clients connecting
to your service. This is very useful in Web scenarios where you want to enable any
HTTP client to connect to your service and don’t want them to authenticate in any
way. For the time being we suggest that you always use this new  unauthenticated
access mode for RelayedHttp services until we release the update for the ‘Web’ client
authentication capability. 
</p>
        <p>
For R12, we have omitted the ‘Web’ (REST) samples for Relay authentication since that
area is undergoing some substantial protocol changes.  The update for this will
be released soon. In the interim, existing applications that were built on a prior
release of the BizTalk Services SDK to use the authentication technique shown in the
R11 ‘Web’ sample must be modified to use unauthenticated access as shown in the new
‘WebNoAuth’ sample.   
</p>
        <p>
          <strong>Give it a try</strong>
        </p>
        <p>
The new BizTalk Services “R12” CTP is online and available now for your use. 
The SDK is available at <a href="http://labs.biztalk.net">http://labs.biztalk.net</a>.
If you already have an account for BizTalk Services, your accounts and settings have
been migrated to the new environment. If you don’t have an account yet, just sign
up, download the SDK, and get started creating the new generation of connected applications.   
<br /></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=9dcf76ad-b6e6-47c7-aa81-60970dc6a166" />
      </body>
      <title>Announcing the Microsoft Code-Name "BizTalk Services" R12 Release </title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,9dcf76ad-b6e6-47c7-aa81-60970dc6a166.aspx</guid>
      <link>http://vasters.com/clemensv/2008/07/16/Announcing+The+Microsoft+CodeName+BizTalk+Services+R12+Release.aspx</link>
      <pubDate>Wed, 16 Jul 2008 00:30:37 GMT</pubDate>
      <description>&lt;p&gt;
We’re thrilled to announce that the BizTalk Services “R12” Community Technology Preview
(CTP) is now available for general use. 
&lt;/p&gt;
&lt;p&gt;
“BizTalk Services” is the code-name for a platform-in-the-cloud offering from Microsoft.&amp;nbsp;
Currently in active development, BizTalk Services provides Messaging, Workflow, and
Identity functionality to enable disparate applications to connect quickly and easily. 
&lt;br&gt;
Combined together in an integrated offering, these capabilities deliver a Service
Bus architectural pattern that is immediately usable by applications that need to
connect across the Internet.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Many enterprises employ the ‘Enterprise Service Bus’ pattern to interconnect disparate
systems within an organizational domain. Built on Microsoft platform technology, an
ESB might include building blocks such as Windows Server, Active Directory, BizTalk
Server, as well as the Windows Communication Foundation and Windows Workflow Foundation
technologies included in the .NET Framework.&amp;nbsp; “BizTalk Services” extends the
concept of an ESB to truly exploit the Internet, for instance by exposing individual
service endpoints in a secure fashion or by selectively federating elements of distinct
identity systems to facilitate cross-company collaboration. 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
For ISVs and Solution Providers creating specialized business solutions that enable
collaboration and information exchange across increasingly mobile and distributed
work-forces, “BizTalk Services” provides the cloud-based platform building blocks
to create sophisticated (Internet-) Service Bus solutions with broad reach that could
otherwise only be realized by operating dedicated Data Centers of significant complexity
– which is often out of reach for both, ISVs and their customers. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Major Changes &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
With the release of BizTalk Services “R12”, developers must update all clients and
SDK installations to the new release.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;New in R12 - Workflow &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The most exciting new capability we’ve added in the “R12” CTP is Workflow. These new
cloud-based Workflow capabilities enable ‘service orchestration’ from the cloud.&amp;nbsp;
This specialized cloud-based, or hosted, Windows Workflow Foundation runtime can orchestrate
services that connect to systems in your enterprise, or to systems running anywhere
on the Internet via Web services messages.&amp;nbsp; This new power and capability will
enable an entirely new set of application scenarios, and we’re very excited to see
what people will do with it. 
&lt;/p&gt;
&lt;p&gt;
In the SDK you will find&amp;nbsp; samples showing how to create and control Workflow
instances hosted on the BizTalk Services cloud, including a sample Workflow implementation
that monitors the availability of a website and fires multicast events into the service
bus indicating the state. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;New in R12 - Identity&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
For R12, the BizTalk Services Identity Service has been expanded and enhanced to enable
more flexibility for scenarios demanded by our customers.&amp;nbsp; R12 introduces a new
approach for creating, viewing, and managing access control rules. This approach relies
on a few key principles outlined below:
&lt;/p&gt;
&lt;p&gt;
•&amp;nbsp;Every Identity Service account owns a Security Token Service (STS). 
&lt;br&gt;
•&amp;nbsp;An STS is composed of one or more scopes. 
&lt;br&gt;
•&amp;nbsp;A scope contains zero or more access control rules.&lt;br&gt;
•&amp;nbsp;An STS owner can grant another Identity Service account permission to edit
the access control rules in a scope
&lt;/p&gt;
&lt;p&gt;
A practical illustration to clarify:. The Messaging Service owns an STS whose root
scope is &lt;a href="http://connect.biztalk.net/services/"&gt;http://connect.biztalk.net/services/&lt;/a&gt;.
When you create a new account (newaccount) in the Identity Service, the messaging
service creates a new scope &lt;a href="http://connect.biztalk.net/services/newaccount"&gt;http://connect.biztalk.net/services/newaccount&lt;/a&gt;.
The Messaging Service then grants (newaccount) the permission to create access control
rules in that scope. Any communication endpoints hosted there can thus be secured
by the owner of the scope.&amp;nbsp; Rules from R11 accounts have been migrated to the
“root” scope of the new account.
&lt;/p&gt;
&lt;p&gt;
On the protocols front, we’ve added several new capabilities for ‘REST’ services.
We now support integration with Windows Live ID and have added RFC2617 Basic and HTTPS/Client
Certificate support for acquiring security tokens using simple HTTP GET requests. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;New in R12 - Messaging &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Connectivity Modes&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The most fundamental new feature area in the Messaging service are the new ‘connectivity
mode’ settings on the RelayBinding. Before this release, BizTalk Services clients
and listeners always required outbound TCP ports 808 and 818 to be available for connecting
to the BizTalk Services cloud for all connection modes except the clients of a listener
running with ConnectionMode.RelayedHttp.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In this release we are introducing three different connectivity modes: Tcp, Http,
and AutoDetect. The connectivity mode can be set on a static property of the RelayBinding.
The Communication\ExploringFeatures\ConnectionModes\Multicast sample shows how. For
clarity: ‘Connection Mode’ defines the type of end-to-end connection that is to be
established through the Relay. ‘Connectivity Mode’ defines how a particular endpoint
connects up to the Relay. 
&lt;/p&gt;
&lt;p&gt;
The ‘Tcp’ connectivity mode is the most efficient one and works as in previous releases.
The ‘Http’ mode is new. It creates a volatile FIFO buffer for messages in the BizTalk
Services cloud and polls for messages using HTTP ‘parked requests’.&amp;nbsp; The Http
model exhibits delivery latency characteristics similar to Tcp mode, albeit with slightly
higher bandwidth consumption on idle connections. The ‘AutoDetect’ mode will check
whether TCP connectivity is available and will choose ‘Tcp’ if that’s the case and
‘Http’ otherwise. 
&lt;/p&gt;
&lt;p&gt;
The new HTTP-based connectivity option is only effective for the RelayedOneway, RelayedMulticast
and RelayedDuplex connection modes. RelayedDuplexSession, HybridDuplexSession, and
RelayedHttp (listener only) still require TCP connectivity at this time.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Transport Credentials and Unauthenticated Access&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Also, in the “R12” release, the model for specifying the client credentials for the
Relay has now been closely aligned with the standard WCF client credentials model.
Instead of picking and instantiating token providers, there is now a TransportClientEndpointBehavior
that holds all credential information and credential types. The samples in the Communication\ExploringFeatures\RelayAuthentication
of the SDK download clarify the use of this new behavior.
&lt;/p&gt;
&lt;p&gt;
We have added a pair of ‘WebNoAuth’ samples which introduce a new capability that
we had a lot of requests for: Unauthenticated client access. When registering a service
listener you can now explicitly waive the authentication requirement for clients connecting
to your service. This is very useful in Web scenarios where you want to enable any
HTTP client to connect to your service and don’t want them to authenticate in any
way. For the time being we suggest that you always use this new&amp;nbsp; unauthenticated
access mode for RelayedHttp services until we release the update for the ‘Web’ client
authentication capability. 
&lt;/p&gt;
&lt;p&gt;
For R12, we have omitted the ‘Web’ (REST) samples for Relay authentication since that
area is undergoing some substantial protocol changes.&amp;nbsp; The update for this will
be released soon. In the interim, existing applications that were built on a prior
release of the BizTalk Services SDK to use the authentication technique shown in the
R11 ‘Web’ sample must be modified to use unauthenticated access as shown in the new
‘WebNoAuth’ sample.&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Give it a try&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The new BizTalk Services “R12” CTP is online and available now for your use.&amp;nbsp;
The SDK is available at &lt;a href="http://labs.biztalk.net"&gt;http://labs.biztalk.net&lt;/a&gt;.
If you already have an account for BizTalk Services, your accounts and settings have
been migrated to the new environment. If you don’t have an account yet, just sign
up, download the SDK, and get started creating the new generation of connected applications.&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=9dcf76ad-b6e6-47c7-aa81-60970dc6a166" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,9dcf76ad-b6e6-47c7-aa81-60970dc6a166.aspx</comments>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=68edc2ef-85a6-4c42-adf5-ab983766a70c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,68edc2ef-85a6-4c42-adf5-ab983766a70c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,68edc2ef-85a6-4c42-adf5-ab983766a70c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=68edc2ef-85a6-4c42-adf5-ab983766a70c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The BizTalk Services CTP <a href="http://vasters.com/clemensv/PermaLink,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx">will
be switched</a> from the "R11" to the "R12" release starting in about 30 minutes and
we expect to have a 2 hour time window (1400h-1600h PT/2300h-0100h UTC) where existing
service accounts are being rolled over to the new release. We're expecting to be done
with the migration by 1600h. Once the migration is done we'll give you an update
on what's new in R12.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=68edc2ef-85a6-4c42-adf5-ab983766a70c" />
      </body>
      <title>BizTalk Services R11/R12 upgrade in progress</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,68edc2ef-85a6-4c42-adf5-ab983766a70c.aspx</guid>
      <link>http://vasters.com/clemensv/2008/07/15/BizTalk+Services+R11R12+Upgrade+In+Progress.aspx</link>
      <pubDate>Tue, 15 Jul 2008 20:32:18 GMT</pubDate>
      <description>&lt;p&gt;
The BizTalk Services CTP &lt;a href="http://vasters.com/clemensv/PermaLink,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx"&gt;will
be switched&lt;/a&gt; from the "R11" to the "R12" release starting in about 30 minutes and
we expect to have a 2 hour time window (1400h-1600h PT/2300h-0100h UTC) where existing
service accounts are being rolled over to the new release. We're expecting to be&amp;nbsp;done
with the migration by&amp;nbsp;1600h. Once the migration is done we'll give you an update
on what's new in R12.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=68edc2ef-85a6-4c42-adf5-ab983766a70c" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,68edc2ef-85a6-4c42-adf5-ab983766a70c.aspx</comments>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=69b9b1d9-5429-4338-882d-990c32979374</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=69b9b1d9-5429-4338-882d-990c32979374</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>Heads up:  </strong>If things go as planned, the <a href="http://labs.biztalk.net">BizTalk
Services</a> cloud will be unavailable for a few hours during the day on Tuesday 7/15 (U.S.
Pacific Time) since we're doing an update to the services and to the SDK. I will
post an update with the exact time window some time on Monday. Once we're back
up and have verified that everything is working as intended we'll let you know
about it and tell you what's new.
</p>
        <p>
Applications built on the R11 release (the release currently running in the data
center) will have to be recompiled (and in some instances slightly changed) against
the new R12 release's assemblies to run with R12. We've done some protocol adjustments
in R12 that make this necessary - mind that we're still in "experimentation-only
preview" mode here. Theory suggests that some compiled R11 applications will work
against the R12 cloud, but it's not a combination we're explicitly testing as of yet. We
obviously have that sort of backwards compatibility on the radar (it's SOA, should
be easy, right?) but it'll likely take us a couple more revisions before
we're happy enough with the baseline protocols. 
</p>
        <p>
[<strong>Update:</strong> The switch to R12 will happen between 1400-1600 PT/2300-0100
UTC. More later]
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=69b9b1d9-5429-4338-882d-990c32979374" />
      </body>
      <title>BizTalk Services: Update to the services (and SDK) scheduled</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx</guid>
      <link>http://vasters.com/clemensv/2008/07/12/BizTalk+Services+Update+To+The+Services+And+SDK+Scheduled.aspx</link>
      <pubDate>Sat, 12 Jul 2008 20:02:35 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;Heads up:&amp;nbsp; &lt;/strong&gt;If things go as planned, the &lt;a href="http://labs.biztalk.net"&gt;BizTalk
Services&lt;/a&gt; cloud will be unavailable for a few hours during the day on Tuesday 7/15&amp;nbsp;(U.S.
Pacific Time) since we're doing an update to the services and to the SDK.&amp;nbsp;I will
post an update with the exact time window&amp;nbsp;some time on Monday. Once we're back
up and have verified that everything is working as intended we'll&amp;nbsp;let you know
about it and tell you what's new.
&lt;/p&gt;
&lt;p&gt;
Applications built on&amp;nbsp;the R11 release (the release currently running in the data
center) will have to be recompiled (and in some instances slightly changed) against
the new R12 release's assemblies to run with R12. We've done some protocol adjustments
in&amp;nbsp;R12 that make this necessary - mind that we're still in "experimentation-only
preview" mode here. Theory suggests that some compiled R11 applications will work
against the R12 cloud, but it's not a combination we're explicitly testing as of yet.&amp;nbsp;We
obviously have that sort of backwards compatibility on the radar (it's SOA, should
be easy, right?) but&amp;nbsp;it'll likely take us a couple more revisions&amp;nbsp;before
we're happy enough with the baseline protocols. 
&lt;/p&gt;
&lt;p&gt;
[&lt;strong&gt;Update:&lt;/strong&gt; The switch to R12 will happen between 1400-1600 PT/2300-0100
UTC. More later]
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=69b9b1d9-5429-4338-882d-990c32979374" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,69b9b1d9-5429-4338-882d-990c32979374.aspx</comments>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=017e2771-fd13-4a3e-97a3-d1a8dcc8c104</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,017e2771-fd13-4a3e-97a3-d1a8dcc8c104.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,017e2771-fd13-4a3e-97a3-d1a8dcc8c104.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=017e2771-fd13-4a3e-97a3-d1a8dcc8c104</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Didn't I write that I wanted to blog more this year? It's June, you see what came
out of that. 
</p>
        <p>
First things, first; I'm flying to Orlando tomorrow for TechEd. Looking back at what
my conference schedule looked like up until 2 years ago, it's hard to believe that
this is my first (!) scheduled conference talk this year. I actually do miss the life
on the road a little bit. The compensation for it is that I get to see my family every
day (my daughter Eva's first birthday is coming up on June 25th) and that I'm getting
to work on and define the stuff that I 'just' used to be talking about. This
really is the first time that I do a talk about a Microsoft technology that I own;
so that's a bit of a thing:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <strong>SOA 403 </strong>
            <a class="txtbutton" onclick="doEdit('c735bf60-6940-4857-b38f-228345702281')">
              <strong>Building
Federated Solutions on the Internet Service Bus</strong>
            </a>
            <br />
Thursday, June 5, 2008 10:15AM-11:30AM<br />
Room: S220 C (DEV) 
</p>
        </blockquote>
        <p>
'Own' means here that I'm the responsible Program Manager for the entire 'Messaging'
feature area of <a href="http://labs.biztalk.net">BizTalk Services</a> in what
we call the '.NET Online Services' team around here. The PM title isn't entirely accurate,
because I'm also writing pretty substantial amounts of product code these days. The
ability to write and contribute code into the product was the primary reason why I
switched jobs and joined the team I'm now in, but it turned out that the PM role
was the overall better fit for me. So I'm 60% PM and 40% Dev. Or something like
that.
</p>
        <p>
Back to TechEd. There are two talk about what we're building. The first
one is 'today' (I'm still on Pacific Time so I realize that may be a bit
late); Justin Smith will provide a broad overview on the services we're building:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <strong>SOA206 Messaging, Identity, and Workflow in the Cloud<br /></strong>Tuesday, June 3 10:30 AM - 11:45 AM<br />
Room: S220 C   
</p>
        </blockquote>
        <div class="catalogSessionStatus" id="statusdf4127b5-d236-4daa-b0d9-5d050b05ed76">
        </div>
        <div class="speakers">The second talk is mine (above) and as you might be able to
tell by the '400' classification I've got the clear intent not to spend too much time
in Powerpoint. I am going to show four common architectural issues and ways to deal
with them using the cloud platform. And I'm going to show you the code for it. I also
plan (we'll see how that part goes with the on-site network) to host an app for 'crowd
participation' so that I'm explicitly not going to ask you to turn your laptops off.
Since the BizTalk Services SDK hasn't spread very broadly, yet, I'll base the majority
of the demos on the SDK samples so that you can easily repro the stuff that I show
you.
</div>
        <div class="speakers"> 
</div>
        <div class="speakers">Now ... you say ... "BizTalk Services? I don't have anything
to do with BizTalk! Do you want to sell me BizTalk Server?" 
</div>
        <div class="speakers"> 
</div>
        <div class="speakers">Well, it's always nice if customers decide to pick
up some BizTalk Server licenses, but: No, I don't. Our stuff does actually compose
with BizTalk Server 2006 R2 through the WCF Adapter, but the way to think about
this <strong>code-name </strong>is that 'BizTalk' just happens to be the brand
that our division has been using for Messaging. There was the BizTalk Framework, BizTalk
Server and now we've got BizTalk Services. It's a brand. And we're actually finding
that that name isn't really a perfect fit for what we're doing; customers suggest
the same. So there'll be a different name. I'm guessing we're going to talk about
that new name and some other cards we hold in our hands at or around <a href="http://microsoftpdc.com/">PDC</a>.
</div>
        <div class="speakers"> 
</div>
        <div class="speakers">The stuff that I own in the 'Cloud' Messaging area are Naming,
Service Registry, Connectivity/NAT Traversal, Relay, Eventing, a bunch of internal,
servide-side infrastructure supporting those feature areas and some feature areas
that we'll talk about more at PDC. So the fun part of TechEd for me (and you) is that
the 'feedback opportunity' is pretty immediate. We're updating the services (just
about) every quarter and I'll probably check in my last set of stuff for the
current release cycle from Orlando or the night I get back here. From there I'm switching
into planning mode for the next release (aligned with PDC) and if you bring good ideas
that we can fit into the next cycle, I'm very inclined to take them. Not that we'd
have any shortage of feature ideas, mind you. More is better.
</div>
        <div class="speakers"> 
</div>
        <div class="speakers">If you are in Orlando .. I'll have booth duty at the WCF
booth in the Exhibition Hall (or whatever they call it this year) both Wednesday and
Thursday from 2:30PM to closing so come see me there or come to see my talk or just
grab me at the Attendee Party if you can recognize me. ;-)
</div>
        <div class="speakers"> 
</div>
        <div class="speakers">If you are not: <a href="http://labs.biztalk.net">http://labs.biztalk.net</a>  
</div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=017e2771-fd13-4a3e-97a3-d1a8dcc8c104" />
      </body>
      <title>TechEd Time!  - and what I'm up to these days</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,017e2771-fd13-4a3e-97a3-d1a8dcc8c104.aspx</guid>
      <link>http://vasters.com/clemensv/2008/06/03/TechEd+Time+And+What+Im+Up+To+These+Days.aspx</link>
      <pubDate>Tue, 03 Jun 2008 06:47:12 GMT</pubDate>
      <description>&lt;p&gt;
Didn't I write that I wanted to blog more this year? It's June, you see what came
out of that. 
&lt;/p&gt;
&lt;p&gt;
First things, first; I'm flying to Orlando tomorrow for TechEd. Looking back at what
my conference schedule looked like up until 2 years ago, it's hard to believe that
this is my first (!) scheduled conference talk this year. I actually do miss the life
on the road a little bit. The compensation for it is that I get to see my family every
day (my daughter Eva's first birthday is coming up on June 25th) and that I'm getting
to work on and define the stuff that I&amp;nbsp;'just' used to be talking about. This
really is the first time that I do a talk about a Microsoft technology that I own;
so that's a bit of a thing:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;strong&gt;SOA 403 &lt;/strong&gt;&lt;a class=txtbutton onclick="doEdit('c735bf60-6940-4857-b38f-228345702281')"&gt;&lt;strong&gt;Building
Federated Solutions on the Internet Service Bus&lt;/strong&gt;&lt;/a&gt; 
&lt;br&gt;
Thursday, June&amp;nbsp;5, 2008 10:15AM-11:30AM&lt;br&gt;
Room: S220 C (DEV) 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
'Own' means here that I'm the responsible Program Manager for the entire 'Messaging'
feature area of &lt;a href="http://labs.biztalk.net"&gt;BizTalk Services&lt;/a&gt;&amp;nbsp;in what
we call the '.NET Online Services' team around here. The PM title isn't entirely accurate,
because I'm also writing pretty substantial amounts of product code these days. The
ability to write and contribute code into the product was the primary reason why I
switched jobs&amp;nbsp;and joined the team I'm now in, but it turned out that the PM role
was the overall better fit for&amp;nbsp;me. So I'm 60% PM and 40% Dev. Or something like
that.
&lt;/p&gt;
&lt;p&gt;
Back to TechEd.&amp;nbsp;There are two talk about&amp;nbsp;what we're building. The first
one is&amp;nbsp;'today' (I'm&amp;nbsp;still on Pacific Time so I realize that may be a bit
late); Justin Smith will provide a broad overview on the services we're building:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;strong&gt;SOA206 Messaging, Identity, and Workflow in the Cloud&lt;br&gt;
&lt;/strong&gt;Tuesday, June 3 10:30 AM - 11:45 AM&lt;br&gt;
Room: S220 C &amp;nbsp; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;div class=catalogSessionStatus id=statusdf4127b5-d236-4daa-b0d9-5d050b05ed76&gt;
&lt;/div&gt;
&lt;div class=speakers&gt;The second talk is mine (above) and as you might be able to tell
by the '400' classification I've got the clear intent not to spend too much time in
Powerpoint. I am going to show four common architectural issues and ways to deal with
them using the cloud platform. And I'm going to show you the code for it. I also plan
(we'll see how that part goes with the on-site network) to host an app for 'crowd
participation' so that I'm explicitly not going to ask you to turn your laptops off.
Since the BizTalk Services SDK hasn't spread very broadly, yet, I'll base the majority
of the demos on the SDK samples so that you can easily repro the stuff that I show
you.
&lt;/div&gt;
&lt;div class=speakers&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;Now ... you say ... "BizTalk Services? I don't have anything to
do with BizTalk! Do you want to sell me&amp;nbsp;BizTalk Server?"&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;Well, it's always nice if customers&amp;nbsp;decide to&amp;nbsp;pick up
some BizTalk Server licenses, but: No, I don't.&amp;nbsp;Our stuff does actually compose
with BizTalk Server 2006 R2 through the WCF&amp;nbsp;Adapter, but the way to think about
this &lt;strong&gt;code-name&amp;nbsp;&lt;/strong&gt;is that 'BizTalk' just happens to be the brand
that our division has been using for Messaging. There was the BizTalk Framework, BizTalk
Server and now we've got BizTalk Services. It's a brand. And we're actually finding
that that name isn't really a perfect fit for what we're doing; customers suggest
the same. So there'll be a different name. I'm guessing we're going to talk about
that new name and some other cards we hold&amp;nbsp;in our&amp;nbsp;hands at or around &lt;a href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt;.
&lt;/div&gt;
&lt;div class=speakers&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;The stuff that I own in the 'Cloud' Messaging area are Naming,
Service Registry, Connectivity/NAT Traversal, Relay, Eventing, a bunch of internal,
servide-side infrastructure supporting those feature areas and some feature areas
that we'll talk about more at PDC. So the fun part of TechEd for me (and you) is that
the 'feedback opportunity' is pretty immediate. We're updating the services (just
about) every quarter and I'll probably check in my last set of&amp;nbsp;stuff for the
current release cycle from Orlando or the night I get back here. From there I'm switching
into planning mode for the next release (aligned with PDC) and if you bring good ideas
that we can fit into the next cycle, I'm very inclined to take them. Not that we'd
have any shortage of feature ideas, mind you. More is better.
&lt;/div&gt;
&lt;div class=speakers&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;If you are in Orlando ..&amp;nbsp;I'll have booth duty at the WCF
booth in the Exhibition Hall (or whatever they call it this year) both Wednesday and
Thursday from 2:30PM to closing so come see me there or come to see my talk or just
grab me at the Attendee Party if you&amp;nbsp;can recognize me.&amp;nbsp;;-)
&lt;/div&gt;
&lt;div class=speakers&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=speakers&gt;If you are not: &lt;a href="http://labs.biztalk.net"&gt;http://labs.biztalk.net&lt;/a&gt; &amp;nbsp;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=017e2771-fd13-4a3e-97a3-d1a8dcc8c104" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,017e2771-fd13-4a3e-97a3-d1a8dcc8c104.aspx</comments>
      <category>Architecture</category>
      <category>Talks/TechEd US</category>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=3d060e11-9ec3-4cd9-a095-86651c0d5dac</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3d060e11-9ec3-4cd9-a095-86651c0d5dac.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3d060e11-9ec3-4cd9-a095-86651c0d5dac.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3d060e11-9ec3-4cd9-a095-86651c0d5dac</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I highly recommend reading <a href="http://blogs.msdn.com/vbertocci/archive/2008/03/31/using-federatedidentity-net-managed-cards-with-biztalk-services-sdk.aspx">Vittorio's
most excellent and illuminating blog entry</a> for how to use the new features
we've added to BizTalk Identity Services for allowing you to use 3rd Party Managed
Cards. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3d060e11-9ec3-4cd9-a095-86651c0d5dac" />
      </body>
      <title>Federated Identity with BizTalk Services</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3d060e11-9ec3-4cd9-a095-86651c0d5dac.aspx</guid>
      <link>http://vasters.com/clemensv/2008/03/31/Federated+Identity+With+BizTalk+Services.aspx</link>
      <pubDate>Mon, 31 Mar 2008 19:08:04 GMT</pubDate>
      <description>&lt;p&gt;
I highly recommend reading &lt;a href="http://blogs.msdn.com/vbertocci/archive/2008/03/31/using-federatedidentity-net-managed-cards-with-biztalk-services-sdk.aspx"&gt;Vittorio's
most excellent and illuminating blog entry&lt;/a&gt; for how to use the new&amp;nbsp;features
we've added to BizTalk Identity Services for allowing you to use 3rd Party Managed
Cards. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3d060e11-9ec3-4cd9-a095-86651c0d5dac" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3d060e11-9ec3-4cd9-a095-86651c0d5dac.aspx</comments>
      <category>Technology/CardSpace</category>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=798bbf5b-f9f9-45b9-87ba-f6a30c359af9</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=798bbf5b-f9f9-45b9-87ba-f6a30c359af9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="justify">
A flock of pigs has been doing aerobatics high up over Microsoft Campus in Redmond
in the past three weeks. Neither City of Redmond nor Microsoft spokespeople returned
calls requesting comments in time for this article. An Microsoft worker who requested
anonymity and has seen the pigs flying overhead commented that "they are as good as
the Blue Angels at Seafair, just funnier" and "they seem to circle over building 42
a lot, but I wouldn't know why". 
</p>
        <p>
In related news ... 
</p>
        <p align="justify">
We wrapped up the BizTalk Services "R11" CTP this last Thursday and put the latest
SDK release up on <a href="http://labs.biztalk.net/">http://labs.biztalk.net/</a>.
As you may or may not know, "BizTalk Services" is the codename for Microsoft's cloud-based
Identity and Connectivity services - with a significant set of further services in
the pipeline. The R11 release is a major milestone for the data center side of BizTalk
Services, but we've also added several new client-facing features, especially on the
Identity services. You can now authenticate using a certificate in addition to username
and CardSpace authentication, we have enabled support for 3rd party managed CardSpace
cards, and there is extended support for claims based authorization. 
</p>
        <p>
Now the surprising bit:
</p>
        <p align="justify">
Only about an hour before we locked down the SDK on Thursday, we checked a sample
into the samples tree that has a rather unusual set of prerequisites for something
coming out of Microsoft: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p align="justify">
Runtime: <a href="http://java.sun.com/javaee/">Java EE 5</a> on <a href="https://glassfish.dev.java.net/">Sun
Glassfish v2</a> + <a href="https://metro.dev.java.net/">Sun WSIT/Metro</a> (JAX-WS
extensions), Tool: <a href="http://netbeans.org">Netbeans 6.0 IDE</a>. 
</p>
        </blockquote>
        <p align="justify">
The sample shows how to use the BizTalk Services Identity Security Token Service (STS)
to secure the communication between a Java client and a Java service providing federated
authentication and claims-based authorization.
</p>
        <p align="justify">
The sample, which you can find in <em>./Samples/OtherPlatforms/StandaloneAccessControl/JavaEE5</em> once
you installed the SDK, is a pure Java sample not requiring any of our bits on either
the service or client side. The interaction with our services is purely happening
on the wire. 
</p>
        <p align="justify">
If you are a "Javahead", it might seem odd that we're shipping this sample inside
a Windows-only MSI installer and I will agree that that's odd. It's simply a function
of timing and the point in time when we knew that we could get it done (some more
on that below). For the next BizTalk Services SDK release I expect there to be an
additional .jar file for the Java samples.
</p>
        <p align="justify">
It's important to note that this isn't just a thing we did as a one-time thing and
because we could. We have done a significant amount of work on the backend protocol
implementations to start opening up a very broad set of scenarios on the BizTalk Services
Connectivity services for platforms other than .NET. We already have a set of additional
Java EE samples lined up for when we enable that functionality on the backend. However,
since getting security and identity working is a prerequisite for making all other
services work, that's where we started. There'll be more and there'll be more platform
and language choice than Java down the road. 
</p>
        <p align="justify">
Just to be perfectly clear: Around here we strongly believe that .NET and the Windows
Communication Foundation in particular is the most advanced platform to build services,
irrespective of whether they are of the WS-* or REST variety. If you care about my
personal opinion, I'll say that several months of research into the capabilities of
other platforms has only reaffirmed that belief for me and I don't even need to put
a Microsoft hat on to say that. 
</p>
        <p align="justify">
But we recognize and respect that there are a great variety of individual reasons
why people might not be using .NET and WCF. The obvious one is "platform". If you
run on Linux or Unix and/or if your deployment target is a Java Application Server,
then your platform is very likely not .NET. It's something else. If that's your
world, we still think that our services are something that's useful for your applications
and we want to show you why. And it is absolutely not enough for us to say "here is
the wire protocol documentation; go party!". Only Code is Truth.
</p>
        <p align="justify">
I'm also writing "Only Code is Truth" also because we've found - perhaps not too surprisingly
- that there is a significant difference between reading and implementing the WS-*
specs and having things actually work. And here I get to the point where a round of
public "Thank You" is due:
</p>
        <p align="justify">
The Metro team over at Sun Microsystems has made a very significant contribution to
making this all work. Before we started making changes to accommodate Java, there
would have been very little hope for anyone to get this seemingly simple
scenario to work. We had to make quite a few changes even though our service did follow
the specs. 
</p>
        <p align="justify">
While we were adjusting our backend STS accordingly, the Sun Metro team worked on
a set of issues that we identified on their end (with fantastic turnaround times)
and worked those into their public nightly builds. The Sun team also 'promoted' a
nightly build of Metro 1.2 to a semi-permanent <a href="https://metro.dev.java.net/servlets/ProjectDocumentList?folderID=8958&amp;expandFolder=8958&amp;folderID=7636">download
location</a> (the first 1.2 build that got that treatment), because it is the build
tested to successfully interop with our SDK release, even though that build is known
to have some regressions for some of their other test scenarios. As they work towards
wrapping up their 1.2 release and fix those other bugs, we’ll continue to test and
talk to help that the interop scenarios keep working. 
</p>
        <p align="justify">
As a result of this collaboration, Metro 1.2 is going to be a better and more interoperable
release for the Sun's customers and the greater Java community and BizTalk Services
as well as our future identity products will be better and more interoperable, too.
Win-Win. Thank you, Sun.
</p>
        <p align="justify">
As a goodie, I put some code into the Java sample that might be useful even if you
don't even care about our services. Since configuring the Java certificate stores
for standalone applications can be really painful, I added some simple code that's
using a week-old feature of the latest Metro 1.2 bits that allows configuring the
Truststores/Keystores dynamically and pull the stores from the client's .jar at runtime.
The code also has an authorization utility class that shows how to get and evaluate
claims on the service side by pulling the SAML token out of the context and pulling
the correct attributes from the token.
</p>
        <p>
Have fun.
</p>
        <p>
[By the way, this is not an April Fool's joke, in case you were wondering]<br /></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=798bbf5b-f9f9-45b9-87ba-f6a30c359af9" />
      </body>
      <title>BizTalk Services "R11" CTP Comes with a Surprise</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</guid>
      <link>http://vasters.com/clemensv/2008/03/31/BizTalk+Services+R11+CTP+Comes+With+A+Surprise.aspx</link>
      <pubDate>Mon, 31 Mar 2008 17:56:40 GMT</pubDate>
      <description>&lt;p align=justify&gt;
A flock of pigs has been doing aerobatics high up over Microsoft Campus in Redmond
in the past three weeks. Neither City of Redmond nor Microsoft spokespeople returned
calls requesting comments in time for this article. An Microsoft worker who requested
anonymity and has seen the pigs flying overhead commented that "they are as good as
the Blue Angels at Seafair, just funnier" and "they seem to circle over building 42
a lot, but I wouldn't know why". 
&lt;/p&gt;
&lt;p&gt;
In related news ... 
&lt;/p&gt;
&lt;p align=justify&gt;
We wrapped up the BizTalk Services "R11" CTP this last Thursday and put the latest
SDK release up on &lt;a href="http://labs.biztalk.net/"&gt;http://labs.biztalk.net/&lt;/a&gt;.
As you may or may not know, "BizTalk Services" is the codename for Microsoft's cloud-based
Identity and Connectivity services - with a significant set of further services in
the pipeline. The R11 release is a major milestone for the data center side of BizTalk
Services, but we've also added several new client-facing features, especially on the
Identity services. You can now authenticate using a certificate in addition to username
and CardSpace authentication, we have enabled support for 3rd party managed CardSpace
cards, and there is extended support for claims based authorization. 
&lt;/p&gt;
&lt;p&gt;
Now the surprising bit:
&lt;/p&gt;
&lt;p align=justify&gt;
Only about an hour before we locked down the SDK on Thursday, we checked a sample
into the samples tree that has a rather unusual set of prerequisites for something
coming out of Microsoft: 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p align=justify&gt;
Runtime: &lt;a href="http://java.sun.com/javaee/"&gt;Java EE 5&lt;/a&gt; on &lt;a href="https://glassfish.dev.java.net/"&gt;Sun
Glassfish v2&lt;/a&gt; + &lt;a href="https://metro.dev.java.net/"&gt;Sun WSIT/Metro&lt;/a&gt; (JAX-WS
extensions), Tool: &lt;a href="http://netbeans.org"&gt;Netbeans 6.0 IDE&lt;/a&gt;. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p align=justify&gt;
The sample shows how to use the BizTalk Services Identity Security Token Service (STS)
to secure the communication between a Java client and a Java service providing federated
authentication and claims-based authorization.
&lt;/p&gt;
&lt;p align=justify&gt;
The sample, which you can find in &lt;em&gt;./Samples/OtherPlatforms/StandaloneAccessControl/JavaEE5&lt;/em&gt; once
you installed the SDK, is a pure Java sample not requiring any of our bits on either
the service or client side. The interaction with our services is purely happening
on the wire. 
&lt;/p&gt;
&lt;p align=justify&gt;
If you are a "Javahead", it might seem odd that we're shipping this sample inside
a Windows-only MSI installer and I will agree that that's odd. It's simply a function
of timing and the point in time when we knew that we could get it done (some more
on that below). For the next BizTalk Services SDK release I expect there to be an
additional .jar file for the Java samples.
&lt;/p&gt;
&lt;p align=justify&gt;
It's important to note that this isn't just a thing we did as a one-time thing and
because we could. We have done a significant amount of work on the backend protocol
implementations to start opening up a very broad set of scenarios on the BizTalk Services
Connectivity services for platforms other than .NET. We already have a set of additional
Java EE samples lined up for when we enable that functionality on the backend. However,
since getting security and identity working is a prerequisite for making all other
services work, that's where we started. There'll be more and there'll be more platform
and language choice than Java down the road. 
&lt;/p&gt;
&lt;p align=justify&gt;
Just to be perfectly clear: Around here we strongly believe that .NET and the Windows
Communication Foundation in particular is the most advanced platform to build services,
irrespective of whether they are of the WS-* or REST variety. If you care about my
personal opinion, I'll say that several months of research into the capabilities of
other platforms has only reaffirmed that belief for me and I don't even need to put
a Microsoft hat on to say that. 
&lt;/p&gt;
&lt;p align=justify&gt;
But we recognize and respect that there are a great variety of individual reasons
why people might not be using .NET and WCF. The obvious one is "platform". If you
run on Linux or Unix and/or if your deployment target is a Java Application Server,
then your platform is very likely not .NET. It's something else.&amp;nbsp;If that's your
world, we still think that our services are something that's useful for your applications
and we want to show you why. And it is absolutely not enough for us to say "here is
the wire protocol documentation; go party!". Only Code is Truth.
&lt;/p&gt;
&lt;p align=justify&gt;
I'm also writing "Only Code is Truth" also because we've found - perhaps not too surprisingly
- that there is a significant difference between reading and implementing the WS-*
specs and having things actually work. And here I get to the point where a round of
public "Thank You" is due:
&lt;/p&gt;
&lt;p align=justify&gt;
The Metro team over at Sun Microsystems has made a very significant contribution to
making this all work. Before we started making changes to accommodate Java, there
would have been&amp;nbsp;very little&amp;nbsp;hope for anyone to get this seemingly simple
scenario to work. We had to make quite a few changes even though our service did follow
the specs. 
&lt;/p&gt;
&lt;p align=justify&gt;
While we were adjusting our backend STS accordingly, the Sun Metro team worked on
a set of issues that we identified on their end (with fantastic turnaround times)
and worked those into their public nightly builds. The Sun team also 'promoted' a
nightly build of Metro 1.2 to a semi-permanent &lt;a href="https://metro.dev.java.net/servlets/ProjectDocumentList?folderID=8958&amp;amp;expandFolder=8958&amp;amp;folderID=7636"&gt;download
location&lt;/a&gt; (the first 1.2 build that got that treatment), because it is the build
tested to successfully interop with our SDK release, even though that build is known
to have some regressions for some of their other test scenarios. As they work towards
wrapping up their 1.2 release and fix those other bugs, we’ll continue to test and
talk to help that the interop scenarios keep working. 
&lt;/p&gt;
&lt;p align=justify&gt;
As a result of this collaboration, Metro 1.2 is going to be a better and more interoperable
release for the Sun's customers and the greater Java community and BizTalk Services
as well as our future identity products will be better and more interoperable, too.
Win-Win. Thank you, Sun.
&lt;/p&gt;
&lt;p align=justify&gt;
As a goodie, I put some code into the Java sample that might be useful even if you
don't even care about our services. Since configuring the Java certificate stores
for standalone applications can be really painful, I added some simple code that's
using a week-old feature of the latest Metro 1.2 bits that allows configuring the
Truststores/Keystores dynamically and pull the stores from the client's .jar at runtime.
The code also has an authorization utility class that shows how to get and evaluate
claims on the service side by pulling the SAML token out of the context and pulling
the correct attributes from the token.
&lt;/p&gt;
&lt;p&gt;
Have fun.
&lt;/p&gt;
&lt;p&gt;
[By the way, this is not an April Fool's joke, in case you were wondering]&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=798bbf5b-f9f9-45b9-87ba-f6a30c359af9" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</comments>
      <category>Architecture</category>
      <category>IT Strategy</category>
      <category>Technology</category>
      <category>Technology/CardSpace</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=aa1fc98c-46bf-489a-aee2-d46d8c50d416</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,aa1fc98c-46bf-489a-aee2-d46d8c50d416.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,aa1fc98c-46bf-489a-aee2-d46d8c50d416.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=aa1fc98c-46bf-489a-aee2-d46d8c50d416</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Reading Techmeme I'm seeing that Yahoo! went the way of laying off in the order
of a thousand heads by salary ranges rather than experience level. 
</p>
        <p>
Look, Seattle's reuptation for weather may be well deserved, but - on the upside -
we actually have weather. You know - rain, snow, wind, freezing - all that stuff
that reminds you that you are alive - PLUS 5 months of glorious spring/summer weather
where it never gets too hot and never too cold. And we've got the water
and the mountains. It's gorgeous here.
</p>
        <p>
Oh, and, we're really not that evil here. I'm having great fun working here all day.
My boss looks or acts nowhere near like Darth Vader (he's actually a former Silicon
Valley dude who's still adjusting to the climate). I'm learning from people smarter
than me every day. I even get to write code on platforms and runtime I've never thought
I'd ever touch; and I'm not talking about VB6 or Fortran.
</p>
        <p>
So if you are up for a challenge and want to extend the reach of the .NET Framework
into the "cloud" like we're doing here at <a href="http://labs.biztalk.net">http://labs.biztalk.net</a> (bigger,
bigger stuff ahead), I'll stick my head out - you can write me
email at <a href="mailto:clemensv@microsoft.com">clemensv@microsoft.com</a> with
your resume and I will connect you to the right folks.  
</p>
        <p>
And for the long-time readers of my blog: You can write me too. If you want to make
an big impact in the industry, now's the time. Oh, and, FWIW, you'll likely get to
work with me, but you should rather look forward to work with the gusy I work with.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=aa1fc98c-46bf-489a-aee2-d46d8c50d416" />
      </body>
      <title>Hey, Yahoo!, we're hiring.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,aa1fc98c-46bf-489a-aee2-d46d8c50d416.aspx</guid>
      <link>http://vasters.com/clemensv/2008/02/13/Hey+Yahoo+Were+Hiring.aspx</link>
      <pubDate>Wed, 13 Feb 2008 07:00:53 GMT</pubDate>
      <description>&lt;p&gt;
Reading Techmeme I'm seeing that Yahoo! went the way of laying off&amp;nbsp;in the order
of a thousand heads by salary ranges rather than experience level.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Look, Seattle's reuptation for weather may be well deserved, but - on the upside -
we actually have weather. You know - rain, snow, wind, freezing&amp;nbsp;- all that stuff
that reminds you that you are alive - PLUS 5 months of glorious spring/summer weather
where it never&amp;nbsp;gets too hot and never too cold.&amp;nbsp;And we've got the water
and the mountains. It's gorgeous here.
&lt;/p&gt;
&lt;p&gt;
Oh, and, we're really not that evil here. I'm having great fun working here all day.
My boss looks or acts nowhere near like Darth Vader (he's actually a former Silicon
Valley dude who's still adjusting to the climate). I'm learning from people smarter
than me every day. I even get to write code on platforms and runtime I've never thought
I'd ever touch; and I'm not talking about VB6 or Fortran.
&lt;/p&gt;
&lt;p&gt;
So if you are up for a challenge and want to extend the reach of the .NET Framework
into the "cloud"&amp;nbsp;like we're doing here at &lt;a href="http://labs.biztalk.net"&gt;http://labs.biztalk.net&lt;/a&gt;&amp;nbsp;(bigger,
bigger&amp;nbsp;stuff ahead),&amp;nbsp;I'll stick my head out&amp;nbsp;- you can&amp;nbsp;write me
email at&amp;nbsp;&lt;a href="mailto:clemensv@microsoft.com"&gt;clemensv@microsoft.com&lt;/a&gt; with
your resume and I will connect you to the right folks. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
And for the long-time readers of my blog: You can write me too. If you want to make
an big impact in the industry, now's the time. Oh, and, FWIW, you'll likely get to
work with me, but you should rather look forward to work with the gusy I work with.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=aa1fc98c-46bf-489a-aee2-d46d8c50d416" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,aa1fc98c-46bf-489a-aee2-d46d8c50d416.aspx</comments>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=8d56d52c-7aba-47d9-ab6f-236d7ccd411d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,8d56d52c-7aba-47d9-ab6f-236d7ccd411d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,8d56d52c-7aba-47d9-ab6f-236d7ccd411d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=8d56d52c-7aba-47d9-ab6f-236d7ccd411d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
2007 I've posted some 30 entries on my blog. That's what some of the "Whoa, listen
to me, I am so awesome!" blogging crowd of today typically does in a day or two. 2008
promises to be so interesting that it would be a shame not to be blogging, and hence
I do. There'll be lots of things going on in tech and in the world. 
</p>
        <p>
Over the past year I've been very deeply involved in the still rather stealthy project
'<a href="http://www.microsoft.com/soa/products/oslo.aspx">Oslo</a>' about which we'll
talk about in MUCH more detail throughout this year than we have at the recent conferences.
When you are in a project with tight disclosure constraints there's really nothing
of any substance to talk or blog about. Hence I didn't. 
</p>
        <p>
However, since Wednesday I have a new job. I'm now getting my hands dirty by
writing code for our Internet Service Bus infrastructure that's currently code-named <a href="http://labs.biztalk.net/">'BizTalk
Services'</a>. Here, the rules of the game are very different. We're actually building
most of the stuff out in the open and are inviting people to play with it. That's
really more in the spirit of how I've been working with the community in the past
and therefore I'm looking forward to the fun that's to be had in this new team.
</p>
        <p>
Beware; since I gather that I've lost about 95% of my readership of my main at <a href="http://vasters.com/clemensv">http://vasters.com/clemensv</a> blog
due to my inactivity I will use the opportunity to adjust the agenda and make
it a "everything that I find interesting" place. Expect political opinion. My MSDN
blog at <a href="http://blogs.msdn.com/clemensv">http://blogs.msdn.com/clemensv</a> will
get mirrored copies of the tech topics as I've done that since I work here
at MSFT. If you just care about the tech stuff read the MSDN mirror. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=8d56d52c-7aba-47d9-ab6f-236d7ccd411d" />
      </body>
      <title>Good Morning. It's 2008 and I have a new job. </title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,8d56d52c-7aba-47d9-ab6f-236d7ccd411d.aspx</guid>
      <link>http://vasters.com/clemensv/2008/01/11/Good+Morning+Its+2008+And+I+Have+A+New+Job.aspx</link>
      <pubDate>Fri, 11 Jan 2008 19:21:49 GMT</pubDate>
      <description>&lt;p&gt;
2007 I've posted some 30 entries on my blog. That's what some of the "Whoa, listen
to me, I am so awesome!" blogging crowd of today typically does in a day or two. 2008
promises to be so interesting that it would be a shame not to be blogging, and hence
I do. There'll be lots of things going on in tech and in the world.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Over the past year I've been very deeply involved in the still rather stealthy&amp;nbsp;project
'&lt;a href="http://www.microsoft.com/soa/products/oslo.aspx"&gt;Oslo&lt;/a&gt;' about which we'll
talk about in MUCH more detail throughout this year than we have at the recent conferences.
When you are in a project with tight disclosure constraints there's really nothing
of any substance to talk or blog about. Hence I didn't. 
&lt;/p&gt;
&lt;p&gt;
However, since&amp;nbsp;Wednesday I have a new job. I'm now getting my hands dirty&amp;nbsp;by
writing code for our Internet Service Bus infrastructure that's currently code-named &lt;a href="http://labs.biztalk.net/"&gt;'BizTalk
Services'&lt;/a&gt;. Here, the rules of the game are very different. We're actually building
most of the stuff out in the open and are inviting people to play with it. That's
really more in the spirit of how I've been working with the community in the past
and therefore I'm looking forward to the fun that's to be had in this new&amp;nbsp;team.
&lt;/p&gt;
&lt;p&gt;
Beware; since I gather that I've lost about 95% of my readership&amp;nbsp;of my main at &lt;a href="http://vasters.com/clemensv"&gt;http://vasters.com/clemensv&lt;/a&gt; blog
due to my inactivity&amp;nbsp;I will use the opportunity to adjust the agenda and make
it a "everything that I find interesting" place. Expect political opinion. My MSDN
blog at &lt;a href="http://blogs.msdn.com/clemensv"&gt;http://blogs.msdn.com/clemensv&lt;/a&gt;&amp;nbsp;will
get mirrored copies of the tech topics as&amp;nbsp;I've done that&amp;nbsp;since I work here
at MSFT.&amp;nbsp;If you&amp;nbsp;just care about the tech stuff read the MSDN mirror.&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=8d56d52c-7aba-47d9-ab6f-236d7ccd411d" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,8d56d52c-7aba-47d9-ab6f-236d7ccd411d.aspx</comments>
      <category>Blog</category>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=64a8caa0-f9c1-4515-82d3-359a95c56954</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=64a8caa0-f9c1-4515-82d3-359a95c56954</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00112345678910111213.jpg" border="0" />Having
an <a href="http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx">Internet
Service Bus</a> up in the cloud is not very entertaining unless there are services
in the bus. Therefore, I built one (and already showed some of the <a href="http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx">code
basics</a>) that’s hopefully fun to play with and will soon share the first version
with you after some scrubbing and pending a few updates to the ISB that will optimize
the authentication process. It’s a 0.1 version and an experiment. The code download
should be ready in the next two weeks, including those adjustments. But you can actually
play with parts of it today without compiling or installing anything. The info is
at the bottom of this post.
</p>
        <p>
To make matters really interesting, this sample not only shows how to plug a service
into the cloud and call it from some Console app, but is a combo of two rather unusual
hosts for WCF services: A Windows Live Messenger Add-In that acts as the server, and
a Windows Vista Sidebar gadget that acts as the client. 
</p>
        <p>
Since the Silicon Valley scene is currently all over <a href="http://www.twitter.com/">Twitter</a> and
clones of Twitter are apparently popping up <a href="http://www.techcrunch.com/2007/05/14/web-2-in-germany-copy-paste-innovation-or-more/">somewhere
every day</a>, I thought I could easily provide fodder to the proponents of the alleged
Microsoft tradition of purely relying on copying other’s ideas and clone them as well
;-)  Well, no, maybe not. This is a bit different. 
</p>
        <p>
          <img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image0021234567891011121314.jpg" border="0" />TweetieBot
is an example of a simple personal service. If you choose to host it, you own it,
you run it, you control it. The data is held nowhere but on your personal machine
and it’s using the BizTalk Services ISB to stick its head up into the cloud and at
a stable endpoint so that its easily reachable for a circle of friends, bridging the
common obstacles of dynamic IPs, firewalls and NAT. No need to use UPnP or open up
ports on your router. If you choose to do so, you can encrypt traffic so that there’s
no chance that anyone looking at our ISB nor anyone else can see the what’s actually
going across the wire. 
</p>
        <p>
Right now, lots of the Web 2.0 world lives on the assumption that everything needs
to live at central places and that community forms around ad-driven hubs. The mainframe
folks had a similar stance in the 70s and 80s and then Personal Computers came along.
The pendulum is always swinging and I have little doubt that it will swing back to
“personal” once more and that the federation of personal services will seriously challenge
the hub model once more.
</p>
        <p>
So what does the sample do? As indicated, TweetieBot is a bot that plugs into a Windows
Live Messenger using a simple Add-In. <a href="http://community.bartdesmet.net/blogs/bart/archive/2006/09/17/4431.aspx">Bart
De Smet</a> has a brilliant summary for how to build such Add-Ins. When the Add-In
is active and someone chats the bot, it answers politely and remembers the chat line,
time and sender. The bird has a leaky long term memory, though. It forgets everything
past the last 40 lines.
</p>
        <p>
Where it gets interesting is that the Add-In can stick three endpoints into the BizTalk
Services ISB:
</p>
        <ul>
          <li>
A Request/Response Web Service that allows retrieving the list of the last 40 (or
less) “tweets” and also allows client to submit tweets programmatically. 
</li>
          <li>
An RSS service that allows (right now) anyone to peek in to the chat log of the last
40 tweets. 
</li>
          <li>
An Event service that allows subscribers to get real-time notifications whenever a
new tweet is recorded.</li>
        </ul>
        <p>
The accompanying Sidebar Gadget, which is implemented <a href="http://blogs.msdn.com/karstenj/archive/2006/10/09/activex-wpf-gadget.aspx">using
WPF</a>, is a client for two of these services. 
</p>
        <p>
          <img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00312345678910.jpg" border="0" /> <img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image00412345.jpg" border="0" />When
you drop the Gadget on the Sidebar, it will prompt for the IM address of the TweetieBot
service you’d like to subscribe to. Once you’ve authenticated at the relay using your
registered Information Card, the gadget will pull and show the current list of Tweets
and subscribe to the Events service for real-time updates. And whenever someone chats
the bot, the Sidebar gadget will immediately show the new entry. So even though the
Gadget lives on some client machine that’s hidden between several layers of firewalls
and behind NAT, it can actually get push-style event notifications through the cloud! 
</p>
        <p>
“How do I send events to clients?” must be one of the most frequent questions that
I’ve been asked about Web Services in the past several years. Well, this is your answer
right here.
</p>
        <p>
While I’m still toying around with the code and the guys on the 1st floor in my building
are doing some tweaks on the ISB infrastructure to make multi-endpoint authentication
simpler, you can already play with the bot and help me a bit: 
</p>
        <p>
Using Windows Live Messenger you can chat (<a href="msnim:chat?contact=TweetieBot@hotmail.com">click
here</a>) <a href="mailto:tweetiebot@hotmail.com">tweetiebot@hotmail.com</a><b>now</b>.
Drop a few lines. If the bot is online (which means that I’m not tinkering with it)
it will reply. Then look at this <a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss/">RSS
feed</a> [1] and you can see what you and everyone else have been telling the bot
recently. Enjoy.
</p>
        <p>
[1] <a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss">http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss</a></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=64a8caa0-f9c1-4515-82d3-359a95c56954" />
      </body>
      <title>TweetieBot - A BizTalk Services Experiment</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/16/TweetieBot+A+BizTalk+Services+Experiment.aspx</link>
      <pubDate>Wed, 16 May 2007 19:33:48 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00112345678910111213.jpg" border=0&gt;Having
an &lt;a href="http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx"&gt;Internet
Service Bus&lt;/a&gt; up in the cloud is not very entertaining unless there are services
in the bus. Therefore, I built one (and already showed some of the &lt;a href="http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx"&gt;code
basics&lt;/a&gt;) that’s hopefully fun to play with and will soon share the first version
with you after some scrubbing and pending a few updates to the ISB that will optimize
the authentication process. It’s a 0.1 version and an experiment. The code download
should be ready in the next two weeks, including those adjustments. But you can actually
play with parts of it today without compiling or installing anything. The info is
at the bottom of this post.
&lt;/p&gt;
&lt;p&gt;
To make matters really interesting, this sample not only shows how to plug a service
into the cloud and call it from some Console app, but is a combo of two rather unusual
hosts for WCF services: A Windows Live Messenger Add-In that acts as the server, and
a Windows Vista Sidebar gadget that acts as the client. 
&lt;/p&gt;
&lt;p&gt;
Since the Silicon Valley scene is currently all over &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt; and
clones of Twitter are apparently popping up &lt;a href="http://www.techcrunch.com/2007/05/14/web-2-in-germany-copy-paste-innovation-or-more/"&gt;somewhere
every day&lt;/a&gt;, I thought I could easily provide fodder to the proponents of the alleged
Microsoft tradition of purely relying on copying other’s ideas and clone them as well
;-)&amp;nbsp; Well, no, maybe not. This is a bit different. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image0021234567891011121314.jpg" border=0&gt;TweetieBot
is an example of a simple personal service. If you choose to host it, you own it,
you run it, you control it. The data is held nowhere but on your personal machine
and it’s using the BizTalk Services ISB to stick its head up into the cloud and at
a stable endpoint so that its easily reachable for a circle of friends, bridging the
common obstacles of dynamic IPs, firewalls and NAT. No need to use UPnP or open up
ports on your router. If you choose to do so, you can encrypt traffic so that there’s
no chance that anyone looking at our ISB nor anyone else can see the what’s actually
going across the wire. 
&lt;/p&gt;
&lt;p&gt;
Right now, lots of the Web 2.0 world lives on the assumption that everything needs
to live at central places and that community forms around ad-driven hubs. The mainframe
folks had a similar stance in the 70s and 80s and then Personal Computers came along.
The pendulum is always swinging and I have little doubt that it will swing back to
“personal” once more and that the federation of personal services will seriously challenge
the hub model once more.
&lt;/p&gt;
&lt;p&gt;
So what does the sample do? As indicated, TweetieBot is a bot that plugs into a Windows
Live Messenger using a simple Add-In. &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2006/09/17/4431.aspx"&gt;Bart
De Smet&lt;/a&gt; has a brilliant summary for how to build such Add-Ins. When the Add-In
is active and someone chats the bot, it answers politely and remembers the chat line,
time and sender. The bird has a leaky long term memory, though. It forgets everything
past the last 40 lines.
&lt;/p&gt;
&lt;p&gt;
Where it gets interesting is that the Add-In can stick three endpoints into the BizTalk
Services ISB:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
A Request/Response Web Service that allows retrieving the list of the last 40 (or
less) “tweets” and also allows client to submit tweets programmatically. 
&lt;li&gt;
An RSS service that allows (right now) anyone to peek in to the chat log of the last
40 tweets. 
&lt;li&gt;
An Event service that allows subscribers to get real-time notifications whenever a
new tweet is recorded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The accompanying Sidebar Gadget, which is implemented &lt;a href="http://blogs.msdn.com/karstenj/archive/2006/10/09/activex-wpf-gadget.aspx"&gt;using
WPF&lt;/a&gt;, is a client for two of these services. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00312345678910.jpg" border=0&gt;&amp;nbsp;&lt;img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image00412345.jpg" border=0&gt;When
you drop the Gadget on the Sidebar, it will prompt for the IM address of the TweetieBot
service you’d like to subscribe to. Once you’ve authenticated at the relay using your
registered Information Card, the gadget will pull and show the current list of Tweets
and subscribe to the Events service for real-time updates. And whenever someone chats
the bot, the Sidebar gadget will immediately show the new entry. So even though the
Gadget lives on some client machine that’s hidden between several layers of firewalls
and behind NAT, it can actually get push-style event notifications through the cloud! 
&lt;/p&gt;
&lt;p&gt;
“How do I send events to clients?” must be one of the most frequent questions that
I’ve been asked about Web Services in the past several years. Well, this is your answer
right here.
&lt;/p&gt;
&lt;p&gt;
While I’m still toying around with the code and the guys on the 1st floor in my building
are doing some tweaks on the ISB infrastructure to make multi-endpoint authentication
simpler, you can already play with the bot and help me a bit: 
&lt;/p&gt;
&lt;p&gt;
Using Windows Live Messenger you can chat (&lt;a href="msnim:chat?contact=TweetieBot@hotmail.com"&gt;click
here&lt;/a&gt;) &lt;a href="mailto:tweetiebot@hotmail.com"&gt;tweetiebot@hotmail.com&lt;/a&gt; &lt;b&gt;now&lt;/b&gt;.
Drop a few lines. If the bot is online (which means that I’m not tinkering with it)
it will reply. Then look at this &lt;a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss/"&gt;RSS
feed&lt;/a&gt; [1] and you can see what you and everyone else have been telling the bot
recently. Enjoy.
&lt;/p&gt;
&lt;p&gt;
[1] &lt;a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss"&gt;http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=64a8caa0-f9c1-4515-82d3-359a95c56954" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</comments>
      <category>Technology</category>
      <category>Technology/BizTalk</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=2bde249b-5996-4676-9d60-a0b44c7e33fb</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,2bde249b-5996-4676-9d60-a0b44c7e33fb.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,2bde249b-5996-4676-9d60-a0b44c7e33fb.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=2bde249b-5996-4676-9d60-a0b44c7e33fb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://hyperthink.net/blog/2007/05/05/Programmable+Web+Features+In+The+BizTalk+Services+SDK.aspx">Steve
Maine explains</a> what's in the newest revision of the BizTalk Services SDK, including
quite a few (standalone-) surprises for WCF and WF developers. In case you haven't
noticed, we've dropped a new and substantially expanded build of the SDK just a week
after we published the first SDK. 
</p>
        <p>
          <strong>Stop.</strong>
          <strong>Don't leave yet.</strong> Before you say "What do I
care about BizTalk?", you should know that while BizTalk has been more
or less associated with the BizTalk Server 200x product line in the past few
years, (Codename-) BizTalk Services is a complementary set of functionality that's
not only interesting to BizTalk Server customers, but really to all .NET developers. 
</p>
        <p>
Weird? Flip flopping? Confusing? No. The fact that <em>BizTalk</em> is not only
BizTalk Server isn't really new. When BizTalk came out back in 2000 and I was <a href="http://www.amazon.com/BizTalk-Server-2000-Beginners-Guide/dp/0072190116">very
closely looking at what's going on</a> (get it used for $2), the definition read
like this in the <a href="http://www.microsoft.com/presspass/press/2000/Jun00/Framework2PR.mspx">press
release</a>:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>The BizTalk Initiative represents the collective set of investments that Microsoft
is making to facilitate business process integration within and between organizations
using Internet-standard protocols and formats. It includes the BizTalk Framework,
the BizTalk.org community and business document library, as well as BizTalk Server
2000, a business process orchestration server and tools for developing, executing
and managing distributed business processes. These investments are being made in conjunction
with industry standards groups, technology and service providers, as well as key global
organizations. </em>
          </p>
        </blockquote>
        <p dir="ltr">
While the envisioned schema exchange BizTalk.org fell flat since industry-wide message-level-schema
standardization for "everything" more or less didn't happen in the way people initially
expected, what came out of this initiative as a significant element was that
the set of specifications then known as the BizTalk Framework 2.0 that acted as a
foundation for quite a few of the WS-* specifications and the BizTalk Server product
which evolved into a very successful and leading SOA/BPM suite that's soon seeing
its next release, <a href="http://www.microsoft.com/biztalk/default.mspx">BizTalk
Server 2006 R2</a>. Fast forward, read Steven Martin's <a href="http://blogs.msdn.com/stevemar/archive/2007/04/24/have-services-got-feedback.aspx">blog
entry</a> where he writes:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>[...] We see BizTalk Services as a complement to "traditional" BizTalk Server
uses on premise. As you need to coordinate SOA on a broader scale beyond the organization,
we see the introduction of hosted services as one way to help support federation of
business process, messaging, and identity across boundaries. Over time, we want to
ensure that BizTalk Server customers will be able to easily use the cloud services
in conjunction with their premise technology. [...]</em>
          </p>
        </blockquote>
        <p>
So all in all, a very sane way to think about BizTalk is that the software and
services we publish under that name are providing functionality for messaging,
process management and connectivity that go beyond the capability of the
core .NET Framework.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=2bde249b-5996-4676-9d60-a0b44c7e33fb" />
      </body>
      <title>[WebGet] BizTalk</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,2bde249b-5996-4676-9d60-a0b44c7e33fb.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/07/WebGet+BizTalk.aspx</link>
      <pubDate>Mon, 07 May 2007 23:00:16 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://hyperthink.net/blog/2007/05/05/Programmable+Web+Features+In+The+BizTalk+Services+SDK.aspx"&gt;Steve
Maine explains&lt;/a&gt; what's in the newest revision of the BizTalk Services SDK, including
quite a few (standalone-) surprises for WCF and WF developers. In case you haven't
noticed, we've dropped a new and substantially expanded build of the SDK just a week
after we published the first SDK. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Stop.&lt;/strong&gt; &lt;strong&gt;Don't leave yet.&lt;/strong&gt; Before you say "What do I
care about&amp;nbsp;BizTalk?", you should know that&amp;nbsp;while&amp;nbsp;BizTalk&amp;nbsp;has been&amp;nbsp;more
or less&amp;nbsp;associated with the BizTalk Server 200x product line in the past few
years,&amp;nbsp;(Codename-) BizTalk Services is a complementary set of functionality that's
not only interesting to BizTalk Server customers, but really to all .NET developers. 
&lt;/p&gt;
&lt;p&gt;
Weird? Flip flopping? Confusing? No. The fact that &lt;em&gt;BizTalk&lt;/em&gt; is not&amp;nbsp;only
BizTalk Server isn't really new. When BizTalk came out back in 2000 and I was &lt;a href="http://www.amazon.com/BizTalk-Server-2000-Beginners-Guide/dp/0072190116"&gt;very
closely looking at what's going on&lt;/a&gt;&amp;nbsp;(get it used for $2), the definition read
like this in the &lt;a href="http://www.microsoft.com/presspass/press/2000/Jun00/Framework2PR.mspx"&gt;press
release&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;The BizTalk Initiative represents the collective set of investments that Microsoft
is making to facilitate business process integration within and between organizations
using Internet-standard protocols and formats. It includes the BizTalk Framework,
the BizTalk.org community and business document library, as well as BizTalk Server
2000, a business process orchestration server and tools for developing, executing
and managing distributed business processes. These investments are being made in conjunction
with industry standards groups, technology and service providers, as well as key global
organizations. &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
While the envisioned schema exchange BizTalk.org fell flat since industry-wide message-level-schema
standardization for "everything" more or less didn't happen in the way people initially
expected, what came out of this&amp;nbsp;initiative as a significant element was that
the set of specifications then known as the BizTalk Framework 2.0 that acted as a
foundation for quite a few of the WS-* specifications and the BizTalk Server product
which evolved into a&amp;nbsp;very successful and leading SOA/BPM suite that's soon seeing
its next release,&amp;nbsp;&lt;a href="http://www.microsoft.com/biztalk/default.mspx"&gt;BizTalk
Server 2006 R2&lt;/a&gt;. Fast forward, read Steven Martin's &lt;a href="http://blogs.msdn.com/stevemar/archive/2007/04/24/have-services-got-feedback.aspx"&gt;blog
entry&lt;/a&gt; where he writes:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;[...] We see BizTalk Services as a complement to "traditional" BizTalk Server
uses on premise. As you need to coordinate SOA on a broader scale beyond the organization,
we see the introduction of hosted services as one way to help support federation of
business process, messaging, and identity across boundaries. Over time, we want to
ensure that BizTalk Server customers will be able to easily use the cloud services
in conjunction with their premise technology. [...]&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So all in all,&amp;nbsp;a very sane way to think about BizTalk is that the software and
services we&amp;nbsp;publish under that name are providing&amp;nbsp;functionality for messaging,
process management&amp;nbsp;and&amp;nbsp;connectivity that go beyond the capability of the
core .NET Framework.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=2bde249b-5996-4676-9d60-a0b44c7e33fb" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,2bde249b-5996-4676-9d60-a0b44c7e33fb.aspx</comments>
      <category>Technology/BizTalk</category>
      <category>Technology/CardSpace</category>
      <category>Technology/ISB</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=603e2393-c8de-40dd-b2e9-88f504b44149</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=603e2393-c8de-40dd-b2e9-88f504b44149</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wrote a slightly Twitter-inspired, fun app over the weekend that's using the BizTalk
Services Connectivity service and relay. In the spirit of Software+Services I'm going
to give you half of it [for now] ;-)   You must have the <a href="http://labs.biztalk.net/downloads.aspx">BizTalk
Services SDK</a> installed to run the sample.
</p>
        <p>
The server app, which I'm keeping to myself for the next few days as part of
the experiment, is an extension (add-in) to Windows Live Messenger. The
Messenger add-in monitors all chats with <a href="mailto:tweetiebot@hotmail.com">tweetiebot@hotmail.com</a> and
keeps circular buffer with the last 40 incoming messages. Using the client (which
is in the attached archive), you can get a list of "Tweets" and add a new one (same
as chatting)
</p>
        <p>
[<font color="#2b91af">ServiceContract</font>(Name = <font color="#a31515">"TweetieBot"</font>,
Namespace = <font color="#a31515"><a href="http://samples.vasters.com/2007/05/tweetiebot">http://samples.vasters.com/2007/05/tweetiebot</a></font>)]<br /><font color="#0000ff">public</font><font color="#0000ff">interface</font><font color="#2b91af">ITweetieBot<br /></font>{<br />
  [<font color="#2b91af">OperationContract</font>]<br /><font color="#2b91af">  IList</font>&lt;<font color="#2b91af">Tweet</font>&gt;
GetTweets(<font color="#2b91af">DateTime</font>? since);<br />
  [<font color="#2b91af">OperationContract</font>]<br /><font color="#0000ff">  void</font> Tweet(<font color="#0000ff">string</font> nickname, <font color="#0000ff">string</font> text);<br />
}
</p>
        <p>
or you can subscribe to new tweets and get them as they arrive
</p>
        <p>
[<font color="#2b91af">ServiceContract</font>(Name = <font color="#a31515">"TweetieEvents"</font>,
Namespace = <font color="#a31515"><a href="http://samples.vasters.com/2007/05/tweetiebot">http://samples.vasters.com/2007/05/tweetiebot</a></font>)]<br /><font color="#0000ff">public</font><font color="#0000ff">interface</font><font color="#2b91af">ITweetieEvents<br /></font>{<br />
  [<font color="#2b91af">OperationContract</font>(IsOneWay=<font color="#0000ff">true</font>)]<br /><font color="#0000ff">  void</font> OnTweet(<font color="#2b91af">Tweet</font> tweet);<br />
}
</p>
        <p>
The client application hooks up to the client (that lives right on my desktop machine)
through the BizTalk Services ISB and the server fires events back through the
ISB relay into the client as new tweets arrive. So when you run the attached client
app, you'll find that it starts with a dump of the current log of the bot and then
keeps spitting out events as they arrive. 
</p>
        <p>
The client is actually pretty simple. The <em>EventsClient</em> is the subscriber
for the pub/sub service (ConnectionMode.RelayMulticast) that writes out the received
events to the console. The rest all happens in <em>Main</em> (parsing an validating
the command line argument) and in <em>Run</em>.
</p>
        <p>
          <span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font size="2">   
class</font>
          </span>
          <span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font color="#000000" size="2">
            </font>
            <span style="COLOR: #2b91af">
              <font size="2">Program<br /></font>
            </span>
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">    </span>{<br /><span style="mso-spacerun: yes">        </span></font>
              <span style="COLOR: blue">class</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">EventsClient</span>
              <font color="#000000"> : </font>
            </font>
            <span style="COLOR: #2b91af">
              <font size="2">ITweetieEvents<br /></font>
            </span>
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: blue">public</span>
              <font color="#000000">
              </font>
              <span style="COLOR: blue">void</span>
              <font color="#000000"> OnTweet(</font>
              <span style="COLOR: #2b91af">Tweet</span>
            </font>
            <font size="2">
              <font color="#000000"> tweet)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
              <span style="COLOR: #2b91af">Console</span>
              <font color="#000000">.WriteLine(</font>
              <span style="COLOR: #a31515">"[{0}]
{1}:{2}"</span>
            </font>
            <font size="2">
              <font color="#000000">, tweet.Time, tweet.User,
tweet.Text);<br /><span style="mso-spacerun: yes">            </span>}<br /><span style="mso-spacerun: yes">        </span>}<br /><br /><span style="mso-spacerun: yes">        </span></font>
              <span style="COLOR: blue">static</span>
              <font color="#000000">
              </font>
              <span style="COLOR: blue">void</span>
              <font color="#000000"> Main(</font>
              <span style="COLOR: blue">string</span>
            </font>
            <font size="2">
              <font color="#000000">[]
args)<br /><span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: blue">string</span>
              <font color="#000000"> usageMessage
= </font>
              <span style="COLOR: #a31515">"Usage: IMBotClient &lt;messenger-email-address&gt;"</span>
            </font>
            <font size="2">
              <font color="#000000">;<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: blue">if</span>
            </font>
            <font size="2">
              <font color="#000000"> (args.Length
== 0)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
              <span style="COLOR: #2b91af">Console</span>
            </font>
            <font color="#000000">
              <font size="2">.WriteLine(usageMessage);<br /><span style="mso-spacerun: yes">            </span>}<br /><span style="mso-spacerun: yes">            </span></font>
            </font>
            <span style="COLOR: blue">
              <font size="2">else<br /></font>
            </span>
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
              <span style="COLOR: blue">if</span>
              <font color="#000000"> (!</font>
              <span style="COLOR: #2b91af">Regex</span>
              <font color="#000000">.IsMatch(args[0], </font>
              <span style="COLOR: #a31515">@"^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$"</span>
            </font>
            <font size="2">
              <font color="#000000">))<br /><span style="mso-spacerun: yes">                </span>{<br /><span style="mso-spacerun: yes">                    </span></font>
              <span style="COLOR: #2b91af">Console</span>
            </font>
            <font size="2">
              <font color="#000000">.WriteLine(usageMessage);<br /><span style="mso-spacerun: yes">                    </span></font>
              <span style="COLOR: #2b91af">Console</span>
              <font color="#000000">.WriteLine(</font>
              <span style="COLOR: #a31515">"'{0}'
is not a valid email address"</span>
            </font>
            <font color="#000000">
              <font size="2">);<br /><span style="mso-spacerun: yes">                </span>}<br /><span style="mso-spacerun: yes">                </span></font>
            </font>
            <span style="COLOR: blue">
              <font size="2">else<br /></font>
            </span>
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">                </span>{<br /><span style="mso-spacerun: yes">                    </span>Run(args[0]);<br /><span style="mso-spacerun: yes">                </span>}<br /><span style="mso-spacerun: yes">            </span>}<br /><span style="mso-spacerun: yes">        </span>}<br /><br /><span style="mso-spacerun: yes">        </span></font>
              <span style="COLOR: blue">private</span>
              <font color="#000000">
              </font>
              <span style="COLOR: blue">static</span>
              <font color="#000000">
              </font>
              <span style="COLOR: blue">void</span>
              <font color="#000000"> Run(</font>
              <span style="COLOR: blue">string</span>
            </font>
            <font size="2">
              <font color="#000000"> emailAddress)<br /><span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">EndpointAddress</span>
              <font color="#000000"> serviceAddress
= 
<br />
                </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">EndpointAddress</span>
              <font color="#000000">(</font>
              <span style="COLOR: #2b91af">String</span>
              <font color="#000000">.Format(</font>
              <span style="COLOR: #2b91af">String</span>
              <font color="#000000">.Format(</font>
              <span style="COLOR: #a31515">"sb://{0}/services/tweetiebot/{1}/service"</span>
              <font color="#000000">, <br />
                                    </font>
              <span style="COLOR: #2b91af">RelayBinding</span>
              <font color="#000000">.DefaultRelayHostName, </font>
              <span style="COLOR: #2b91af">Uri</span>
            </font>
            <font size="2">
              <font color="#000000">.EscapeDataString(emailAddress))));<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">EndpointAddress</span>
              <font color="#000000"> eventsAddress
= 
<br />
                </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">EndpointAddress</span>
              <font color="#000000">(</font>
              <span style="COLOR: #2b91af">String</span>
              <font color="#000000">.Format(</font>
              <span style="COLOR: #2b91af">String</span>
              <font color="#000000">.Format(</font>
              <span style="COLOR: #a31515">"sb://{0}/services/tweetiebot/{1}/events"</span>
              <font color="#000000">, 
<br />
                                    </font>
              <span style="COLOR: #2b91af">RelayBinding</span>
              <font color="#000000">.DefaultRelayHostName, </font>
              <span style="COLOR: #2b91af">Uri</span>
            </font>
            <font size="2">
              <font color="#000000">.EscapeDataString(emailAddress))));<br /><br /><span style="mso-spacerun: yes"><font face="Verdana" color="#003300">The URI scheme
for services that hook into the ISB is "sb:" and the default address of the relay
is encoded in the SDK assemblies. We set up two endpoints here. One for the client
channel to fetch the initial list and one for the event subscriber. </font></span></font>
            </font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">            </span>
              </font>
              <span style="COLOR: #2b91af">RelayBinding</span>
              <font color="#000000"> relayBinding
= </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">RelayBinding</span>
            </font>
            <font size="2">
              <font color="#000000">();<br /><span style="mso-spacerun: yes">     </span></font>
            </font>
            <font size="2">
              <font color="#000000">
                <br />
                <span style="mso-spacerun: yes">      </span>
                <span style="mso-spacerun: yes">      </span>
              </font>
              <span style="COLOR: #2b91af">ServiceHost</span>
              <font color="#000000"> eventsHost
= </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">ServiceHost</span>
              <font color="#000000">(</font>
              <span style="COLOR: blue">typeof</span>
              <font color="#000000">(</font>
              <span style="COLOR: #2b91af">EventsClient</span>
            </font>
            <font size="2">
              <font color="#000000">));<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">RelayBinding</span>
              <font color="#000000"> eventBinding
= </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">RelayBinding</span>
              <font color="#000000">(</font>
              <span style="COLOR: #2b91af">RelayConnectionMode</span>
            </font>
            <font size="2">
              <font color="#000000">.RelayedMulticast);<br /><span style="mso-spacerun: yes">            </span>eventsHost.AddServiceEndpoint(</font>
              <span style="COLOR: blue">typeof</span>
              <font color="#000000">(</font>
              <span style="COLOR: #2b91af">ITweetieEvents</span>
            </font>
            <font size="2">
              <font color="#000000">),
eventBinding, eventsAddress.ToString());<br /><span style="mso-spacerun: yes">            </span>eventsHost.Open();<br /><br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">ChannelFactory</span>
              <font color="#000000">&lt;</font>
              <span style="COLOR: #2b91af">TweetieBotChannel</span>
              <font color="#000000">&gt;
channelFactory = </font>
              <span style="COLOR: blue">new</span>
              <font color="#000000">
              </font>
              <span style="COLOR: #2b91af">ChannelFactory</span>
              <font color="#000000">&lt;</font>
              <span style="COLOR: #2b91af">TweetieBotChannel</span>
            </font>
            <font size="2">
              <font color="#000000">&gt;(relayBinding,
serviceAddress);<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">TweetieBotChannel</span>
            </font>
            <font size="2">
              <font color="#000000"> channel
= channelFactory.CreateChannel();<br /><span style="mso-spacerun: yes">            </span>channel.Open();<br /><br /><span style="mso-spacerun: yes"><span style="mso-spacerun: yes"><font face="Verdana" color="#003300">The
two *.Open() calls will each prompt for a CardSpace authentication, so you will have
to be <a href="https://identity.biztalk.net/MemberRegister.aspx">registered</a> to
run the sample. Once you have opened the channels (and my service is
running), you'll be able to pull the list of current tweets. Meanwhile, whenever
a new event pops up, the <em>EventsClient</em> above will write out a new line.</font></span></span></font>
            </font>
          </span>
        </p>
        <p>
          <span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font size="2">
              <font color="#000000">
                <span style="mso-spacerun: yes">            </span>
              </font>
              <span style="COLOR: #2b91af">IList</span>
              <font color="#000000">&lt;</font>
              <span style="COLOR: #2b91af">Tweet</span>
            </font>
            <font size="2">
              <font color="#000000">&gt;
tweets = channel.GetTweets(lastTime);<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: blue">foreach</span>
              <font color="#000000"> (</font>
              <span style="COLOR: #2b91af">Tweet</span>
              <font color="#000000"> tweet </font>
              <span style="COLOR: blue">in</span>
            </font>
            <font size="2">
              <font color="#000000"> tweets)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
              <span style="COLOR: #2b91af">Console</span>
              <font color="#000000">.WriteLine(</font>
              <span style="COLOR: #a31515">"[{0}]
{1}:{2}"</span>
            </font>
            <font size="2">
              <font color="#000000">, tweet.Time, tweet.User,
tweet.Text);<br /><span style="mso-spacerun: yes">            </span>}<br /><br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">Console</span>
              <font color="#000000">.WriteLine(</font>
              <span style="COLOR: #a31515">"Press
ENTER to quit at any time"</span>
            </font>
            <font size="2">
              <font color="#000000">);<br /><span style="mso-spacerun: yes">            </span></font>
              <span style="COLOR: #2b91af">Console</span>
            </font>
            <font color="#000000" size="2">.ReadLine();<br /><br /><span style="mso-spacerun: yes">            </span>eventsHost.Close();<br /><span style="mso-spacerun: yes">            </span>channel.Close();<br /><span style="mso-spacerun: yes">            </span>channelFactory.Close();<br /><span style="mso-spacerun: yes">      </span><span style="mso-spacerun: yes">  </span>}<span style="mso-spacerun: yes">        </span></font>
          </span>
        </p>
        <span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
          <font color="#000000" size="2">
            <span style="mso-spacerun: yes">
            </span>
            <p>
              <br />
              <span style="mso-spacerun: yes">
                <span style="mso-spacerun: yes">
                  <span style="mso-spacerun: yes">
                    <font face="Verdana" color="#003300">So
when you run the app, you can chat (anyone can, you don't need to be a buddy) <a href="mailto:tweetiebot@hotmail.com">tweetiebot@hotmail.com</a> through
Live Messenger and you'll see your chat lines (and potentially others') popping out
as events from the service bus. </font>
                  </span>
                </span>
              </span>
            </p>
            <p>
              <span style="mso-spacerun: yes">
                <span style="mso-spacerun: yes">
                  <span style="mso-spacerun: yes">
                    <font face="Verdana" color="#003300">To
run the sample with my bot, you need to call the client with "IMBotClient tweetiebot@hotmail.com"
and select your BizTalk Services Information Card twice as you are prompted.</font>
                  </span>
                </span>
              </span>
            </p>
            <p>
              <span style="mso-spacerun: yes">
                <span style="mso-spacerun: yes">
                  <span style="mso-spacerun: yes">
                    <font face="Verdana" color="#003300">
                      <strong>Privacy
notice</strong>: I'm anonymizing the name of the contact only insofar as I'm clipping
anything including and following the "at" sign of the user that chats the
bot. So whatever you say is published as "<em>emailname</em>: text line"</font>
                  </span>
                </span>
              </span>
            </p>
          </font>
        </span>
        <a href="http://friends.newtelligence.net/clemensv/content/binary/IMBotClient.zip">IMBotClient.zip
(3.61 KB)</a>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=603e2393-c8de-40dd-b2e9-88f504b44149" />
      </body>
      <title>Some fun with the BizTalk Services ISB</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/07/Some+Fun+With+The+BizTalk+Services+ISB.aspx</link>
      <pubDate>Mon, 07 May 2007 21:00:21 GMT</pubDate>
      <description>&lt;p&gt;
I wrote a slightly Twitter-inspired, fun app over the weekend that's using the BizTalk
Services Connectivity service and relay. In the spirit of Software+Services I'm going
to give you half of it [for now] ;-)&amp;nbsp;&amp;nbsp; You must have the &lt;a href="http://labs.biztalk.net/downloads.aspx"&gt;BizTalk
Services SDK&lt;/a&gt; installed to run the sample.
&lt;/p&gt;
&lt;p&gt;
The server app, which I'm keeping&amp;nbsp;to myself for the next few days as part of
the experiment,&amp;nbsp;is an extension (add-in) to Windows Live Messenger.&amp;nbsp;The
Messenger add-in monitors all chats&amp;nbsp;with&amp;nbsp;&lt;a href="mailto:tweetiebot@hotmail.com"&gt;tweetiebot@hotmail.com&lt;/a&gt;&amp;nbsp;and
keeps circular buffer with the last 40 incoming messages. Using the client (which
is in the attached archive), you can get a list of "Tweets" and add a new one (same
as chatting)
&lt;/p&gt;
&lt;p&gt;
[&lt;font color=#2b91af&gt;ServiceContract&lt;/font&gt;(Name = &lt;font color=#a31515&gt;"TweetieBot"&lt;/font&gt;,
Namespace = &lt;font color=#a31515&gt;&lt;a href="http://samples.vasters.com/2007/05/tweetiebot"&gt;http://samples.vasters.com/2007/05/tweetiebot&lt;/a&gt;&lt;/font&gt;)]&lt;br&gt;
&lt;font color=#0000ff&gt;public&lt;/font&gt; &lt;font color=#0000ff&gt;interface&lt;/font&gt; &lt;font color=#2b91af&gt;ITweetieBot&lt;br&gt;
&lt;/font&gt;{&lt;br&gt;
&amp;nbsp; [&lt;font color=#2b91af&gt;OperationContract&lt;/font&gt;]&lt;br&gt;
&lt;font color=#2b91af&gt;&amp;nbsp; IList&lt;/font&gt;&amp;lt;&lt;font color=#2b91af&gt;Tweet&lt;/font&gt;&amp;gt; GetTweets(&lt;font color=#2b91af&gt;DateTime&lt;/font&gt;?
since);&lt;br&gt;
&amp;nbsp; [&lt;font color=#2b91af&gt;OperationContract&lt;/font&gt;]&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp; void&lt;/font&gt; Tweet(&lt;font color=#0000ff&gt;string&lt;/font&gt; nickname, &lt;font color=#0000ff&gt;string&lt;/font&gt; text);&lt;br&gt;
}
&lt;/p&gt;
&lt;p&gt;
or you can subscribe to new tweets and get them as they arrive
&lt;/p&gt;
&lt;p&gt;
[&lt;font color=#2b91af&gt;ServiceContract&lt;/font&gt;(Name = &lt;font color=#a31515&gt;"TweetieEvents"&lt;/font&gt;,
Namespace = &lt;font color=#a31515&gt;&lt;a href="http://samples.vasters.com/2007/05/tweetiebot"&gt;http://samples.vasters.com/2007/05/tweetiebot&lt;/a&gt;&lt;/font&gt;)]&lt;br&gt;
&lt;font color=#0000ff&gt;public&lt;/font&gt; &lt;font color=#0000ff&gt;interface&lt;/font&gt; &lt;font color=#2b91af&gt;ITweetieEvents&lt;br&gt;
&lt;/font&gt;{&lt;br&gt;
&amp;nbsp; [&lt;font color=#2b91af&gt;OperationContract&lt;/font&gt;(IsOneWay=&lt;font color=#0000ff&gt;true&lt;/font&gt;)]&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp; void&lt;/font&gt; OnTweet(&lt;font color=#2b91af&gt;Tweet&lt;/font&gt; tweet);&lt;br&gt;
}
&lt;/p&gt;
&lt;p&gt;
The client application hooks up to the client (that lives right on my desktop machine)
through the BizTalk Services ISB and the&amp;nbsp;server fires events back through the
ISB relay into the client as new tweets arrive. So when you run the attached client
app, you'll find that it starts with a dump of the current log of the bot and then
keeps spitting out events as they arrive. 
&lt;/p&gt;
&lt;p&gt;
The client is actually pretty simple. The &lt;em&gt;EventsClient&lt;/em&gt; is the subscriber
for the pub/sub service (ConnectionMode.RelayMulticast) that writes out the received
events to the console.&amp;nbsp;The rest all happens in &lt;em&gt;Main&lt;/em&gt; (parsing an validating
the command line argument) and in &lt;em&gt;Run&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
class&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font color=#000000 size=2&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;&lt;font size=2&gt;Program&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EventsClient&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;&lt;font size=2&gt;ITweetieEvents&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; OnTweet(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Tweet&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; tweet)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"[{0}]
{1}:{2}"&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;, tweet.Time, tweet.User, tweet.Text);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;static&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; Main(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;[]
args)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; usageMessage
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Usage: IMBotClient &amp;lt;messenger-email-address&amp;gt;"&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; (args.Length
== 0)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;/font&gt;&lt;font color=#000000&gt;&lt;font size=2&gt;.WriteLine(usageMessage);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;&lt;font size=2&gt;else&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (!&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Regex&lt;/span&gt;&lt;font color=#000000&gt;.IsMatch(args[0], &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;@"^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$"&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;))&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;.WriteLine(usageMessage);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"'{0}'
is not a valid email address"&lt;/span&gt;&lt;/font&gt;&lt;font color=#000000&gt;&lt;font size=2&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;&lt;font size=2&gt;else&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Run(args[0]);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;static&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; Run(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; emailAddress)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EndpointAddress&lt;/span&gt;&lt;font color=#000000&gt; serviceAddress
= 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EndpointAddress&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;String&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;String&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"sb://{0}/services/tweetiebot/{1}/service"&lt;/span&gt;&lt;font color=#000000&gt;,&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;font color=#000000&gt;.DefaultRelayHostName, &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Uri&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;.EscapeDataString(emailAddress))));&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EndpointAddress&lt;/span&gt;&lt;font color=#000000&gt; eventsAddress
= 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EndpointAddress&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;String&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;String&lt;/span&gt;&lt;font color=#000000&gt;.Format(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"sb://{0}/services/tweetiebot/{1}/events"&lt;/span&gt;&lt;font color=#000000&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;font color=#000000&gt;.DefaultRelayHostName, &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Uri&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;.EscapeDataString(emailAddress))));&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font face=Verdana color=#003300&gt;The URI scheme for
services that hook into the ISB is "sb:" and the default address of the relay is encoded
in the SDK assemblies. We set up two endpoints here. One for the client channel to
fetch the initial list and one for the event subscriber.&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;font color=#000000&gt; relayBinding
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt; eventsHost
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EventsClient&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;));&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;font color=#000000&gt; eventBinding
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayBinding&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;RelayConnectionMode&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;.RelayedMulticast);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;eventsHost.AddServiceEndpoint(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ITweetieEvents&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;),
eventBinding, eventsAddress.ToString());&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;eventsHost.Open();&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ChannelFactory&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;TweetieBotChannel&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;
channelFactory = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ChannelFactory&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;TweetieBotChannel&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&amp;gt;(relayBinding,
serviceAddress);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;TweetieBotChannel&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; channel
= channelFactory.CreateChannel();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;channel.Open();&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font face=Verdana color=#003300&gt;The
two *.Open() calls will each prompt for a CardSpace authentication, so you will have
to be &lt;a href="https://identity.biztalk.net/MemberRegister.aspx"&gt;registered&lt;/a&gt; to
run the sample.&amp;nbsp;Once&amp;nbsp;you have&amp;nbsp;opened the channels (and my service is
running), you'll be able to pull the list of current tweets.&amp;nbsp;Meanwhile, whenever
a new event pops up, the &lt;em&gt;EventsClient&lt;/em&gt; above will write out a new line.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IList&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Tweet&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&amp;gt;
tweets = channel.GetTweets(lastTime);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt;&lt;font color=#000000&gt; (&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Tweet&lt;/span&gt;&lt;font color=#000000&gt; tweet &lt;/font&gt;&lt;span style="COLOR: blue"&gt;in&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; tweets)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"[{0}]
{1}:{2}"&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;, tweet.Time, tweet.User, tweet.Text);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Press
ENTER to quit at any time"&lt;/span&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;/font&gt;&lt;font color=#000000 size=2&gt;.ReadLine();&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;eventsHost.Close();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;channel.Close();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;channelFactory.Close();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier New; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font color=#000000 size=2&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font face=Verdana color=#003300&gt;So
when you run the app, you can chat (anyone can, you don't need to be a buddy) &lt;a href="mailto:tweetiebot@hotmail.com"&gt;tweetiebot@hotmail.com&lt;/a&gt; through
Live Messenger and you'll see your chat lines (and potentially others') popping out
as events from the service bus. &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font face=Verdana color=#003300&gt;To
run the sample with my bot, you need to call the client with "IMBotClient tweetiebot@hotmail.com"
and select your BizTalk Services Information Card twice as you are prompted.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font face=Verdana color=#003300&gt;&lt;strong&gt;Privacy
notice&lt;/strong&gt;: I'm anonymizing the name of the contact only insofar as I'm clipping
anything&amp;nbsp;including and following&amp;nbsp;the "at" sign of the user that chats the
bot. So whatever you say is published as "&lt;em&gt;emailname&lt;/em&gt;: text line"&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/font&gt;&lt;/span&gt;&gt;
&lt;a href="http://friends.newtelligence.net/clemensv/content/binary/IMBotClient.zip"&gt;IMBotClient.zip
(3.61 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=603e2393-c8de-40dd-b2e9-88f504b44149" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx</comments>
      <category>Technology</category>
      <category>Technology/BizTalk</category>
      <category>Technology/CardSpace</category>
      <category>Technology/ISB</category>
    </item>
  </channel>
</rss>