<?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|BizTalk</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Cloud Development and Alien Abductions</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Wed, 16 May 2007 19:33:48 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=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>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blogs.thinktecture.com/cweyer/archive/2007/04/27/414819.aspx">Christian
Weyer shows</a> off the few lines of pretty straightforward WCF code &amp; config he
needed to figure out in order to set up a duplex conversation through BizTalk
Services. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae" />
      </body>
      <title>BizTalk Services: Christian shuttling back and forth on the bus</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae.aspx</guid>
      <link>http://vasters.com/clemensv/2007/04/27/BizTalk+Services+Christian+Shuttling+Back+And+Forth+On+The+Bus.aspx</link>
      <pubDate>Fri, 27 Apr 2007 23:53:15 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blogs.thinktecture.com/cweyer/archive/2007/04/27/414819.aspx"&gt;Christian
Weyer shows&lt;/a&gt; off the few lines of pretty straightforward WCF code &amp;amp; config&amp;nbsp;he
needed to figure out in order to&amp;nbsp;set up a duplex conversation through BizTalk
Services. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,b2d16e20-c2d6-4a8c-b59a-640cd7dbc0ae.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/BizTalk</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
      <category>Technology/XML</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=d53f0e81-eebb-4327-a92f-2f2ab5fcc602</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,d53f0e81-eebb-4327-a92f-2f2ab5fcc602.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,d53f0e81-eebb-4327-a92f-2f2ab5fcc602.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=d53f0e81-eebb-4327-a92f-2f2ab5fcc602</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Steve has a <a href="http://www.stephenforte.net/owdasblog/PermaLink.aspx?guid=a8de9324-c373-4cab-8e10-4e23251a3fb4">great
analysis </a>of what BizTalk Services means for Corzen and how he views it in the
broader industry context. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=d53f0e81-eebb-4327-a92f-2f2ab5fcc602" />
      </body>
      <title>Stephen Forte on what BizTalk Services means for his shop</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,d53f0e81-eebb-4327-a92f-2f2ab5fcc602.aspx</guid>
      <link>http://vasters.com/clemensv/2007/04/26/Stephen+Forte+On+What+BizTalk+Services+Means+For+His+Shop.aspx</link>
      <pubDate>Thu, 26 Apr 2007 22:09:51 GMT</pubDate>
      <description>&lt;p&gt;
Steve has a &lt;a href="http://www.stephenforte.net/owdasblog/PermaLink.aspx?guid=a8de9324-c373-4cab-8e10-4e23251a3fb4"&gt;great
analysis &lt;/a&gt;of what BizTalk Services means for Corzen and how he views it in the
broader industry context. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=d53f0e81-eebb-4327-a92f-2f2ab5fcc602" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,d53f0e81-eebb-4327-a92f-2f2ab5fcc602.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>IT Strategy</category>
      <category>Technology</category>
      <category>Technology/BizTalk</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=842e5373-60c1-4390-b820-00dba8b0cb4c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=842e5373-60c1-4390-b820-00dba8b0cb4c</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Internet Service Bus</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx</guid>
      <link>http://vasters.com/clemensv/2007/04/25/Internet+Service+Bus.aspx</link>
      <pubDate>Wed, 25 Apr 2007 03:28:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;span&gt;"ESB" (for "Enterprise Service Bus") is an acronym floating around in the SOA/BPM
space for quite a while now. The notion is that you have a set of shared services
in an enterprise that act as a shared foundation for discovering, connecting and federating
services. That's a good thing and there's not much of a debate about the usefulness,
except whether &lt;a href="http://www.microsoft.com/biztalk/solutions/soa/esb.mspx"&gt;&lt;font color=#0000ff&gt;ESB&lt;/font&gt;&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; is
the actual term is being used to describe this service fabric or whether there's a
concrete product with that name. Microsoft has, for instance,&amp;nbsp;directory services,
the UDDI registry, and our P2P resolution services&amp;nbsp;that contribute to the discovery
portion,&amp;nbsp;we've got BizTalk&amp;nbsp;Server as&amp;nbsp;a scalable business process, integration
and federation hub, we've got the Windows Communication Foundation for building service
oriented applications and endpoints, we've got the Windows Workflow Foundation for
building workflow-driven endpoint applications, and we have the Identity Platform
with ILM/MIIS, ADFS, and CardSpace that provides the federated identity backplane. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Today, the division I work in (Connected Systems Division) has announced &lt;a href="http://labs.biztalk.net/"&gt;&lt;font color=#0000ff&gt;BizTalk
Services&lt;/font&gt;&lt;/a&gt;, which&amp;nbsp;John Shewchuk explains &lt;a href="http://connectedsystems.spaces.live.com/"&gt;&lt;font color=#0000ff&gt;here&lt;/font&gt;&lt;/a&gt;&amp;nbsp;and
Dennis Pilarinos drills into &lt;a href="http://www.dennispi.com/"&gt;&lt;font color=#0000ff&gt;here&lt;/font&gt;&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Two aspects that&amp;nbsp;make&amp;nbsp;the idea of a&amp;nbsp;"service bus" generally very
attractive&amp;nbsp;are that&amp;nbsp;the service bus&amp;nbsp;enables identity federation and
connectivity federation.&amp;nbsp;This idea gets far more interesting and more broadly
applicable when we&amp;nbsp;remove the "Enterprise" constraint from ESB it and put "Internet"
into its place, thus&amp;nbsp;elevating it to an "Internet Services Bus", or ISB.&amp;nbsp;If
we look at&amp;nbsp;the&amp;nbsp;most&amp;nbsp;popular&amp;nbsp;Internet-dependent applications outside
of the browser these days, like the many Instant Messaging apps, BitTorrent, Limewire,
VoIP, Orb/Slingbox, Skype, Halo,&amp;nbsp;Project Gotham Racing, and others,&amp;nbsp;many
of them&amp;nbsp;depend on one or two key services must be provided for each of them:
Identity Federation (or, in absence of that,&amp;nbsp;a central identity&amp;nbsp;service)
and some sort of message relay in order to connect up two or more application instances&amp;nbsp;that
each sit&amp;nbsp;behind firewalls - and at the very least&amp;nbsp;some stable, shared rendezvous
point or directory to seed P2P connections.&amp;nbsp;The question "how does&amp;nbsp;Messenger
work?" has, from an high-level architecture perspective a simple answer: The Messenger
"switchboard" acts as a message relay. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;The problem gets really juicy when we look at the reality of what connecting
such applications means and what an ISV (or you!) were to come up with the next cool
thing on the Internet:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;You'll soon find out that you will have to run a whole lot of server infrastructure
and the routing of all of that traffic goes through your pipes. If your cool thing
involves moving lots of large files around (let's say you'd want to build a photo
sharing app like the very unfortunately deceased &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Max"&gt;&lt;font color=#0000ff&gt;Microsoft
Max&lt;/font&gt;&lt;/a&gt;) you'd&amp;nbsp;suddenly find&amp;nbsp;yourself running some significant sets
of&amp;nbsp;pipes (tubes?)&amp;nbsp;into your basement even though your users&amp;nbsp;are just
passing data from one place to the next.&amp;nbsp;That's a killer for lots of good ideas
as this represents a significant entry barrier. Interesting stuff can get popular
very, very fast these days and sometimes faster than you can say "Venture Capital".&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Messenger runs such infrastructure. And the need for such infrastructure was
indeed an (not entirely unexpected) important&amp;nbsp;takeaway from the cited Max project.
What looked just to be a very polished and cool client app to showcase all the Vista
and NETFX 3.0 goodness was just the tip of a significant iceberg of (just as cool)
server functionality that was running in a Microsoft data center to make the sharing
experience as seamless and easy as it was.&amp;nbsp;Once you want to&amp;nbsp;do cool stuff
that goes beyond the request/response browser thing, you easily end up running a data
center. And people will quickly think that your&amp;nbsp;application sucks if that data
center doesn't "just work". And that translates into several "nines" in terms of availability
in my book. And that'll cost you.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;As cool as Flickr and YouTube are, I don't think of none of them or their brethren
to be nearly as disruptive in terms of architectural paradigm shift&amp;nbsp;and long-term
technology impact as Napster, ICQ and Skype were as they appeared on the scene. YouTube
is just a place with interesting content. ICQ changed the world of collaboration.
Napster's and Skype's impact changed and is changing entire industries. The Internet
is far more and has more potential than just having some shared, mashed-up&amp;nbsp;places
where lots of people go to consume, search&amp;nbsp;and upload stuff. "Personal computing"
where I'm in control of MY stuff and share between MY places from wherever I happen
to be and NOT giving that data to someone else so that they can decorate my stuff
with ads has a future. The pendulum will swing back. I want to be able to take a family
picture with my digital camera and snap that into a digital picture frame at my dad's
house at the push of a button without some&amp;nbsp;"place" being in the middle of that.
The picture frame just has to be able to stick its head out to a place where my camera
can&amp;nbsp;talk to it so that it can accept that picture and know that it's me who is
sending it.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Another personal, and very concrete and real&amp;nbsp;point in case: I am running,
and I've written about that before,&amp;nbsp;a custom-built (software/hardware) combo
of two machines (one in Germany, one here in the US) that provide me and my family
with full Windows Media Center embedded access to live and recorded TV along with
electronic program guide data for 45+ German TV channels, Sports Pay-TV included.
The work of getting the connectivity right (dynamic DNS, port mappings, firewall holes),
dealing with the bandwidth constraints&amp;nbsp;and shielding&amp;nbsp;this against unwanted
access&amp;nbsp;were ridiculously complicated. This solution&amp;nbsp;and IP telephony and
video conferencing (over Messenger, Skype) are&amp;nbsp;shrinking the distance to home
to what's effectively just the inconvenience of the time difference of 9 hours and
that we don't see family and friends in person all that often. Otherwise we're completely
"plugged in" on what's going on at home and in Germany in general. That's an immediate
and huge improvement of the quality of living for us, is enabled by the Internet,
and has very little to do with "the Web", let alone "Web 2.0" - except that my Program
Guide app for Media Center happens to be an AJAX app today.&amp;nbsp;Using BizTalk Services
would throw out a whole lot of complexity that I had to deal with myself, especially
on the access control/identity and connectivity and discoverability fronts. Of course,
as I've done it the hard way and it's working to a degree that my wife is very happy
with it as it stands (which is the customer satisfaction metric that matters here),
I'm not making changes for technology's sake until I'm attacking the next revision
of this or I'll wait for one of the alternative and improving solutions (Orb is on
a good path) to catch up with what I have. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;But I digress. Just as much as the services that&amp;nbsp;were just&amp;nbsp;announced
(and the ones that are lined up to follow) are a potential&amp;nbsp;enabler for new Napster/ICQ/Skype
type consumer space applications from innovative companies who don't have the capacity
or expertise to run their own data center, they are also and just as importantly the
"&lt;em&gt;&lt;b&gt;&lt;span style="FONT-FAMILY: 'Verdana','sans-serif'"&gt;Small and Medium Enterprise&lt;/span&gt;&lt;/b&gt;&lt;/em&gt; Service
Bus". 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;If you are an ISV catering shrink-wrapped business solutions to SMEs whose network
infrastructure&amp;nbsp;may be as simple as&amp;nbsp;a DSL line (with dynamic IP) that goes
into a (wireless) hub and is as locked down as it possibly can be by the local networking
company that services them, we can do as much as we want as an industry in trying
to make inter-company B2B work and expand it to SMEs;&amp;nbsp;your customers just aren't
playing in that game if they can't&amp;nbsp;get over these basic connectivity hurdles. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Your app, that lives behind the firewall shield and NAT and a dynamic IP,&amp;nbsp;doesn't
have a stable, public place where it can publish its endpoints and you have no way
to federate identity (and access control)&amp;nbsp;unless you are doing some pretty invasive
surgery on their network setup&amp;nbsp;or you&amp;nbsp;end up building and running run a
bunch of infrastructure on-site or for them. And that's the same problem as the mentioned
consumer apps have.&amp;nbsp;Even more so, if you look at the list of "coming soon" services,
you'll find that problems like relaying events or coordinating work with workflows
are very suitable for&amp;nbsp;many common use-cases in SME business applications once
you imagine expanding their scope to inter-company collaboration.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;So where's "Megacorp Enterprises" in that play? First of all, Megacorp isn't
an island. Every Megacorp depends on lots of SME suppliers and retailers (or their
equivalents in the respective lingo of the verticals). Plugging all of them directly
into&amp;nbsp;Megacorp's "ESB" often isn't feasible for lots of reasons and increasingly
less so if the SME had a second or third (imagine that!) customer and/or supplier.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Second, Megacorp isn't a uniform big&amp;nbsp;entity.&amp;nbsp;The count of "enterprise
applications" running inside of Megacorp is measured in thousands rather than dozens.
We're often inclined to think of SAP or Siebel when we think of enterprise applications,&amp;nbsp;but
the vast majority are much simpler and more scoped than that. It's not entirely ridiculous
to think that&amp;nbsp;some of those applications runs (gasp!) under someone's desk or
in a cabinet in an extra room of a department.&amp;nbsp;And it's also not entirely ridiculous
to think that these applications are so vertical and special that their integration
into the "ESB" gets continuously overridden by someone else's higher priorities and
yet, the respective business department needs a very practical way to connect with
partners &lt;em&gt;&lt;span style="FONT-FAMILY: 'Verdana','sans-serif'"&gt;now&lt;/span&gt;&lt;/em&gt; and
be "connectable" even though it sits deeply inside the network thicket of Megacorp.
While it is likely on every CIO's&amp;nbsp;goal sheet to contain that sort of IT anarchy,
it's a reality that needs answers in order to keep the business bring in the money.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Third, Megacorp needs to work with Gigacorp. To make it interesting, let's assume
that Megacorp and Gigacorp don't like each other much and trust each other even less.
They even compete. Yet, they've got to work on a standard and hence they need to collaborate.
It turns out that this scenario is almost entirely the same as the "Panic! Our departments
take IT in their own hands!" scenario described above. At most, Megacorp wants to
give Gigacorp a rendezvous and identity federation point on neutral ground. So instead
of letting Gigacorp on their ESB, they both hook their apps and their identity infrastructures
into the ISB and let the ISB be the mediator in that play.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Bottom line: There are very many solution scenarios, of which I mentioned just
a few,&amp;nbsp;where "I" is&amp;nbsp;a much&amp;nbsp;more suitable&amp;nbsp;scope than "E". Sometimes&amp;nbsp;the
appropriate scope is just "I", sometimes the appropriate scope is just "E". They key
to achieve the agility that SOA strategies commonly promise is the ability to do the
"E to I" scale-up whenever you need it in order to enable broader communication. If
you need to elevate one or a set services from your ESB to Internet scope, you have
the option to go and do so as appropriate and integrated with your identity infrastructure.&amp;nbsp;And
since this all strictly WS-* standards based, your "E" might actually be "whatever
you happen to run today".&amp;nbsp;BizTalk Services is&amp;nbsp;the "I".&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;Or, in other words,&amp;nbsp;&lt;a href="http://labs.biztalk.net/"&gt;&lt;font color=#0000ff&gt;this
is a pretty big deal.&lt;/font&gt;&lt;/a&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=842e5373-60c1-4390-b820-00dba8b0cb4c" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>IT Strategy</category>
      <category>Microsoft</category>
      <category>MSDN</category>
      <category>Technology/BizTalk</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=57bb0866-c45b-4505-a705-ea83a29cec80</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,57bb0866-c45b-4505-a705-ea83a29cec80.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,57bb0866-c45b-4505-a705-ea83a29cec80.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=57bb0866-c45b-4505-a705-ea83a29cec80</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>WCF / BizTalk Devs: If you happen to be in the Redmond neighborhood at or around Oct 30-Nov 3....</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,57bb0866-c45b-4505-a705-ea83a29cec80.aspx</guid>
      <link>http://vasters.com/clemensv/2006/09/27/WCF+BizTalk+Devs+If+You+Happen+To+Be+In+The+Redmond+Neighborhood+At+Or+Around+Oct+30Nov+3.aspx</link>
      <pubDate>Wed, 27 Sep 2006 22:42:02 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;font color=#000000&gt;The
request below has been handed to me by the BizTalk team here at Microsoft. If you
have programmed in WCF, happen to be at or around the Microsoft Redmond campus at
that time and want to help out, send an email &lt;em&gt;until this&amp;nbsp;Friday&lt;/em&gt; to &lt;/font&gt;&lt;font color=#0000ff&gt;uccoord
at microsoft.com&amp;nbsp;&lt;/font&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;with
the subject line "BizTalk Usability Study" to sign up:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font color=#000000&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Microsoft
is conducting research on BizTalk Server, and are&amp;nbsp;seeking Developers&amp;nbsp;who
have a working knowledge of this product and WCF.&amp;nbsp; If you are a current BizTalk
Developer, with WCF experience, the team would like to invite you to participate in
this research.&amp;nbsp; &lt;/span&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font color=#000000&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Studies
are currently being scheduled for Monday&amp;nbsp;Oct 30 through Friday&amp;nbsp;Nov 3,&amp;nbsp;2006
in Redmond, WA.&amp;nbsp; Each study will be&amp;nbsp;scheduled at your convenience and will
run approximately 2 hours.&amp;nbsp; This is a unique opportunity to&amp;nbsp;provide feedback
on the adapter creation process in BizTalk.&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font color=#000000&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Your
input and participation is extremely valuable&amp;nbsp;that helps ensure&amp;nbsp;that your
needs are met when interacting with BizTalk and WCF.&amp;nbsp;If scheduled for a usability
study, you will receive a&amp;nbsp;retail&amp;nbsp;software&amp;nbsp;product selection&amp;nbsp;for
your time and feedback.&amp;nbsp; Some of the items include Office Pro and VisualStudio.NET&lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=57bb0866-c45b-4505-a705-ea83a29cec80" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,57bb0866-c45b-4505-a705-ea83a29cec80.aspx</comments>
      <category>Technology/BizTalk</category>
      <category>Technology/WCF</category>
    </item>
  </channel>
</rss>