<?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|WCF</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Cloud Development and Alien Abductions</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Sun, 12 Sep 2010 07:29:23 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=3d2486d4-2bfa-446c-886b-bf336f92c861</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3d2486d4-2bfa-446c-886b-bf336f92c861.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3d2486d4-2bfa-446c-886b-bf336f92c861.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3d2486d4-2bfa-446c-886b-bf336f92c861</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <blockquote>
          <p>
            <em>This post explains an essential class for asynchronous programming that lurks
in the depths of the WCF samples: InputQueue&lt;T&gt;. If you need to write efficient
server-side apps, you should consider reading through this and add InputQueue&lt;T&gt;
to your arsenal.  </em>
          </p>
        </blockquote>
        <p>
Let me start with: This blog post is 4 years late. Sorry! – and with that out of the
way:
</p>
        <p>
The <a href="http://msdn.microsoft.com/wcf">WCF</a> samples ship with several copies
of a class that’s marked as internal in the <em>System.ServiceModel.dll</em> assembly: <em>InputQueue&lt;T&gt;</em>.
Why are these samples – mostly those implementing channel-model extensions – bringing
local copies of this class with them? It’s an essential tool for implementing the
asynchronous call paths of many aspects of channels correctly and efficiently. 
</p>
        <p>
If you look closely enough, the WCF channel infrastructure resembles the Berkeley
Socket model quite a bit – especially on the server side. There’s a channel listener
that’s constructed on the server side and when that is <a href="http://msdn.microsoft.com/en-us/library/ms195524.aspx">opened</a> (usually
under the covers of the WCF ServiceHost) that operation is largely equivalent to calling
‘listen’ on a socket – the network endpoint is ready for business.  On sockets
you’ll then call ‘accept’ to accept the next available socket connection from a client,
in WCF you call ‘<a href="http://msdn.microsoft.com/en-us/library/ms195572.aspx">AcceptChannel</a>’
to accept the next available (session-) channel. On sockets you then call ‘receive’
to obtain bytes, on a channel you call ’<a href="http://msdn.microsoft.com/en-us/library/ms195339.aspx">Receive</a>’
to  obtain a message. 
</p>
        <p>
Before and between calls to '’AcceptChannel’ made by the server-side logic, 
client-initiated connections – and thus channels – may be coming in and queue up for
a bit before they handed out to the next caller of ‘AcceptChannel’, or the asynchronous
equivalent ‘Begin/EndAcceptChannel’ method pair. The number of channels that may be
pending is configured in WCF with the ‘<a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.listenbacklog.aspx">ListenBacklog</a>’
property that’s available on most bindings. 
</p>
        <p>
I wrote ‘queue up’ there since that’s precisely what happens – those newly created
channels on top of freshly accepted sockets or HTTP request channels are enqueued
into an <em>InputQueue&lt;T&gt;</em> instance and (Begin-)Accept is implemented as
a dequeue operation on that queue. There are two particular challenges here that make
the regular <em><a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx">Queue&lt;T&gt;</a></em> class
from the <em>System.Collections.Generic</em> namespace unsuitable for use in the implementation
of that mechanism: Firstly, the <a href="http://msdn.microsoft.com/en-us/library/1c8bzx97.aspx"><em>Dequeue</em></a> method
there is only available as a synchronous variant and also doesn’t allow for specifying
a timeout. Secondly, the queue implementation doesn’t really help much with implementing
the <em>ListenBacklog</em> quota where not only the length of the queue is limited
to some configured number of entries, but accepting further connections/channels from
the underlying network is also suspended for as long as the queue is at capacity and
needs to resume as soon as the pressure is relieved, i.e. a caller takes a channel
out of the queue. 
</p>
        <p>
To show that <em>InputQueue&lt;T&gt;</em> is a very useful general purpose class even
outside of the context of the WCF channel infrastructure, I’ve lifted a version of
it from one of the most recent WCF channel samples, made a small number of modifications
that I’ll write about later, and created a little sample around it that I’ve attached
to this post. 
</p>
        <p>
The sample I’ll discuss here is simulating parsing/reading IP addresses from a log-file
and then performing a reverse DNS name resolution on those addresses – something that
you’d do in a web-server log-analyzer or as the background task in a blog engine wile
preparing statistics. 
</p>
        <p>
Reverse DNS name resolution is quite interesting since it’s embarrassingly easy to
parallelize and each resolution commonly takes a really long time (4-5 seconds) –whereby
all the work is done elsewhere. The process issuing the queries is mostly sitting
around idle waiting for the response.  Therefore, it’s a good idea to run a number
of DNS requests in parallel, but it’s a terrible idea to have any of these requests
execute as a blocking call and burning a thread. Since we’re assuming that we’re reading
from a log file that requires some parsing, it would also be a spectacularly bad idea
to have multiple concurrent threads compete for access to that file and get into each
other’s way. And since it is a file and we need to lift things up from disk, we probably
shouldn’t do that ‘just in time’ as a DNS resolution step is done, but there should
rather be some data readily waiting for processing.  <em>InputQueue&lt;T&gt; </em>is
enormously helpful in such a scenario.
</p>
        <p>
The key file of the sample code – the implementation of the queue itself aside – is
obviously Program.cs. Here’s Main() :
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">static</span>
            <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[]
args)</pre>
          <pre>{</pre>
          <pre class="alt">
            <span class="kwrd">int</span> maxItemsInQueue = 10;</pre>
          <pre>    InputQueue&lt;IPAddress&gt; logDataQueue = <span class="kwrd">new</span> InputQueue&lt;IPAddress&gt;();</pre>
          <pre class="alt">
            <span class="kwrd">int</span> numResolverLoops = 20;</pre>
          <pre>    ManualResetEvent shutdownCompleteEvent = <span class="kwrd">new</span> ManualResetEvent(<span class="kwrd">false</span>);</pre>
          <pre class="alt">    List&lt;IPAddressResolverLoop&gt; resolverLoops = <span class="kwrd">new</span> List&lt;IPAddressResolverLoop&gt;();</pre>
          <pre> </pre>
          <pre class="alt">    Console.WriteLine(<span class="str">"You can stop the program
by pressing ENTER."</span>);</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
We’re setting up a new <em>InputQueue&lt;IPAddress&gt;</em> here into which we’ll
throw the parsed addresses from our acquisition loop that simulates reading from the
log. The queue’s capacity will be limited to just 10 entries (<em>maxItemsInQueue</em> is
the input value) and we will run 20 'resolver loops’, which are logical threads that
process IP-to-hostname resolution steps.
</p>
        <div class="csharpcode">
          <pre class="alt">    Console.WriteLine(<span class="str">"You
can stop the program by pressing ENTER."</span>);</pre>
          <pre> </pre>
          <pre class="alt">
            <span class="rem">// set up the loop termination callback</span>
          </pre>
          <pre>    WaitCallback loopTerminationCallback = o =&gt;</pre>
          <pre class="alt">    {</pre>
          <pre>
            <span class="kwrd">if</span> (Interlocked.Decrement(<span class="kwrd">ref</span> numResolverLoops)
== 0)</pre>
          <pre class="alt">        {</pre>
          <pre>            shutdownCompleteEvent.Set();</pre>
          <pre class="alt">        }</pre>
          <pre>    };</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="rem">// set up the resolver loops</span>
          </pre>
          <pre class="alt">
            <span class="kwrd">for</span> (<span class="kwrd">int</span> loop
= 0; loop &lt; numResolverLoops; loop++)</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="rem">// add the resolver loop 'i' and set the
done flag when the</span>
          </pre>
          <pre>
            <span class="rem">// last of them terminates</span>
          </pre>
          <pre class="alt">        resolverLoops.Add(</pre>
          <pre>
            <span class="kwrd">new</span> IPAddressResolverLoop(</pre>
          <pre class="alt">                logDataQueue, loop, </pre>
          <pre>                loopTerminationCallback, <span class="kwrd">null</span>));</pre>
          <pre class="alt">    }</pre>
        </div>
        <p>
Next we’re kicking off the resolver loops – we’ll look at these in detail a bit later.
We’ve got a <em>ManualResetEvent</em> lock object that guards the program’s exit until
all these loops have completed and we’re going to set that to signaled once the last
loop completes – that’s what the <em>loopTerminationCallback</em> anonymous method
is for.  We’re registering the method with each of the loops and as they complete
the method gets called and the last call sets the event. Each loop gets a reference
to the <em>logDataQueue </em>from where it gets its work.
</p>
        <div class="csharpcode">
          <pre class="alt">   <span class="rem">// set up
the acquisition loop; the loop auto-starts</span></pre>
          <pre>
            <span class="kwrd">using</span> (LogDataAcquisitionLoop acquisitionLoop =</pre>
          <pre class="alt">
            <span class="kwrd">new</span> LogDataAcquisitionLoop(logDataQueue,
maxItemsInQueue))</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="rem">// hang main thread waiting for ENTER</span>
          </pre>
          <pre>        Console.ReadLine();</pre>
          <pre class="alt">        Console.WriteLine(<span class="str">"*** Shutdown initiated."</span>);</pre>
          <pre>    }</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Finally we’re starting the acquisition loop that gets the data from the log file.
The loop gets a reference to the <em>logDataQueue</em> where it places the acquired
items and it’s passed the <em>maxItemsInQueue </em>quota that governs how many items
may be read ahead into the queue. Once the user presses the ENTER key, the acquisition
loop object is disposed by ways of exiting the <em>using</em> scope, which stops the
loop.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="rem"> // shut down the queue;
the resolvers will auto-close</span>
          </pre>
          <pre>
            <span class="rem">// as the queue drains. We don't need to close them here.</span>
          </pre>
          <pre class="alt">    logDataQueue.Shutdown();</pre>
          <pre> </pre>
          <pre class="alt">
            <span class="rem">// wait for all work to complete</span>
          </pre>
          <pre>    shutdownCompleteEvent.WaitOne();</pre>
          <pre class="alt">}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Lastly, the queue is shut down (by fittingly calling <em>Shutdown</em>). Shutdown
closes the queue (all further enqueue operations are absorbed) and causes all pending
readers for which no more entries are available on the queue to unblock immediately 
and return <em>null</em>. The resolver loops will complete their respective jobs and
will terminate whenever they dequeue <em>null</em> from the queue. As they terminate,
they call the registered termination callback (<em>loopTerminationCallback</em> from
above) and that will eventually cause <em>shutdownCompletedEvent</em> to become signaled
as discussed above.
</p>
        <p>
The log-reader simulator isn’t particularly interesting for this sample, even though
one of the goodies is that the simulation executes on an I/O completion port instead
of a managed thread-pool thread – that’s another blog post. The two methods of interest
are Begin/EndGetLogData – all that’s of interest here is that EndGetLogData returns
an <em>IPAddress</em> that’s assumed to be parsed out of a log.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">class</span> IPAddressLogReaderSimulator</pre>
          <pre>{</pre>
          <pre class="alt">
            <span class="kwrd">public</span> IAsyncResult BeginGetLogData(AsyncCallback
callback, <span class="kwrd">object</span> data);</pre>
          <pre>
            <span class="kwrd">public</span> IPAddress EndGetLogData(IAsyncResult result);</pre>
          <pre class="alt">}</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The simulator is used internally  by the <em>LogDataAcquisitionLoop</em> class
– which we’ll drill into because it implements the throttling mechanism on the queue.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">class</span> LogDataAcquisitionLoop
: IDisposable</pre>
          <pre>{</pre>
          <pre class="alt">
            <span class="kwrd">readonly</span> IPAddressLogReaderSimulator
ipAddressLogReaderSimulator;</pre>
          <pre>
            <span class="kwrd">readonly</span> InputQueue&lt;IPAddress&gt; logDataQueue;</pre>
          <pre class="alt">
            <span class="kwrd">int</span> maxItemsInQueue;</pre>
          <pre>
            <span class="kwrd">int</span> readingSuspended;</pre>
          <pre class="alt">
            <span class="kwrd">bool</span> shuttingDown;</pre>
          <pre> </pre>
          <pre class="alt">
            <span class="kwrd">public</span> LogDataAcquisitionLoop(InputQueue&lt;IPAddress&gt;
logDataQueue, <span class="kwrd">int</span> maxItemsInQueue)</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.logDataQueue = logDataQueue;</pre>
          <pre>
            <span class="kwrd">this</span>.maxItemsInQueue = maxItemsInQueue;</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.shuttingDown = <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="kwrd">this</span>.ipAddressLogReaderSimulator = <span class="kwrd">new</span> IPAddressLogReaderSimulator();</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.ipAddressLogReaderSimulator.BeginGetLogData(<font style="BACKGROUND-COLOR: #ffff00"><span class="kwrd">this</span>.LogDataAcquired</font>, <span class="kwrd">null</span>);</pre>
          <pre>    }</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The constructor sets up the shared state of the loop and kicks off the first read
operation on the simulator. Once BeginGetLogData has acquired the first IPAddress
(which will happy very quickly), the <em>LogDataAcquired</em> callback method will
be invoked.  
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span>
            <font style="BACKGROUND-COLOR: #ffff00">LogDataAcquired</font>(IAsyncResult
result)</pre>
          <pre>    {</pre>
          <pre class="alt">        IPAddress address = <span class="kwrd">this</span>.ipAddressLogReaderSimulator.EndGetLogData(result);</pre>
          <pre> </pre>
          <pre class="alt">        Console.WriteLine(<span class="str">"-- added {0}"</span>,
address);</pre>
          <pre>
            <span class="kwrd">this</span>.logDataQueue.EnqueueAndDispatch(address, <span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #00ff00">LogDataItemDequeued</font>);</pre>
          <pre class="alt">
            <span class="kwrd">if</span> (!<span class="kwrd">this</span>.shuttingDown
&amp;&amp; <span class="kwrd">this</span>.logDataQueue.PendingCount &lt; <span class="kwrd">this</span>.maxItemsInQueue)</pre>
          <pre>        {</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.ipAddressLogReaderSimulator.BeginGetLogData(<span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #ffff00">LogDataAcquired</font>, <span class="kwrd">null</span>);</pre>
          <pre>        }</pre>
          <pre class="alt">
            <span class="kwrd">else</span>
          </pre>
          <pre>        {</pre>
          <pre class="alt">
            <span class="rem">// the queue will be at the defined
capacity, thus abandon </span>
          </pre>
          <pre>
            <span class="rem">// the read loop - it'll be picked up by LogDataItemDequeued</span>
          </pre>
          <pre class="alt">
            <span class="rem">// as the queue pressure eases</span>
          </pre>
          <pre>            Interlocked.Exchange(<span class="kwrd">ref</span><span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #ffc000">readingSuspended</font>,
1);</pre>
          <pre class="alt">            Console.WriteLine(<span class="str">"-- suspended reads"</span>);</pre>
          <pre>        }</pre>
          <pre class="alt">    }</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The callback method gets the IPAddress and puts it into the queue – using the <em>InputQueue&lt;T&gt;.EnqueueAndDispatch(T,
Action)</em> method. There are two aspects that are quite special about that method
when compared to the regular <em>Queue&lt;T&gt;.Enqueue(T) </em>method. First, it
does take a callback as the second argument alongside the item to be enqueued; second,
the method name isn’t just <em>Enqueue</em>, it also says <em>Dispatch. </em></p>
        <p>
When <em>EnqueueAndDispatch()</em> is called, the item and the callback get put into
an internal item queue – that’s the ‘enqueue’ part. As we will see in context a bit
later in this post, the ‘dequeue’ operation on the queue is the <em>BeginDequeue</em>/<em>EndDequeue</em> asynchronous
method call pair. There can be any number of concurrent <em>BeginDequeue</em> requests
pending on the queue. ‘Pending’ means that the calls – rather their async callbacks
and async state – are registered in another queue internal to <em>InputQueue&lt;T&gt;</em> that
preserves the call order. Thus, <em>BeginDequeue </em>always only puts the async callback
and async state into that queue and returns afterwards. There is no thread spun or
hung. That’s all it does.  
</p>
        <p>
As things go, the best opportunity to service a pending dequeue operation on a queue
is when an item is being enqueued. Consequently, <em>EnqueueAndDispatch()</em> will
first put the item into the internal queue and will then look whether there are registered
waiters and/or readers – waiters are registered by ‘(Begin-)WaitForItem’, readers
are registered by ‘(Begin-)Dequeue’. Since it’s known that there a new item in the
queue now, the operation will iterate overall waiters and complete them – and does
so by invoking their async callbacks, effectively lending the  enqueue operation’s
thread to the waiters. If there’s at least one pending reader, it’ll then pop a message
from the head of the internal item queue and call the reader’s async callback, lending
the enqueue operation’s thread to processing of the dequeue operation. If that just
made your head spin – yes, the item may have been dequeued and processed as <em>EnqueueAndDispatch</em> returns. 
</p>
        <p>
There is an overload for<em> EnqueueAndDispatch()</em> that takes an extra boolean
parameter that lets you cause the dispatch operation to happen on a different thread,
and there is also a <em>EnqueueWithoutDispatch()</em> method that just won’t dispatch
through and a standalone <em>Dispatch()</em> method.  
</p>
        <p>
The callback supplied to <em>EnqueueAndDispatch()</em>, here the <em>LogDataItemDequeued</em> method,
is am <em>Action </em>delegate. The queue will call this callback as the item is being
dequeued and, more precisely, when the item has been removed from the internal item
queue, but just before it is returned to the caller. That turns out to be quite handy.
If you take another look at the <font style="BACKGROUND-COLOR: #ffff00"><em>LogDataAcquired</em></font> method
you’ll notice that we’ve got two alternate code paths after <em>EnqueueAndDispatch()</em>.
The first branch is called when the queue has not reached capacity and it’s not shutting
down. When that’s so, we’re scheduling getting the next log item – otherwise we don’t.
Instead, we set the <em><font style="BACKGROUND-COLOR: #ffffff">readingSuspended</font></em> flag
and quit – effectively terminating and abandoning the loop. So how does that get restarted
when the queue is no longer at capacity? The <em>LogDataItemDequeued</em> callback!
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span>
            <font style="BACKGROUND-COLOR: #00ff00">LogDataItemDequeued</font>()</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="rem">// called whenever an item is dequeued.
First we check </span>
          </pre>
          <pre>
            <span class="rem">// whether the queue is no longer full after this </span>
          </pre>
          <pre class="alt">
            <span class="rem">// operation and the we check whether we
need to resume</span>
          </pre>
          <pre>
            <span class="rem">// the read loop.</span>
          </pre>
          <pre class="alt">
            <span class="kwrd">if</span> (!<span class="kwrd">this</span>.shuttingDown
&amp;&amp;</pre>
          <pre>
            <span class="kwrd">this</span>.logDataQueue.PendingCount &lt; <span class="kwrd">this</span>.maxItemsInQueue
&amp;&amp;</pre>
          <pre class="alt">            Interlocked.CompareExchange(<span class="kwrd">ref</span><span class="kwrd">this</span>.readingSuspended,
0, 1) == 1)</pre>
          <pre>        {</pre>
          <pre class="alt">            Console.WriteLine(<span class="str">"-- resuming reads"</span>);</pre>
          <pre>
            <span class="kwrd">this</span>.ipAddressLogReaderSimulator.BeginGetLogData(<span class="kwrd">this</span>.LogDataAcquired, <span class="kwrd">null</span>);</pre>
          <pre class="alt">        }</pre>
          <pre>    }</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The callback gets called for each item that gets dequeued. Which means that we’ll
get an opportunity to restart the loop when it’s been stalled because the queue reached
capacity. So we’re checking here whether the queue isn’t shuttong down and whether
it’s below capacity and if that’s so and the <em>readingSuspended</em> flag is set,
we’re  restarting the read loop. And that’s how the throttle works.
</p>
        <p>
So now we’ve got the data from the log in the queue and we’re throttling nicely so
that we don’t pull too much data into memory. How about taking a look at the DNS resolver
loops that process the data?
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">class</span> IPAddressResolverLoop
: IDisposable</pre>
          <pre>{</pre>
          <pre class="alt">
            <span class="kwrd">readonly</span> InputQueue&lt;IPAddress&gt;
logDataQueue;</pre>
          <pre>
            <span class="kwrd">readonly</span>
            <span class="kwrd">int</span> loop;</pre>
          <pre class="alt">
            <span class="kwrd">readonly</span> WaitCallback loopCompleted;</pre>
          <pre>
            <span class="kwrd">readonly</span>
            <span class="kwrd">object</span> state;</pre>
          <pre class="alt">
            <span class="kwrd">bool</span> shutdown;</pre>
          <pre> </pre>
          <pre class="alt">
            <span class="kwrd">public</span> IPAddressResolverLoop(InputQueue&lt;IPAddress&gt;
logDataQueue, <span class="kwrd">int</span> loop, WaitCallback loopCompleted, <span class="kwrd">object</span> state)</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.logDataQueue = logDataQueue;</pre>
          <pre>
            <span class="kwrd">this</span>.loop = loop;</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.loopCompleted = loopCompleted;</pre>
          <pre>
            <span class="kwrd">this</span>.state = state;</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.logDataQueue.BeginDequeue(TimeSpan.MaxValue, <span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #ffff00">IPAddressDequeued</font>, <span class="kwrd">null</span>);</pre>
          <pre>    }</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
This loop is also implemented as a class and the fields hold shared that that’s initialized
in the constructor. This loop also auto-starts and does so by calling <em>BeginDequeue </em>on
the input queue. As stated above, BeginDequeue  commonly just parks the callback
and returns.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span>
            <font style="BACKGROUND-COLOR: #ffff00">IPAddressDequeued</font>(IAsyncResult
ar)</pre>
          <pre>    {</pre>
          <pre class="alt">        IPAddress address = <span class="kwrd">this</span>.logDataQueue.EndDequeue(ar);</pre>
          <pre>
            <span class="kwrd">if</span> (!<span class="kwrd">this</span>.shutdown
&amp;&amp; address != <span class="kwrd">null</span>)</pre>
          <pre class="alt">        {</pre>
          <pre>            Console.WriteLine(<span class="str">"-- took {0}"</span>, address);</pre>
          <pre class="alt">            Dns.BeginGetHostEntry(address, <span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #00ff00">IPAddressResolved</font>, <span class="kwrd">new</span><span class="kwrd">object</span>[]
{ Stopwatch.StartNew(), address });</pre>
          <pre>        }</pre>
          <pre class="alt">
            <span class="kwrd">else</span>
          </pre>
          <pre>        {</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.loopCompleted(<span class="kwrd">this</span>.state);</pre>
          <pre>        }</pre>
          <pre class="alt">    }</pre>
        </div>
        <p>
As an <em>IPAddress</em> is becomes available on the queue, the callback is being
invoked and that’s quite likely on a thread lent by <em>EnqueueAndDispatch</em>()
and therefore sitting  on the thread the log file generator is using to call
back for completion of the <em>BeginGetLogData</em> method if you trace things back.
If we get an address and the value isn’t <em>null</em>, we’ll then proceed to schedule
the DNS lookup via <em>Dns.BeginGetHostEntry</em>. Otherwise we’ll terminate the loop
and call the <em>loopCompleted</em> callback. In Main() that’s the anonymous method
that counts down the loop counter and signals the event when it falls to zero.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span>
            <font style="BACKGROUND-COLOR: #00ff00">IPAddressResolved</font>(IAsyncResult
ar)</pre>
          <pre>    {</pre>
          <pre class="alt">        var args = ((<span class="kwrd">object</span>[])ar.AsyncState);</pre>
          <pre>        var stopwatch = (Stopwatch)args[0];</pre>
          <pre class="alt">        var address = (IPAddress)args[1];</pre>
          <pre> </pre>
          <pre class="alt">        stopwatch.Stop();</pre>
          <pre>
            <span class="kwrd">double</span> msecs = stopwatch.ElapsedMilliseconds;</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="kwrd">try</span>
          </pre>
          <pre class="alt">        {</pre>
          <pre>            IPHostEntry entry = Dns.EndGetHostEntry(ar);</pre>
          <pre class="alt">            Console.WriteLine(<span class="str">"{0}: {1} {2}ms"</span>, <span class="kwrd">this</span>.loop,
entry.HostName, msecs);</pre>
          <pre>        }</pre>
          <pre class="alt">
            <span class="kwrd">catch</span> (SocketException)</pre>
          <pre>        {</pre>
          <pre class="alt">
            <span class="rem">// couldn't resolve. print the literal
address</span>
          </pre>
          <pre>            Console.WriteLine(<span class="str">"{0}: {1} {2}ms"</span>, <span class="kwrd">this</span>.loop,
address, msecs);</pre>
          <pre class="alt">        }</pre>
          <pre>
            <span class="rem">// done with this entry, get the next</span>
          </pre>
          <pre class="alt">
            <span class="kwrd">this</span>.logDataQueue.BeginDequeue(TimeSpan.MaxValue, <span class="kwrd">this</span>.<font style="BACKGROUND-COLOR: #ffff00">IPAddressDequeued</font>, <span class="kwrd">null</span>);</pre>
          <pre>    }</pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
The <em>IPAddressResolved</em> method just deals with the mechanics of printing out
the result of the lookup and then schedules another <em>BeginDequeue</em> call to
start the next iteration. 
</p>
        <p>
Summary: The enabler for and the core piece of the implementation of this scenario
is <em>InputQueue&lt;T&gt;</em> – the dequeue-callback enables implementing throttling
effectively and the dispatch logic provides an efficient way to leverage threads in
applications that leverage asynchronous programming patterns, especially in I/O driven
situations as illustrated here.
</p>
        <p>
And last but not least – here’s teh codez; project file is for VS2010, throw the files
into a new console app for VS2008 and mark the project to allow unsafe code (for the
I/O completion thread pool code).
</p>
        <p>
          <a href="http://vasters.com/clemensv/content/binary/UsingInputQueue.zip">UsingInputQueue.zip
(13.85 KB)</a> 
</p>
        <p>
or if you'd rather have a version of InputQueue that is using the regular thread pool, <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a-d8ad115a8792&amp;displaylang=en">download
the WCF samples</a> and look for InputQueue.cs.
</p>
        <p>
[The sample code posted here is subject to the Windows SDK sample code license]
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3d2486d4-2bfa-446c-886b-bf336f92c861" />
      </body>
      <title>The Magical Input Queue Of T (aka InputQueue&amp;lt;T&amp;gt;)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3d2486d4-2bfa-446c-886b-bf336f92c861.aspx</guid>
      <link>http://vasters.com/clemensv/2010/09/12/The+Magical+Input+Queue+Of+T+Aka+InputQueueltTgt.aspx</link>
      <pubDate>Sun, 12 Sep 2010 07:29:23 GMT</pubDate>
      <description>&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;This post explains an essential class for asynchronous programming that lurks
in the depths of the WCF samples: InputQueue&amp;lt;T&amp;gt;. If you need to write efficient
server-side apps, you should consider reading through this and add InputQueue&amp;lt;T&amp;gt;
to your arsenal.&amp;nbsp; &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Let me start with: This blog post is 4 years late. Sorry! – and with that out of the
way:
&lt;/p&gt;
&lt;p&gt;
The &lt;a href="http://msdn.microsoft.com/wcf"&gt;WCF&lt;/a&gt; samples ship with several copies
of a class that’s marked as internal in the &lt;em&gt;System.ServiceModel.dll&lt;/em&gt; assembly: &lt;em&gt;InputQueue&amp;lt;T&amp;gt;&lt;/em&gt;.
Why are these samples – mostly those implementing channel-model extensions – bringing
local copies of this class with them? It’s an essential tool for implementing the
asynchronous call paths of many aspects of channels correctly and efficiently. 
&lt;/p&gt;
&lt;p&gt;
If you look closely enough, the WCF channel infrastructure resembles the Berkeley
Socket model quite a bit – especially on the server side. There’s a channel listener
that’s constructed on the server side and when that is &lt;a href="http://msdn.microsoft.com/en-us/library/ms195524.aspx"&gt;opened&lt;/a&gt; (usually
under the covers of the WCF ServiceHost) that operation is largely equivalent to calling
‘listen’ on a socket – the network endpoint is ready for business.&amp;nbsp; On sockets
you’ll then call ‘accept’ to accept the next available socket connection from a client,
in WCF you call ‘&lt;a href="http://msdn.microsoft.com/en-us/library/ms195572.aspx"&gt;AcceptChannel&lt;/a&gt;’
to accept the next available (session-) channel. On sockets you then call ‘receive’
to obtain bytes, on a channel you call ’&lt;a href="http://msdn.microsoft.com/en-us/library/ms195339.aspx"&gt;Receive&lt;/a&gt;’
to&amp;nbsp; obtain a message. 
&lt;/p&gt;
&lt;p&gt;
Before and between calls to '’AcceptChannel’ made by the server-side logic,&amp;nbsp;
client-initiated connections – and thus channels – may be coming in and queue up for
a bit before they handed out to the next caller of ‘AcceptChannel’, or the asynchronous
equivalent ‘Begin/EndAcceptChannel’ method pair. The number of channels that may be
pending is configured in WCF with the ‘&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.listenbacklog.aspx"&gt;ListenBacklog&lt;/a&gt;’
property that’s available on most bindings. 
&lt;/p&gt;
&lt;p&gt;
I wrote ‘queue up’ there since that’s precisely what happens – those newly created
channels on top of freshly accepted sockets or HTTP request channels are enqueued
into an &lt;em&gt;InputQueue&amp;lt;T&amp;gt;&lt;/em&gt; instance and (Begin-)Accept is implemented as
a dequeue operation on that queue. There are two particular challenges here that make
the regular &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/7977ey2c.aspx"&gt;Queue&amp;lt;T&amp;gt;&lt;/a&gt;&lt;/em&gt; class
from the &lt;em&gt;System.Collections.Generic&lt;/em&gt; namespace unsuitable for use in the implementation
of that mechanism: Firstly, the &lt;a href="http://msdn.microsoft.com/en-us/library/1c8bzx97.aspx"&gt;&lt;em&gt;Dequeue&lt;/em&gt;&lt;/a&gt; method
there is only available as a synchronous variant and also doesn’t allow for specifying
a timeout. Secondly, the queue implementation doesn’t really help much with implementing
the &lt;em&gt;ListenBacklog&lt;/em&gt; quota where not only the length of the queue is limited
to some configured number of entries, but accepting further connections/channels from
the underlying network is also suspended for as long as the queue is at capacity and
needs to resume as soon as the pressure is relieved, i.e. a caller takes a channel
out of the queue. 
&lt;/p&gt;
&lt;p&gt;
To show that &lt;em&gt;InputQueue&amp;lt;T&amp;gt;&lt;/em&gt; is a very useful general purpose class even
outside of the context of the WCF channel infrastructure, I’ve lifted a version of
it from one of the most recent WCF channel samples, made a small number of modifications
that I’ll write about later, and created a little sample around it that I’ve attached
to this post. 
&lt;/p&gt;
&lt;p&gt;
The sample I’ll discuss here is simulating parsing/reading IP addresses from a log-file
and then performing a reverse DNS name resolution on those addresses – something that
you’d do in a web-server log-analyzer or as the background task in a blog engine wile
preparing statistics. 
&lt;/p&gt;
&lt;p&gt;
Reverse DNS name resolution is quite interesting since it’s embarrassingly easy to
parallelize and each resolution commonly takes a really long time (4-5 seconds) –whereby
all the work is done elsewhere. The process issuing the queries is mostly sitting
around idle waiting for the response.&amp;nbsp; Therefore, it’s a good idea to run a number
of DNS requests in parallel, but it’s a terrible idea to have any of these requests
execute as a blocking call and burning a thread. Since we’re assuming that we’re reading
from a log file that requires some parsing, it would also be a spectacularly bad idea
to have multiple concurrent threads compete for access to that file and get into each
other’s way. And since it is a file and we need to lift things up from disk, we probably
shouldn’t do that ‘just in time’ as a DNS resolution step is done, but there should
rather be some data readily waiting for processing.&amp;nbsp; &lt;em&gt;InputQueue&amp;lt;T&amp;gt; &lt;/em&gt;is
enormously helpful in such a scenario.
&lt;/p&gt;
&lt;p&gt;
The key file of the sample code – the implementation of the queue itself aside – is
obviously Program.cs. Here’s Main() :
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;static&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; Main(&lt;span class=kwrd&gt;string&lt;/span&gt;[]
args)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;int&lt;/span&gt; maxItemsInQueue = 10;&lt;/pre&gt;
&lt;pre&gt;    InputQueue&amp;lt;IPAddress&amp;gt; logDataQueue = &lt;span class=kwrd&gt;new&lt;/span&gt; InputQueue&amp;lt;IPAddress&amp;gt;();&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;int&lt;/span&gt; numResolverLoops = 20;&lt;/pre&gt;
&lt;pre&gt;    ManualResetEvent shutdownCompleteEvent = &lt;span class=kwrd&gt;new&lt;/span&gt; ManualResetEvent(&lt;span class=kwrd&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;    List&amp;lt;IPAddressResolverLoop&amp;gt; resolverLoops = &lt;span class=kwrd&gt;new&lt;/span&gt; List&amp;lt;IPAddressResolverLoop&amp;gt;();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    Console.WriteLine(&lt;span class=str&gt;"You can stop the program by
pressing ENTER."&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
We’re setting up a new &lt;em&gt;InputQueue&amp;lt;IPAddress&amp;gt;&lt;/em&gt; here into which we’ll
throw the parsed addresses from our acquisition loop that simulates reading from the
log. The queue’s capacity will be limited to just 10 entries (&lt;em&gt;maxItemsInQueue&lt;/em&gt; is
the input value) and we will run 20 'resolver loops’, which are logical threads that
process IP-to-hostname resolution steps.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    Console.WriteLine(&lt;span class=str&gt;"You can
stop the program by pressing ENTER."&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=rem&gt;// set up the loop termination callback&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    WaitCallback loopTerminationCallback = o =&amp;gt;&lt;/pre&gt;
&lt;pre class=alt&gt;    {&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;if&lt;/span&gt; (Interlocked.Decrement(&lt;span class=kwrd&gt;ref&lt;/span&gt; numResolverLoops)
== 0)&lt;/pre&gt;
&lt;pre class=alt&gt;        {&lt;/pre&gt;
&lt;pre&gt;            shutdownCompleteEvent.Set();&lt;/pre&gt;
&lt;pre class=alt&gt;        }&lt;/pre&gt;
&lt;pre&gt;    };&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=rem&gt;// set up the resolver loops&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;for&lt;/span&gt; (&lt;span class=kwrd&gt;int&lt;/span&gt; loop =
0; loop &amp;lt; numResolverLoops; loop++)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=rem&gt;// add the resolver loop 'i' and set the done
flag when the&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=rem&gt;// last of them terminates&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        resolverLoops.Add(&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;new&lt;/span&gt; IPAddressResolverLoop(&lt;/pre&gt;
&lt;pre class=alt&gt;                logDataQueue, loop, &lt;/pre&gt;
&lt;pre&gt;                loopTerminationCallback, &lt;span class=kwrd&gt;null&lt;/span&gt;));&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Next we’re kicking off the resolver loops – we’ll look at these in detail a bit later.
We’ve got a &lt;em&gt;ManualResetEvent&lt;/em&gt; lock object that guards the program’s exit until
all these loops have completed and we’re going to set that to signaled once the last
loop completes – that’s what the &lt;em&gt;loopTerminationCallback&lt;/em&gt; anonymous method
is for.&amp;nbsp; We’re registering the method with each of the loops and as they complete
the method gets called and the last call sets the event. Each loop gets a reference
to the &lt;em&gt;logDataQueue &lt;/em&gt;from where it gets its work.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&amp;nbsp;&amp;nbsp; &lt;span class=rem&gt;// set up the acquisition
loop; the loop auto-starts&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;using&lt;/span&gt; (LogDataAcquisitionLoop acquisitionLoop =&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;new&lt;/span&gt; LogDataAcquisitionLoop(logDataQueue,
maxItemsInQueue))&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=rem&gt;// hang main thread waiting for ENTER&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        Console.ReadLine();&lt;/pre&gt;
&lt;pre class=alt&gt;        Console.WriteLine(&lt;span class=str&gt;"*** Shutdown initiated."&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Finally we’re starting the acquisition loop that gets the data from the log file.
The loop gets a reference to the &lt;em&gt;logDataQueue&lt;/em&gt; where it places the acquired
items and it’s passed the &lt;em&gt;maxItemsInQueue &lt;/em&gt;quota that governs how many items
may be read ahead into the queue. Once the user presses the ENTER key, the acquisition
loop object is disposed by ways of exiting the &lt;em&gt;using&lt;/em&gt; scope, which stops the
loop.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=rem&gt; // shut down the queue; the
resolvers will auto-close&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=rem&gt;// as the queue drains. We don't need to close them here.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;    logDataQueue.Shutdown();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=rem&gt;// wait for all work to complete&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    shutdownCompleteEvent.WaitOne();&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Lastly, the queue is shut down (by fittingly calling &lt;em&gt;Shutdown&lt;/em&gt;). Shutdown
closes the queue (all further enqueue operations are absorbed) and causes all pending
readers for which no more entries are available on the queue to unblock immediately&amp;nbsp;
and return &lt;em&gt;null&lt;/em&gt;. The resolver loops will complete their respective jobs and
will terminate whenever they dequeue &lt;em&gt;null&lt;/em&gt; from the queue. As they terminate,
they call the registered termination callback (&lt;em&gt;loopTerminationCallback&lt;/em&gt; from
above) and that will eventually cause &lt;em&gt;shutdownCompletedEvent&lt;/em&gt; to become signaled
as discussed above.
&lt;/p&gt;
&lt;p&gt;
The log-reader simulator isn’t particularly interesting for this sample, even though
one of the goodies is that the simulation executes on an I/O completion port instead
of a managed thread-pool thread – that’s another blog post. The two methods of interest
are Begin/EndGetLogData – all that’s of interest here is that EndGetLogData returns
an &lt;em&gt;IPAddress&lt;/em&gt; that’s assumed to be parsed out of a log.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;class&lt;/span&gt; IPAddressLogReaderSimulator&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;public&lt;/span&gt; IAsyncResult BeginGetLogData(AsyncCallback
callback, &lt;span class=kwrd&gt;object&lt;/span&gt; data);&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;public&lt;/span&gt; IPAddress EndGetLogData(IAsyncResult result);&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
The simulator is used internally&amp;nbsp; by the &lt;em&gt;LogDataAcquisitionLoop&lt;/em&gt; class
– which we’ll drill into because it implements the throttling mechanism on the queue.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;class&lt;/span&gt; LogDataAcquisitionLoop
: IDisposable&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; IPAddressLogReaderSimulator ipAddressLogReaderSimulator;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; InputQueue&amp;lt;IPAddress&amp;gt; logDataQueue;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;int&lt;/span&gt; maxItemsInQueue;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;int&lt;/span&gt; readingSuspended;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;bool&lt;/span&gt; shuttingDown;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;public&lt;/span&gt; LogDataAcquisitionLoop(InputQueue&amp;lt;IPAddress&amp;gt;
logDataQueue, &lt;span class=kwrd&gt;int&lt;/span&gt; maxItemsInQueue)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue = logDataQueue;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.maxItemsInQueue = maxItemsInQueue;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.shuttingDown = &lt;span class=kwrd&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.ipAddressLogReaderSimulator = &lt;span class=kwrd&gt;new&lt;/span&gt; IPAddressLogReaderSimulator();&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.ipAddressLogReaderSimulator.BeginGetLogData(&lt;font style="BACKGROUND-COLOR: #ffff00"&gt;&lt;span class=kwrd&gt;this&lt;/span&gt;.LogDataAcquired&lt;/font&gt;, &lt;span class=kwrd&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
The constructor sets up the shared state of the loop and kicks off the first read
operation on the simulator. Once BeginGetLogData has acquired the first IPAddress
(which will happy very quickly), the &lt;em&gt;LogDataAcquired&lt;/em&gt; callback method will
be invoked.&amp;nbsp; 
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;void&lt;/span&gt; &lt;font style="BACKGROUND-COLOR: #ffff00"&gt;LogDataAcquired&lt;/font&gt;(IAsyncResult
result)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        IPAddress address = &lt;span class=kwrd&gt;this&lt;/span&gt;.ipAddressLogReaderSimulator.EndGetLogData(result);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;        Console.WriteLine(&lt;span class=str&gt;"-- added {0}"&lt;/span&gt;, address);&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.EnqueueAndDispatch(address, &lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #00ff00"&gt;LogDataItemDequeued&lt;/font&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;if&lt;/span&gt; (!&lt;span class=kwrd&gt;this&lt;/span&gt;.shuttingDown
&amp;amp;&amp;amp; &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.PendingCount &amp;lt; &lt;span class=kwrd&gt;this&lt;/span&gt;.maxItemsInQueue)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.ipAddressLogReaderSimulator.BeginGetLogData(&lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #ffff00"&gt;LogDataAcquired&lt;/font&gt;, &lt;span class=kwrd&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;// the queue will be at the defined capacity,
thus abandon &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=rem&gt;// the read loop - it'll be picked up by LogDataItemDequeued&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;// as the queue pressure eases&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            Interlocked.Exchange(&lt;span class=kwrd&gt;ref&lt;/span&gt; &lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #ffc000"&gt;readingSuspended&lt;/font&gt;,
1);&lt;/pre&gt;
&lt;pre class=alt&gt;            Console.WriteLine(&lt;span class=str&gt;"-- suspended reads"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
The callback method gets the IPAddress and puts it into the queue – using the &lt;em&gt;InputQueue&amp;lt;T&amp;gt;.EnqueueAndDispatch(T,
Action)&lt;/em&gt; method. There are two aspects that are quite special about that method
when compared to the regular &lt;em&gt;Queue&amp;lt;T&amp;gt;.Enqueue(T) &lt;/em&gt;method. First, it
does take a callback as the second argument alongside the item to be enqueued; second,
the method name isn’t just &lt;em&gt;Enqueue&lt;/em&gt;, it also says &lt;em&gt;Dispatch. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
When &lt;em&gt;EnqueueAndDispatch()&lt;/em&gt; is called, the item and the callback get put into
an internal item queue – that’s the ‘enqueue’ part. As we will see in context a bit
later in this post, the ‘dequeue’ operation on the queue is the &lt;em&gt;BeginDequeue&lt;/em&gt;/&lt;em&gt;EndDequeue&lt;/em&gt; asynchronous
method call pair. There can be any number of concurrent &lt;em&gt;BeginDequeue&lt;/em&gt; requests
pending on the queue. ‘Pending’ means that the calls – rather their async callbacks
and async state – are registered in another queue internal to &lt;em&gt;InputQueue&amp;lt;T&amp;gt;&lt;/em&gt; that
preserves the call order. Thus, &lt;em&gt;BeginDequeue &lt;/em&gt;always only puts the async callback
and async state into that queue and returns afterwards. There is no thread spun or
hung. That’s all it does.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
As things go, the best opportunity to service a pending dequeue operation on a queue
is when an item is being enqueued. Consequently, &lt;em&gt;EnqueueAndDispatch()&lt;/em&gt; will
first put the item into the internal queue and will then look whether there are registered
waiters and/or readers – waiters are registered by ‘(Begin-)WaitForItem’, readers
are registered by ‘(Begin-)Dequeue’. Since it’s known that there a new item in the
queue now, the operation will iterate overall waiters and complete them – and does
so by invoking their async callbacks, effectively lending the&amp;nbsp; enqueue operation’s
thread to the waiters. If there’s at least one pending reader, it’ll then pop a message
from the head of the internal item queue and call the reader’s async callback, lending
the enqueue operation’s thread to processing of the dequeue operation. If that just
made your head spin – yes, the item may have been dequeued and processed as &lt;em&gt;EnqueueAndDispatch&lt;/em&gt; returns. 
&lt;/p&gt;
&lt;p&gt;
There is an overload for&lt;em&gt; EnqueueAndDispatch()&lt;/em&gt; that takes an extra boolean
parameter that lets you cause the dispatch operation to happen on a different thread,
and there is also a &lt;em&gt;EnqueueWithoutDispatch()&lt;/em&gt; method that just won’t dispatch
through and a standalone &lt;em&gt;Dispatch()&lt;/em&gt; method.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
The callback supplied to &lt;em&gt;EnqueueAndDispatch()&lt;/em&gt;, here the &lt;em&gt;LogDataItemDequeued&lt;/em&gt; method,
is am &lt;em&gt;Action &lt;/em&gt;delegate. The queue will call this callback as the item is being
dequeued and, more precisely, when the item has been removed from the internal item
queue, but just before it is returned to the caller. That turns out to be quite handy.
If you take another look at the &lt;font style="BACKGROUND-COLOR: #ffff00"&gt;&lt;em&gt;LogDataAcquired&lt;/em&gt;&lt;/font&gt; method
you’ll notice that we’ve got two alternate code paths after &lt;em&gt;EnqueueAndDispatch()&lt;/em&gt;.
The first branch is called when the queue has not reached capacity and it’s not shutting
down. When that’s so, we’re scheduling getting the next log item – otherwise we don’t.
Instead, we set the &lt;em&gt;&lt;font style="BACKGROUND-COLOR: #ffffff"&gt;readingSuspended&lt;/font&gt;&lt;/em&gt; flag
and quit – effectively terminating and abandoning the loop. So how does that get restarted
when the queue is no longer at capacity? The &lt;em&gt;LogDataItemDequeued&lt;/em&gt; callback!
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;void&lt;/span&gt; &lt;font style="BACKGROUND-COLOR: #00ff00"&gt;LogDataItemDequeued&lt;/font&gt;()&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=rem&gt;// called whenever an item is dequeued. First
we check &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=rem&gt;// whether the queue is no longer full after this &lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=rem&gt;// operation and the we check whether we need
to resume&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=rem&gt;// the read loop.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;if&lt;/span&gt; (!&lt;span class=kwrd&gt;this&lt;/span&gt;.shuttingDown
&amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.PendingCount &amp;lt; &lt;span class=kwrd&gt;this&lt;/span&gt;.maxItemsInQueue
&amp;amp;&amp;amp;&lt;/pre&gt;
&lt;pre class=alt&gt;            Interlocked.CompareExchange(&lt;span class=kwrd&gt;ref&lt;/span&gt; &lt;span class=kwrd&gt;this&lt;/span&gt;.readingSuspended,
0, 1) == 1)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class=alt&gt;            Console.WriteLine(&lt;span class=str&gt;"-- resuming reads"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.ipAddressLogReaderSimulator.BeginGetLogData(&lt;span class=kwrd&gt;this&lt;/span&gt;.LogDataAcquired, &lt;span class=kwrd&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;        }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
The callback gets called for each item that gets dequeued. Which means that we’ll
get an opportunity to restart the loop when it’s been stalled because the queue reached
capacity. So we’re checking here whether the queue isn’t shuttong down and whether
it’s below capacity and if that’s so and the &lt;em&gt;readingSuspended&lt;/em&gt; flag is set,
we’re&amp;nbsp; restarting the read loop. And that’s how the throttle works.
&lt;/p&gt;
&lt;p&gt;
So now we’ve got the data from the log in the queue and we’re throttling nicely so
that we don’t pull too much data into memory. How about taking a look at the DNS resolver
loops that process the data?
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;class&lt;/span&gt; IPAddressResolverLoop
: IDisposable&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; InputQueue&amp;lt;IPAddress&amp;gt; logDataQueue;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; &lt;span class=kwrd&gt;int&lt;/span&gt; loop;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; WaitCallback loopCompleted;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;readonly&lt;/span&gt; &lt;span class=kwrd&gt;object&lt;/span&gt; state;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;bool&lt;/span&gt; shutdown;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;public&lt;/span&gt; IPAddressResolverLoop(InputQueue&amp;lt;IPAddress&amp;gt;
logDataQueue, &lt;span class=kwrd&gt;int&lt;/span&gt; loop, WaitCallback loopCompleted, &lt;span class=kwrd&gt;object&lt;/span&gt; state)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue = logDataQueue;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.loop = loop;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.loopCompleted = loopCompleted;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.state = state;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.BeginDequeue(TimeSpan.MaxValue, &lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #ffff00"&gt;IPAddressDequeued&lt;/font&gt;, &lt;span class=kwrd&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
This loop is also implemented as a class and the fields hold shared that that’s initialized
in the constructor. This loop also auto-starts and does so by calling &lt;em&gt;BeginDequeue &lt;/em&gt;on
the input queue. As stated above, BeginDequeue&amp;nbsp; commonly just parks the callback
and returns.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;void&lt;/span&gt; &lt;font style="BACKGROUND-COLOR: #ffff00"&gt;IPAddressDequeued&lt;/font&gt;(IAsyncResult
ar)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        IPAddress address = &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.EndDequeue(ar);&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;if&lt;/span&gt; (!&lt;span class=kwrd&gt;this&lt;/span&gt;.shutdown &amp;amp;&amp;amp;
address != &lt;span class=kwrd&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class=alt&gt;        {&lt;/pre&gt;
&lt;pre&gt;            Console.WriteLine(&lt;span class=str&gt;"-- took {0}"&lt;/span&gt;, address);&lt;/pre&gt;
&lt;pre class=alt&gt;            Dns.BeginGetHostEntry(address, &lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #00ff00"&gt;IPAddressResolved&lt;/font&gt;, &lt;span class=kwrd&gt;new&lt;/span&gt; &lt;span class=kwrd&gt;object&lt;/span&gt;[]
{ Stopwatch.StartNew(), address });&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.loopCompleted(&lt;span class=kwrd&gt;this&lt;/span&gt;.state);&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
As an &lt;em&gt;IPAddress&lt;/em&gt; is becomes available on the queue, the callback is being
invoked and that’s quite likely on a thread lent by &lt;em&gt;EnqueueAndDispatch&lt;/em&gt;()
and therefore sitting&amp;nbsp; on the thread the log file generator is using to call
back for completion of the &lt;em&gt;BeginGetLogData&lt;/em&gt; method if you trace things back.
If we get an address and the value isn’t &lt;em&gt;null&lt;/em&gt;, we’ll then proceed to schedule
the DNS lookup via &lt;em&gt;Dns.BeginGetHostEntry&lt;/em&gt;. Otherwise we’ll terminate the loop
and call the &lt;em&gt;loopCompleted&lt;/em&gt; callback. In Main() that’s the anonymous method
that counts down the loop counter and signals the event when it falls to zero.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;void&lt;/span&gt; &lt;font style="BACKGROUND-COLOR: #00ff00"&gt;IPAddressResolved&lt;/font&gt;(IAsyncResult
ar)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        var args = ((&lt;span class=kwrd&gt;object&lt;/span&gt;[])ar.AsyncState);&lt;/pre&gt;
&lt;pre&gt;        var stopwatch = (Stopwatch)args[0];&lt;/pre&gt;
&lt;pre class=alt&gt;        var address = (IPAddress)args[1];&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;        stopwatch.Stop();&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;double&lt;/span&gt; msecs = stopwatch.ElapsedMilliseconds;&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        {&lt;/pre&gt;
&lt;pre&gt;            IPHostEntry entry = Dns.EndGetHostEntry(ar);&lt;/pre&gt;
&lt;pre class=alt&gt;            Console.WriteLine(&lt;span class=str&gt;"{0}: {1} {2}ms"&lt;/span&gt;, &lt;span class=kwrd&gt;this&lt;/span&gt;.loop,
entry.HostName, msecs);&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;catch&lt;/span&gt; (SocketException)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;// couldn't resolve. print the literal
address&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            Console.WriteLine(&lt;span class=str&gt;"{0}: {1} {2}ms"&lt;/span&gt;, &lt;span class=kwrd&gt;this&lt;/span&gt;.loop,
address, msecs);&lt;/pre&gt;
&lt;pre class=alt&gt;        }&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=rem&gt;// done with this entry, get the next&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;this&lt;/span&gt;.logDataQueue.BeginDequeue(TimeSpan.MaxValue, &lt;span class=kwrd&gt;this&lt;/span&gt;.&lt;font style="BACKGROUND-COLOR: #ffff00"&gt;IPAddressDequeued&lt;/font&gt;, &lt;span class=kwrd&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
The &lt;em&gt;IPAddressResolved&lt;/em&gt; method just deals with the mechanics of printing out
the result of the lookup and then schedules another &lt;em&gt;BeginDequeue&lt;/em&gt; call to
start the next iteration. 
&lt;/p&gt;
&lt;p&gt;
Summary: The enabler for and the core piece of the implementation of this scenario
is &lt;em&gt;InputQueue&amp;lt;T&amp;gt;&lt;/em&gt; – the dequeue-callback enables implementing throttling
effectively and the dispatch logic provides an efficient way to leverage threads in
applications that leverage asynchronous programming patterns, especially in I/O driven
situations as illustrated here.
&lt;/p&gt;
&lt;p&gt;
And last but not least – here’s teh codez; project file is for VS2010, throw the files
into a new console app for VS2008 and mark the project to allow unsafe code (for the
I/O completion thread pool code).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://vasters.com/clemensv/content/binary/UsingInputQueue.zip"&gt;UsingInputQueue.zip
(13.85 KB)&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
or if you'd rather have a version of InputQueue that is using the regular thread pool, &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a-d8ad115a8792&amp;amp;displaylang=en"&gt;download
the WCF samples&lt;/a&gt;&amp;nbsp;and look for InputQueue.cs.
&lt;/p&gt;
&lt;p&gt;
[The sample code posted here is subject to the Windows SDK sample code license]
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3d2486d4-2bfa-446c-886b-bf336f92c861" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3d2486d4-2bfa-446c-886b-bf336f92c861.aspx</comments>
      <category>Architecture</category>
      <category>Technology/CLR</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=6a3321d3-1e96-47ae-8c5e-9d60346627de</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,6a3321d3-1e96-47ae-8c5e-9d60346627de.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,6a3321d3-1e96-47ae-8c5e-9d60346627de.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=6a3321d3-1e96-47ae-8c5e-9d60346627de</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://oreilly.com/catalog/9780596805494">
            <img style="MARGIN: 5px; DISPLAY: inline" alt="Book cover of Programming WCF Services" align="right" src="http://covers.oreilly.com/images/9780596805494/cat.gif" width="180" />
          </a>
        </p>
        <p>
Juval Löwy’s very successful WCF book is now available in its third edition – and
Juval asked me to update the foreword this time around. It’s been over three years
since I wrote the foreword to the first edition and thus it was time for an update
since WCF has moved on quite a bit and the use of it in the customer landscape and
inside of MS has deepened where we’re building a lot of very interesting products
on top of the WCF technology across all businesses – not least of which is the Azure
AppFabric Service Bus that I work on and that’s entirely based on WCF services.
</p>
        <p>
You can take a peek into the latest edition <a href="http://oreilly.com/catalog/9780596805494/preview#preview">at
the O’Reilly website</a> and read my foreword if you care. To be clear: It’s the least
important part of the whole book :-)
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6a3321d3-1e96-47ae-8c5e-9d60346627de" />
      </body>
      <title>Programming WCF Services, Third Edition</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,6a3321d3-1e96-47ae-8c5e-9d60346627de.aspx</guid>
      <link>http://vasters.com/clemensv/2010/09/11/Programming+WCF+Services+Third+Edition.aspx</link>
      <pubDate>Sat, 11 Sep 2010 03:10:05 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://oreilly.com/catalog/9780596805494"&gt;&lt;img style="MARGIN: 5px; DISPLAY: inline" alt="Book cover of Programming WCF Services" align=right src="http://covers.oreilly.com/images/9780596805494/cat.gif" width=180&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Juval Löwy’s very successful WCF book is now available in its third edition – and
Juval asked me to update the foreword this time around. It’s been over three years
since I wrote the foreword to the first edition and thus it was time for an update
since WCF has moved on quite a bit and the use of it in the customer landscape and
inside of MS has deepened where we’re building a lot of very interesting products
on top of the WCF technology across all businesses – not least of which is the Azure
AppFabric Service Bus that I work on and that’s entirely based on WCF services.
&lt;/p&gt;
&lt;p&gt;
You can take a peek into the latest edition &lt;a href="http://oreilly.com/catalog/9780596805494/preview#preview"&gt;at
the O’Reilly website&lt;/a&gt; and read my foreword if you care. To be clear: It’s the least
important part of the whole book :-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6a3321d3-1e96-47ae-8c5e-9d60346627de" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,6a3321d3-1e96-47ae-8c5e-9d60346627de.aspx</comments>
      <category>AppFabric</category>
      <category>Azure</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=a14d84f7-0d07-49da-a5d8-35088052c3e5</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=a14d84f7-0d07-49da-a5d8-35088052c3e5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In case you need a refresher or update about the things me and our team work on at
Microsoft, <a href="http://www.msteched.com/2010/Australia/COS230">go here</a> for
a very recent and very good presentation by my PM colleague <a href="http://twitter.com/mmyslin">Maggie
Myslinska</a> from TechEd Australia 2010 about Windows Azure AppFabric with Service
Bus demos and a demo of the new Access Control V2 CTP
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=a14d84f7-0d07-49da-a5d8-35088052c3e5" />
      </body>
      <title>Windows Azure AppFabric Overview session from TechEd Australia 2010 </title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</guid>
      <link>http://vasters.com/clemensv/2010/09/09/Windows+Azure+AppFabric+Overview+Session+From+TechEd+Australia+2010.aspx</link>
      <pubDate>Thu, 09 Sep 2010 01:08:52 GMT</pubDate>
      <description>&lt;p&gt;
In case you need a refresher or update about the things me and our team work on at
Microsoft, &lt;a href="http://www.msteched.com/2010/Australia/COS230"&gt;go here&lt;/a&gt; for
a very recent and very good presentation by my PM colleague &lt;a href="http://twitter.com/mmyslin"&gt;Maggie
Myslinska&lt;/a&gt; from TechEd Australia 2010 about Windows Azure AppFabric with Service
Bus demos and a demo of the new Access Control V2 CTP
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=a14d84f7-0d07-49da-a5d8-35088052c3e5" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,a14d84f7-0d07-49da-a5d8-35088052c3e5.aspx</comments>
      <category>AppFabric</category>
      <category>Architecture/SOA</category>
      <category>Azure</category>
      <category>Technology</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=679ca50b-c907-4831-81c4-369ef7b85839</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=679ca50b-c907-4831-81c4-369ef7b85839</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:f13e6b20-a745-4e1c-be87-d241bbf94d4b" class="wlWriterEditableSmartContent">
          <p>
XML-RPC for WCF <a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/XMLRPCwithWCFUpdated_8EB8/XmlRpcForWCF.zip" target="_blank">Download
here</a></p>
        </div>
        <p>
        </p>
        <p>
I had updated my WCF XML-RPC stack for PDC’08 but never got around to post it (either
too busy or too lazy when not busy). The updated source code is attached to this post. 
</p>
        <p>
Contrary to the code that I’ve posted a while back, the new XML-RPC implementation
is no longer a binding with a special encoder, but is implemented entirely as a set
of behaviors and extensions for the WCF Service Model. The behavior will work with
WCF 3.5 as it ships in the framework and also with the .NET Service Bus March 2009
CTP.
</p>
        <p>
The resulting Service Model programming experience is completely "normal". That means
you can also expose the XML-RPC contracts as SOAP endpoints with all the advanced
WCF bindings and features if you like. The behaviors support client and service side.
I stripped the config support from this version – I’ll add that back once I get around
to it. Here's a snippet from the MetaWeblog contract:
</p>
        <pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  1: [ServiceContract(Namespace = http:<span style="COLOR: #008000">//www.xmlrpc.com/metaWeblogApi)]</span></pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  2: <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">interface</span> IMetaWeblog
: IBlogger </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  3: {
</pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  4:    [OperationContract(Action="<span style="COLOR: #8b0000">metaWeblog.editPost</span>")] </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  5:    <span style="COLOR: #0000ff">bool</span> metaweblog_editPost(<span style="COLOR: #0000ff">string</span> postid, </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  6:                              <span style="COLOR: #0000ff">string</span> username, </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  7:                              <span style="COLOR: #0000ff">string</span> password, </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  8:                              Post post,
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  9:                              <span style="COLOR: #0000ff">bool</span> publish); </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 10: 
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 11:    [OperationContract(Action="<span style="COLOR: #8b0000">metaWeblog.getCategories</span>")] </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 12:    CategoryInfo[] metaweblog_getCategories( <span style="COLOR: #0000ff">string</span> blogid, </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 13:                                             <span style="COLOR: #0000ff">string</span> username, </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 14:                                             <span style="COLOR: #0000ff">string</span> password); </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 15:     ...
</pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 16: 
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 17: }</pre>
        </pre>
        <p>
Setting up the endpoint is very easy. Pick the WebHttpBinding (or the WebHttpRelayBinding
for .NET Service Bus), create an endpoint, add the XmlRpcEndpointBehavior to the endpoint
and you’re good to go.
</p>
        <pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  1: Uri baseAddress = <span style="COLOR: #0000ff">new</span> UriBuilder(Uri.UriSchemeHttp,
Environment.MachineName, -1, "<span style="COLOR: #8b0000">/blogdemo/</span>").Uri; </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  2: 
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  3: ServiceHost serviceHost = <span style="COLOR: #0000ff">new</span> ServiceHost(<span style="COLOR: #0000ff">typeof</span>(BloggerAPI)); </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  4: var epXmlRpc = serviceHost.AddServiceEndpoint(
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  5:                   <span style="COLOR: #0000ff">typeof</span>(IBloggerAPI), </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  6:                   <span style="COLOR: #0000ff">new</span> WebHttpBinding(WebHttpSecurityMode.None), </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  7:                   <span style="COLOR: #0000ff">new</span> Uri(baseAddress,
"<span style="COLOR: #8b0000">./blogger</span>")); </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  8: epXmlRpc.Behaviors.Add(<span style="COLOR: #0000ff">new</span> XmlRpcEndpointBehavior());</pre>
        </pre>
        <p>
The client is just as simple:
</p>
        <pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  1: Uri blogAddress = <span style="COLOR: #0000ff">new</span> UriBuilder(Uri.UriSchemeHttp,
Environment.MachineName, -1, "<span style="COLOR: #8b0000">/blogdemo/blogger</span>").Uri; </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  2:             
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  3: ChannelFactory&lt;IBloggerAPI&gt; bloggerAPIFactory = 
</pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  4:      <span style="COLOR: #0000ff">new</span> ChannelFactory&lt;IBloggerAPI&gt;( </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  5:              <span style="COLOR: #0000ff">new</span> WebHttpBinding(WebHttpSecurityMode.None), </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  6:              <span style="COLOR: #0000ff">new</span> EndpointAddress(blogAddress)); </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  7: bloggerAPIFactory.Endpoint.Behaviors.Add(<span style="COLOR: #0000ff">new</span> XmlRpcEndpointBehavior()); </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  8: 
</pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  9: IBloggerAPI bloggerAPI = bloggerAPIFactory.CreateChannel();
</pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 10: </pre>
        </pre>
        <p>
For your convenience I've included complete Blogger, MetaWeblog, and MovableType API
contracts along with the respective data types in the test applications. The test
app is a small in-memory blog that you can use with the blogging function of Word
2007 or Windows Live Writer or some other blogging client for testing. 
</p>
        <p>
Of the other interesting XML-RPC APIs, the <a href="http://www.hixie.ch/specs/pingback/pingback">Pingback
API</a> has the following contract:
</p>
        <pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  1:  [ServiceContract(Namespace="<span style="COLOR: #8b0000">http://www.hixie.ch/specs/pingback/pingback</span>")] </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  2:  <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">interface</span> IPingback </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  3:  {
</pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  4:      [OperationContract(Action="<span style="COLOR: #8b0000">pingback.ping</span>")] </pre>
          <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  5:      <span style="COLOR: #0000ff">string</span> ping(<span style="COLOR: #0000ff">string</span> sourceUri, <span style="COLOR: #0000ff">string</span> targetUri); </pre>
          <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  6:  }</pre>
        </pre>
        <p>
and the <a href="http://www.xmlrpc.com/weblogsCom">WeblogUpdates API</a> looks like
this:
</p>
        <span style="LINE-HEIGHT: 115%; FONT-FAMILY: consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes">
          <pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  1:     [DataContract]</pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  2:     <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">struct</span> WeblogUpdatesReply </pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  3:     {
</pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  4:         [DataMember]
</pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  5:         <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">bool</span> flerror; </pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  6:         [DataMember]
</pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  7:         <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">string</span> message; </pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  8:     }
</pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px">  9: 
</pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 10:     [ServiceContract]
</pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 11:     <span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">interface</span> IWeblogUpdates </pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 12:     {
</pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 13:         [OperationContract(Action = "<span style="COLOR: #8b0000">weblogUpdates.extendedPing</span>")] </pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 14:         WeblogUpdatesReply ExtendedPing(<span style="COLOR: #0000ff">string</span> weblogName, <span style="COLOR: #0000ff">string</span> weblogUrl, <span style="COLOR: #0000ff">string</span> checkUrl, <span style="COLOR: #0000ff">string</span> rssUrl); </pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 15:         [OperationContract(Action="<span style="COLOR: #8b0000">weblogUpdates.ping</span>")] </pre>
            <pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 16:         WeblogUpdatesReply Ping(<span style="COLOR: #0000ff">string</span> weblogName, <span style="COLOR: #0000ff">string</span> weblogUrl); </pre>
            <pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"> 17:     }</pre>
          </pre>
          <p>
          </p>
        </span>The code is subject to the Microsoft samples license, which means that
you can freely put it into your (blogging) apps as long as you keep the house out
of trouble.
<img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=679ca50b-c907-4831-81c4-369ef7b85839" /></body>
      <title>XML-RPC with WCF (Updated)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx</guid>
      <link>http://vasters.com/clemensv/2009/04/03/XMLRPC+With+WCF+Updated.aspx</link>
      <pubDate>Fri, 03 Apr 2009 17:09:14 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id=scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:f13e6b20-a745-4e1c-be87-d241bbf94d4b class=wlWriterEditableSmartContent&gt;
&lt;p&gt;
XML-RPC for WCF &lt;a href="http://vasters.com/clemensv/content/binary/WindowsLiveWriter/XMLRPCwithWCFUpdated_8EB8/XmlRpcForWCF.zip" target=_blank&gt;Download
here&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
I had updated my WCF XML-RPC stack for PDC’08 but never got around to post it (either
too busy or too lazy when not busy). The updated source code is attached to this post. 
&lt;/p&gt;
&lt;p&gt;
Contrary to the code that I’ve posted a while back, the new XML-RPC implementation
is no longer a binding with a special encoder, but is implemented entirely as a set
of behaviors and extensions for the WCF Service Model. The behavior will work with
WCF 3.5 as it ships in the framework and also with the .NET Service Bus March 2009
CTP.
&lt;/p&gt;
&lt;p&gt;
The resulting Service Model programming experience is completely "normal". That means
you can also expose the XML-RPC contracts as SOAP endpoints with all the advanced
WCF bindings and features if you like. The behaviors support client and service side.
I stripped the config support from this version – I’ll add that back once I get around
to it. Here's a snippet from the MetaWeblog contract:
&lt;/p&gt;
&lt;pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: [ServiceContract(Namespace = http:&lt;span style="COLOR: #008000"&gt;//www.xmlrpc.com/metaWeblogApi)]&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;interface&lt;/span&gt; IMetaWeblog
: IBlogger &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: {
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:    [OperationContract(Action="&lt;span style="COLOR: #8b0000"&gt;metaWeblog.editPost&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:    &lt;span style="COLOR: #0000ff"&gt;bool&lt;/span&gt; metaweblog_editPost(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; postid, &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:                              &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; username, &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:                              &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; password, &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:                              Post post,
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9:                              &lt;span style="COLOR: #0000ff"&gt;bool&lt;/span&gt; publish); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10: 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:    [OperationContract(Action="&lt;span style="COLOR: #8b0000"&gt;metaWeblog.getCategories&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:    CategoryInfo[] metaweblog_getCategories( &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; blogid, &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:                                             &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; username, &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:                                             &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; password); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:     ...
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16: 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17: }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
Setting up the endpoint is very easy. Pick the WebHttpBinding (or the WebHttpRelayBinding
for .NET Service Bus), create an endpoint, add the XmlRpcEndpointBehavior to the endpoint
and you’re good to go.
&lt;/p&gt;
&lt;pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: Uri baseAddress = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; UriBuilder(Uri.UriSchemeHttp,
Environment.MachineName, -1, "&lt;span style="COLOR: #8b0000"&gt;/blogdemo/&lt;/span&gt;").Uri; &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2: 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: ServiceHost serviceHost = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; ServiceHost(&lt;span style="COLOR: #0000ff"&gt;typeof&lt;/span&gt;(BloggerAPI)); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4: var epXmlRpc = serviceHost.AddServiceEndpoint(
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:                   &lt;span style="COLOR: #0000ff"&gt;typeof&lt;/span&gt;(IBloggerAPI), &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:                   &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; WebHttpBinding(WebHttpSecurityMode.None), &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:                   &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; Uri(baseAddress,
"&lt;span style="COLOR: #8b0000"&gt;./blogger&lt;/span&gt;")); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: epXmlRpc.Behaviors.Add(&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; XmlRpcEndpointBehavior());&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
The client is just as simple:
&lt;/p&gt;
&lt;pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1: Uri blogAddress = &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; UriBuilder(Uri.UriSchemeHttp,
Environment.MachineName, -1, "&lt;span style="COLOR: #8b0000"&gt;/blogdemo/blogger&lt;/span&gt;").Uri; &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:             
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3: ChannelFactory&amp;lt;IBloggerAPI&amp;gt; bloggerAPIFactory = 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:      &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; ChannelFactory&amp;lt;IBloggerAPI&amp;gt;( &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:              &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; WebHttpBinding(WebHttpSecurityMode.None), &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:              &lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; EndpointAddress(blogAddress)); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7: bloggerAPIFactory.Endpoint.Behaviors.Add(&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt; XmlRpcEndpointBehavior()); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8: 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9: IBloggerAPI bloggerAPI = bloggerAPIFactory.CreateChannel();
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10: &lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
For your convenience I've included complete Blogger, MetaWeblog, and MovableType API
contracts along with the respective data types in the test applications. The test
app is a small in-memory blog that you can use with the blogging function of Word
2007 or Windows Live Writer or some other blogging client for testing. 
&lt;/p&gt;
&lt;p&gt;
Of the other interesting XML-RPC APIs, the &lt;a href="http://www.hixie.ch/specs/pingback/pingback"&gt;Pingback
API&lt;/a&gt; has the following contract:
&lt;/p&gt;
&lt;pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1:  [ServiceContract(Namespace="&lt;span style="COLOR: #8b0000"&gt;http://www.hixie.ch/specs/pingback/pingback&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:  &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;interface&lt;/span&gt; IPingback &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:  {
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:      [OperationContract(Action="&lt;span style="COLOR: #8b0000"&gt;pingback.ping&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:      &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; ping(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; sourceUri, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; targetUri); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:  }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
and the &lt;a href="http://www.xmlrpc.com/weblogsCom"&gt;WeblogUpdates API&lt;/a&gt; looks like
this:
&lt;/p&gt;
&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&lt;pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  1:     [DataContract]&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  2:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;struct&lt;/span&gt; WeblogUpdatesReply &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  3:     {
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  4:         [DataMember]
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  5:         &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;bool&lt;/span&gt; flerror; &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  6:         [DataMember]
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  7:         &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; message; &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  8:     }
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt;  9: 
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 10:     [ServiceContract]
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 11:     &lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;interface&lt;/span&gt; IWeblogUpdates &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 12:     {
&lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 13:         [OperationContract(Action = "&lt;span style="COLOR: #8b0000"&gt;weblogUpdates.extendedPing&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 14:         WeblogUpdatesReply ExtendedPing(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; weblogName, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; weblogUrl, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; checkUrl, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; rssUrl); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 15:         [OperationContract(Action="&lt;span style="COLOR: #8b0000"&gt;weblogUpdates.ping&lt;/span&gt;")] &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #ffffff; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 16:         WeblogUpdatesReply Ping(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; weblogName, &lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt; weblogUrl); &lt;/pre&gt;
&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas,'Courier New',courier,monospace; FONT-SIZE: 12px"&gt; 17:     }&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;/span&gt;The code is subject to the Microsoft samples license, which means that you
can freely put it into your (blogging) apps as long as you keep the house out of trouble.&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=679ca50b-c907-4831-81c4-369ef7b85839" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx</comments>
      <category>.NET Services</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=82d7c041-691b-4d37-b552-6de980c3c2b1</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=82d7c041-691b-4d37-b552-6de980c3c2b1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We've got a discussion forum up on MSDN where you can ask questions about Microsoft
.NET Services (Service Bus, Workflow, Access Control): <a href="http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/">http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/</a></p>
        <p>
 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=82d7c041-691b-4d37-b552-6de980c3c2b1" />
      </body>
      <title>Questions about .NET Services? Hit the forums.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</guid>
      <link>http://vasters.com/clemensv/2008/10/28/Questions+About+NET+Services+Hit+The+Forums.aspx</link>
      <pubDate>Tue, 28 Oct 2008 20:20:15 GMT</pubDate>
      <description>&lt;p&gt;
We've got a discussion forum up on MSDN where you can ask questions about Microsoft
.NET Services (Service Bus, Workflow, Access Control): &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/"&gt;http://social.msdn.microsoft.com/Forums/en-US/netservices/threads/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=82d7c041-691b-4d37-b552-6de980c3c2b1" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,82d7c041-691b-4d37-b552-6de980c3c2b1.aspx</comments>
      <category>Talks</category>
      <category>Technology</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=92d78bee-2cfd-4a29-95ab-c5abb9b905e7</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,92d78bee-2cfd-4a29-95ab-c5abb9b905e7.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,92d78bee-2cfd-4a29-95ab-c5abb9b905e7.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=92d78bee-2cfd-4a29-95ab-c5abb9b905e7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
According to recent traffic studies, the BitTorrent protocol is now responsible for
roughly half of all Internet traffic. That's a lot of sharing of personal photos,
self-sung songs, and home videos. Half! Next to text messaging, Instant Messaging
applications are the social lifeline for our teenagers these days – so much that the
text messaging and IM lingo is starting to become a natural part of the colloquial
vocabulary everywhere. Apple's TV, Microsoft's Xbox 360, and Netflix are shaking up
the video rental market by delivering streamed or downloadable high-quality video
and streams on YouTube have become the new window on the world. Gamers from around
the world are meeting in photorealistic virtual online worlds to compete in races,
rake in all the gold, or blast their respective Avatars into tiny little pieces. 
</p>
        <p>
What does all of that have to do with Web 2.0? Very little. While it's indisputable
that the Web provides the glue between many of those experiences, the majority of
all Internet traffic and very many of the most interesting Internet applications depend
on bi-directional, peer-to-peer connectivity. 
</p>
        <p>
These familiar consumer examples have even more interesting counterparts in the business
and industrial space. Industrial machinery has ever increasing remote management capabilities
that allow complete remote automation, reprogramming, and reconfiguration. Security
and environment surveillance systems depend on thousands of widely distributed, remotely
controlled cameras and other sensors that sit on street poles, high up on building
walls, or somewhere in the middle of a forest. Terrestrial and satellite-based mobile
wireless technologies make it possible to provide some form of digital connectivity
to almost any place on Earth, but making an array of devices addressable and reachable
so that they can be integrated into and controlled by a federated, distributed business
solution that can leverage Internet scale and reach remains incredibly difficult. 
</p>
        <p>
The primary obstacle to creating pervasive connectivity is that we have run out of
IPv4 addresses. There is no mere threat of running out, we're already done. The IPv4
space is practically saturated and it's really only network address translation (NAT)
that permits the Internet to grow any further. The shortage is already causing numerous
ISPs to move customers behind NATs and not to provide them with public IP address
leases any longer. Getting a static public IP address (let alone a range) is getting
really difficult. IPv6 holds the promise of making each device (or even every general-purpose
computer) uniquely addressable again, but pervasive IPv6 adoption that doesn't require
the use of transitional (and constraining) tunneling protocols will still take many
years. 
</p>
        <p>
The second major obstacle is security. Since the open network is a fairly dangerous
place these days and corporate network environments are often und unfortunately not
much better, the use of Firewalls has become ubiquitous and almost all incoming traffic
is blocked by default on the majority of computers these days. That's great for keeping
the bad guys out, but not so great for everything else – especially not for applications
requiring bi-directional connectivity between peers. 
</p>
        <p>
Since these constraints are obviously well-known and understood there is a range of
workarounds. In home networking environments the firewall and NAT issues are often
dealt with by selectively allowing applications to open inbound ports on the local
and network router firewalls using technologies like UPnP or by opening and forwarding
port by ways of manual configuration. Dynamic DNS services help with making particular
machines discoverable even if the assigned IP address keeps changing. The problem
with those workarounds is that they realistically only ever work for the simplest
home networking scenarios and, if they do work, the resulting security threat situation
is quite scary. The reality is that the broadly deployed Internet infrastructure is
optimized for the Web: clients make outbound requests, publicly discoverable and reachable
servers respond. 
</p>
        <p>
If your application requires bi-directional connectivity you effectively have two
choices: Either you bet on the available workarounds and live with the consequences
(as BitTorrent does) or you build and operate some form of Relay service for your
application. A Relay service accepts and maintains connections from firewalled and/or
NAT-ed clients and routes messages between them. Practically all chat, instant messaging,
video conferencing, VoIP, and multiplayer gaming applications and many other popular
Internet applications depend on some form of Relay service. 
</p>
        <p>
The challenge with Relay services is that they are incredibly hard to build in a fashion
that they can provide Internet scale where they need to route between thousands or
even millions of connections as the large Instant Messaging networks do. And once
you have a Relay that can support such scale it is incredibly expensive to operate.
So expensive in fact that the required investments and the resulting operational costs
are entirely out of reach for the vast majority of software companies. The connectivity
challenge is a real innovation blocker and represents a significant entry barrier. 
</p>
        <p>
The good news is that Microsoft .NET <em>Service Bus</em> provides a range of bidirectional,
peer-to-peer connectivity options including relayed communication. You don't have
to build your own or run your own; you can use this Building Block instead. The <em>.NET
Service Bus</em> covers four logical feature areas: Naming, Registry, Connectivity,
and Eventing. 
</p>
        <h4>Naming 
</h4>
        <p>
The Internet's Domain Name System (DNS) is a naming system primarily optimized for
assigning names and roles to hosts. The registration records either provide a simple
association of names and IP addresses or a more granular association of particular
protocol roles (such as identifying domain's mail server) with an IP address. In either
case, the resolution of the DNS model occurs at the IP address level and that is very
coarse grained. Since it is IP address centric, a DNS registration requires a public
IP address. Systems behind NAT can't play. Even though Dynamic DNS services can provide
names to systems that do have a public IP address, relying on DNS means for most ISP
customers that the entire business site or home is identified by a single DNS host
entry with dozens or hundreds of hosts sitting behind the NAT device. 
</p>
        <p>
If you want to uniquely name individual hosts behind NATs, differentiate between individual
services on hosts, or want to name services based on host-independent criteria such
as the name of a user or tenant, the DNS system isn't an ideal fit. 
</p>
        <p>
The .NET <em>Service Bus</em><em>Naming</em> system is a forest of (theoretically)
infinite-depth, federated naming trees. The <em>Naming</em> system maintains an independent
naming tree for each tenant's solution scope and it's up to the application how it
wants to shape its tree. 'Solution' is a broad term in this context meant to describe
a .NET <em>Service Bus</em> tenant – on the customer side, a <em>Service Bus</em> application
scope may map to dozens of different on-site applications and hundreds of application
instances. 
</p>
        <p>
Any path through the naming tree has a projection that directly maps to a URI. 
</p>
        <p>
Let's construct an example to illustrate this: You design a logistics system for a
trucking company where you need to route information to service instances at particular
sites. The application scope is owned by your client, 'ContosoTrucks' which has a
number of logistics centers where they want to deploy the application. Your application
is called 'Shipping' and the endpoints through which the shipping orders are received
at the individual sites are named 'OrderManagement'. The canonical URI projection
of the mapping of New York's order management application endpoint instance into the <em>ServiceBus</em><em>Naming </em>system
is<br /><strong>http://servicebus.windows.net/services/contoso/NewYork/Shipping/OrderManagement/ </strong></p>
        <p>
The significant difference from DNS naming is that the identification of services
and endpoints moves from the host portion of the URI to the path portion and becomes
entirely host-agnostic. The DNS name identifies the scope and the entry point for
accessing the naming tree. That also means that the path portion of the URI represent
a potentially broadly distributed federation of services in the <em>Naming</em> service,
while the path portion of a 'normal' URI typically designates a collocated set of
resources. 
</p>
        <p>
There is no immediate access API for the <em>Naming </em>system itself. Instead, access
to the <em>Naming</em> system is provided through the overlaid <em>Service Registry</em>. 
</p>
        <h4>Service Registry 
</h4>
        <p>
The <em>Service Registry</em> allows publishing service endpoint references (URIs
or WS-Addressing EPRs) into the <em>Naming</em> system and to discover services that
have been registered. 
</p>
        <p>
The primary access mechanism for the Service Registry is based on the Atom Publishing
Protocol (APP) allowing clients to publish URIs or EPRs by sending a simple HTTP PUT
request with an Atom 1.0 'item' to any name in the naming tree. It's removed by sending
an HTTP DELETE request to the same name. There is no need to explicitly manage names
– names are automatically created and deleted as you create or delete service registry
entries. 
</p>
        <p>
Service discovery is done by navigating the naming hierarchy, which is accessible
through a nested tree of Atom 1.0 feeds whose master-feed is located at http://servicebus.windows.net/services/[solution]/.
Any publicly registered service is accessible through the feed at the respective location. 
</p>
        <p>
In addition to the Atom Publishing Protocol, the Service Registry also supports publishing,
accessing, and removing endpoint references using WS-Transfer and the <em>Relay</em> service
will automatically manage its endpoints in the Service Registry without requiring
any additional steps. 
</p>
        <p>
The Service Registry is an area that will see quite significant further additions
over the next few milestones including support for service categorization, search
across the hierarchy, and support for additional high-fidelity discovery protocols. 
</p>
        <h4>Connectivity 
</h4>
        <p>
The core of the connectivity feature area of the <em>.NET Service Bus</em> is a scalable,
general-purpose Relay service. The Relay's communication fabric supports unicast and
multicast datagram distribution, connection-oriented bi-directional socket communication
and request-response messaging. 
</p>
        <p>
Towards listening services the Relay takes on the same role as operating-system provided
listeners such as Windows' HTTP.SYS. Instead of listening for HTTP requests locally,
a relayed HTTP service establishes an HTTP listener endpoint inside the cloud-based
Relay and clients send requests to that cloud-based listener from where they are forwarded
to the listening service. 
</p>
        <p>
The connection between the listener and the Relay is always initiated from the listener
side. In most connection modes (there are some exceptions that we'll get to) the listener
initiates a secured outbound TCP socket connection into the Relay, authenticates,
and then tells the Relay at which place in the naming tree it wants to start listening
and what type of listener should be established. 
</p>
        <p>
Since a number of tightly managed networking environments block outbound socket connections
and only permit outbound HTTP traffic, the socket based listeners are complemented
by an HTTP-based multiplexing polling mechanism that builds on a cloud-based message
buffer. In the PDC release the HTTP-based listeners only support the unicast and multicast
datagram communication, but bidirectional connectivity is quite easily achievable
by pairing two unicast connections with mutually reversed client and listener roles. 
</p>
        <p>
A special variation of the bi-directional socket communication mode is 'Direct Connect'.
The 'Direct Connect' NAT traversal technology is capable of negotiating direct end-to-end
socket connections between arbitrary endpoints even if both endpoints are located
behind NAT devices and Firewalls. Using Direct Connect you can start connections through
the Relay and 'Direct Connect' will negotiate the most direct possible connectivity
route between the two parties and once the route is established the connection will
be upgraded to the direct connection – without information loss. 
</p>
        <p>
With these connectivity options, the Relay can provide public, bi-directional connectivity
to mostly any service irrespective of whether the hosting machine is located behind
a NAT or whether the Firewalls layered up towards the public network don't allow inbound
traffic. The automatic mapping into the <em>Naming</em> system means that the service
also gains a public address and the service can, on demand, be automatically published
into the <em>Service Registry</em> to make the service discoverable. 
</p>
        <p>
In addition to providing NAT and Firewall traversal and discoverability the delegation
of the public network endpoint into the Relay provides a service with a number of
additional key advantages that are beneficial even if NAT traversal or discoverability
are not a problem you need to solve: 
</p>
        <ul style="MARGIN-LEFT: 37pt">
          <li>
The Relay functions as a "demilitarized zone" that is isolated from the service's
environment and takes on all external network traffic, filtering out unwanted traffic. 
</li>
          <li>
The Relay anonymizes the listener and therefore effectively hides all details about
the network location of the listener thus reducing the potential attack surface of
the listening service to a minimum. 
</li>
          <li>
The Relay is integrated with the <a href="http://www.microsoft.com/azure/accesscontrol.mspx"><em>Access
Control</em> Service</a> and can require clients to authenticate and be authorized
at the Relay before they can connect through to the listening service. This authorization
gate is enabled by default for all connections and can be selectively turned off if
the application wants to perform its own authentication and authorization. 
</li>
        </ul>
        <p>
These points are important to consider in case you are worried about the fact that
the Relay service provides Firewall traversal. Firewalls are a means to prevent undesired
foreign access to networked resources – the Relay provides a very similar function
but does so on an endpoint-by-endpoint basis and provides an authentication and authorization
mechanism on the network path as well. 
</p>
        <p>
If your applications are already built on the .NET Framework and your services are
built using the Windows Communication Foundation (WCF) it's often just a matter of
changing your application's configuration settings to have your services listen on
the Relay instead on the local machine. 
</p>
        <p>
The Microsoft.ServiceBus client framework provides a set of WCF bindings that are
very closely aligned with the WCF bindings available in the .NET Framework 3.5. If
you are using the <em>NetTcpBinding</em> in your application you switch to the <em>NetTcpRelayBinding</em>,
the BasicHttpBinding maps to the <em>BasicHttpRelayBinding</em>, and the <em>WebHttpBinding</em> has
its equivalent in the <em>WebHttpRelayBinding</em>. The key difference between the
standards WCF bindings and their Relay counterparts is that they establish a listener
in the cloud instead of listening locally. 
</p>
        <p>
All WS-Security and WS-ReliableMessaging scenarios that are supported by the standard
bindings are fully supported through the Relay. Transport-level message protection
using HTTPS or SSL-protected TCP connections is supported as well. 
</p>
        <p>
If the listener chooses to rely on WS-Security to perform its own authentication and
authorization instead of using the security gate built into the Relay, the HTTP-based
Relay bindings' policy projection is indeed identical to their respective standard
binding counterparts which means that client components can readily use the standard
.NET Framework 3.5 bindings (and other WS-* stacks such as Sun Microsystems' Metro
Extensions for the Java JAX-WS framework). 
</p>
        <p>
If you prefer RESTful services over SOAP services, you can build them on the <em>WebHttpRelayBinding</em> using
the WCF Web programming model introduced in the .NET Framework 3.5. The Relay knows
how to route SOAP 1.1, SOAP 1.2 messages and arbitrary HTTP requests transparently. 
</p>
        <p>
The <em>NetEventRelayBinding</em> doesn't have an exact counterpart in the standard
bindings. This binding provides access to the multicast publish/subscribe capability
in the Relay. Using this binding, clients act as event publishers and listeners act
as subscribers. An event-topic is represented by an agreed-upon name in the naming
system. There can be any number of publishers and any number of subscribers that use
the respective named rendezvous point in the Relay. Listeners can subscribe independent
of whether a publisher currently maintains an open connection and publishers can publish
messages irrespective of how many listeners are currently active – including zero.
The result is a very easy to use lightweight one-way publish/subscribe event distribution
mechanism that doesn't require any particular setup or management. 
</p>
        <p>
The discussion of the close alignment between the Relay's .NET programming experience
and the standard .NET Framework shouldn't imply that the Relay requires the use of
the .NET Framework. Microsoft is working with community partners to provide immediate
and native Relay support for the Java and Ruby platforms of which initial releases
will be available at or shortly after PDC with more language and platform support
lined up in the pipeline. 
</p>
        <p>
The Relay provides connectivity options that allow you build bidirectional communication
links for peer-to-peer communication, allows making select endpoints securely and
publicly reachable without having to open up the Firewall floodgates, and provides
a cloud-based pub/sub event bus that permits your application to distribute events
at Internet scale. I could start enumerating scenarios at this point, but it seems
like a safe bet that you can already think of some. 
</p>
        <p>
Find out more here: 
<br /><a href="http://www.microsoft.com/azure/default.mspx">http://www.microsoft.com/azure/default.mspx</a><br /><a href="http://www.microsoft.com/azure/servicebus.mspx">http://www.microsoft.com/azure/servicebus.mspx</a></p>
        <p>
 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=92d78bee-2cfd-4a29-95ab-c5abb9b905e7" />
      </body>
      <title>Azure: Microsoft .NET Service Bus</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,92d78bee-2cfd-4a29-95ab-c5abb9b905e7.aspx</guid>
      <link>http://vasters.com/clemensv/2008/10/28/Azure+Microsoft+NET+Service+Bus.aspx</link>
      <pubDate>Tue, 28 Oct 2008 04:56:51 GMT</pubDate>
      <description>&lt;p&gt;
According to recent traffic studies, the BitTorrent protocol is now responsible for
roughly half of all Internet traffic. That's a lot of sharing of personal photos,
self-sung songs, and home videos. Half! Next to text messaging, Instant Messaging
applications are the social lifeline for our teenagers these days – so much that the
text messaging and IM lingo is starting to become a natural part of the colloquial
vocabulary everywhere. Apple's TV, Microsoft's Xbox 360, and Netflix are shaking up
the video rental market by delivering streamed or downloadable high-quality video
and streams on YouTube have become the new window on the world. Gamers from around
the world are meeting in photorealistic virtual online worlds to compete in races,
rake in all the gold, or blast their respective Avatars into tiny little pieces. 
&lt;/p&gt;
&lt;p&gt;
What does all of that have to do with Web 2.0? Very little. While it's indisputable
that the Web provides the glue between many of those experiences, the majority of
all Internet traffic and very many of the most interesting Internet applications depend
on bi-directional, peer-to-peer connectivity. 
&lt;/p&gt;
&lt;p&gt;
These familiar consumer examples have even more interesting counterparts in the business
and industrial space. Industrial machinery has ever increasing remote management capabilities
that allow complete remote automation, reprogramming, and reconfiguration. Security
and environment surveillance systems depend on thousands of widely distributed, remotely
controlled cameras and other sensors that sit on street poles, high up on building
walls, or somewhere in the middle of a forest. Terrestrial and satellite-based mobile
wireless technologies make it possible to provide some form of digital connectivity
to almost any place on Earth, but making an array of devices addressable and reachable
so that they can be integrated into and controlled by a federated, distributed business
solution that can leverage Internet scale and reach remains incredibly difficult. 
&lt;/p&gt;
&lt;p&gt;
The primary obstacle to creating pervasive connectivity is that we have run out of
IPv4 addresses. There is no mere threat of running out, we're already done. The IPv4
space is practically saturated and it's really only network address translation (NAT)
that permits the Internet to grow any further. The shortage is already causing numerous
ISPs to move customers behind NATs and not to provide them with public IP address
leases any longer. Getting a static public IP address (let alone a range) is getting
really difficult. IPv6 holds the promise of making each device (or even every general-purpose
computer) uniquely addressable again, but pervasive IPv6 adoption that doesn't require
the use of transitional (and constraining) tunneling protocols will still take many
years. 
&lt;/p&gt;
&lt;p&gt;
The second major obstacle is security. Since the open network is a fairly dangerous
place these days and corporate network environments are often und unfortunately not
much better, the use of Firewalls has become ubiquitous and almost all incoming traffic
is blocked by default on the majority of computers these days. That's great for keeping
the bad guys out, but not so great for everything else – especially not for applications
requiring bi-directional connectivity between peers. 
&lt;/p&gt;
&lt;p&gt;
Since these constraints are obviously well-known and understood there is a range of
workarounds. In home networking environments the firewall and NAT issues are often
dealt with by selectively allowing applications to open inbound ports on the local
and network router firewalls using technologies like UPnP or by opening and forwarding
port by ways of manual configuration. Dynamic DNS services help with making particular
machines discoverable even if the assigned IP address keeps changing. The problem
with those workarounds is that they realistically only ever work for the simplest
home networking scenarios and, if they do work, the resulting security threat situation
is quite scary. The reality is that the broadly deployed Internet infrastructure is
optimized for the Web: clients make outbound requests, publicly discoverable and reachable
servers respond. 
&lt;/p&gt;
&lt;p&gt;
If your application requires bi-directional connectivity you effectively have two
choices: Either you bet on the available workarounds and live with the consequences
(as BitTorrent does) or you build and operate some form of Relay service for your
application. A Relay service accepts and maintains connections from firewalled and/or
NAT-ed clients and routes messages between them. Practically all chat, instant messaging,
video conferencing, VoIP, and multiplayer gaming applications and many other popular
Internet applications depend on some form of Relay service. 
&lt;/p&gt;
&lt;p&gt;
The challenge with Relay services is that they are incredibly hard to build in a fashion
that they can provide Internet scale where they need to route between thousands or
even millions of connections as the large Instant Messaging networks do. And once
you have a Relay that can support such scale it is incredibly expensive to operate.
So expensive in fact that the required investments and the resulting operational costs
are entirely out of reach for the vast majority of software companies. The connectivity
challenge is a real innovation blocker and represents a significant entry barrier. 
&lt;/p&gt;
&lt;p&gt;
The good news is that Microsoft .NET &lt;em&gt;Service Bus&lt;/em&gt; provides a range of bidirectional,
peer-to-peer connectivity options including relayed communication. You don't have
to build your own or run your own; you can use this Building Block instead. The &lt;em&gt;.NET
Service Bus&lt;/em&gt; covers four logical feature areas: Naming, Registry, Connectivity,
and Eventing. 
&lt;/p&gt;
&lt;h4&gt;Naming 
&lt;/h4&gt;
&lt;p&gt;
The Internet's Domain Name System (DNS) is a naming system primarily optimized for
assigning names and roles to hosts. The registration records either provide a simple
association of names and IP addresses or a more granular association of particular
protocol roles (such as identifying domain's mail server) with an IP address. In either
case, the resolution of the DNS model occurs at the IP address level and that is very
coarse grained. Since it is IP address centric, a DNS registration requires a public
IP address. Systems behind NAT can't play. Even though Dynamic DNS services can provide
names to systems that do have a public IP address, relying on DNS means for most ISP
customers that the entire business site or home is identified by a single DNS host
entry with dozens or hundreds of hosts sitting behind the NAT device. 
&lt;/p&gt;
&lt;p&gt;
If you want to uniquely name individual hosts behind NATs, differentiate between individual
services on hosts, or want to name services based on host-independent criteria such
as the name of a user or tenant, the DNS system isn't an ideal fit. 
&lt;/p&gt;
&lt;p&gt;
The .NET &lt;em&gt;Service Bus&lt;/em&gt; &lt;em&gt;Naming&lt;/em&gt; system is a forest of (theoretically)
infinite-depth, federated naming trees. The &lt;em&gt;Naming&lt;/em&gt; system maintains an independent
naming tree for each tenant's solution scope and it's up to the application how it
wants to shape its tree. 'Solution' is a broad term in this context meant to describe
a .NET &lt;em&gt;Service Bus&lt;/em&gt; tenant – on the customer side, a &lt;em&gt;Service Bus&lt;/em&gt; application
scope may map to dozens of different on-site applications and hundreds of application
instances. 
&lt;/p&gt;
&lt;p&gt;
Any path through the naming tree has a projection that directly maps to a URI. 
&lt;/p&gt;
&lt;p&gt;
Let's construct an example to illustrate this: You design a logistics system for a
trucking company where you need to route information to service instances at particular
sites. The application scope is owned by your client, 'ContosoTrucks' which has a
number of logistics centers where they want to deploy the application. Your application
is called 'Shipping' and the endpoints through which the shipping orders are received
at the individual sites are named 'OrderManagement'. The canonical URI projection
of the mapping of New York's order management application endpoint instance into the &lt;em&gt;ServiceBus&lt;/em&gt; &lt;em&gt;Naming &lt;/em&gt;system
is&lt;br&gt;
&lt;strong&gt;http://servicebus.windows.net/services/contoso/NewYork/Shipping/OrderManagement/ &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The significant difference from DNS naming is that the identification of services
and endpoints moves from the host portion of the URI to the path portion and becomes
entirely host-agnostic. The DNS name identifies the scope and the entry point for
accessing the naming tree. That also means that the path portion of the URI represent
a potentially broadly distributed federation of services in the &lt;em&gt;Naming&lt;/em&gt; service,
while the path portion of a 'normal' URI typically designates a collocated set of
resources. 
&lt;/p&gt;
&lt;p&gt;
There is no immediate access API for the &lt;em&gt;Naming &lt;/em&gt;system itself. Instead, access
to the &lt;em&gt;Naming&lt;/em&gt; system is provided through the overlaid &lt;em&gt;Service Registry&lt;/em&gt;. 
&lt;/p&gt;
&lt;h4&gt;Service Registry 
&lt;/h4&gt;
&lt;p&gt;
The &lt;em&gt;Service Registry&lt;/em&gt; allows publishing service endpoint references (URIs
or WS-Addressing EPRs) into the &lt;em&gt;Naming&lt;/em&gt; system and to discover services that
have been registered. 
&lt;/p&gt;
&lt;p&gt;
The primary access mechanism for the Service Registry is based on the Atom Publishing
Protocol (APP) allowing clients to publish URIs or EPRs by sending a simple HTTP PUT
request with an Atom 1.0 'item' to any name in the naming tree. It's removed by sending
an HTTP DELETE request to the same name. There is no need to explicitly manage names
– names are automatically created and deleted as you create or delete service registry
entries. 
&lt;/p&gt;
&lt;p&gt;
Service discovery is done by navigating the naming hierarchy, which is accessible
through a nested tree of Atom 1.0 feeds whose master-feed is located at http://servicebus.windows.net/services/[solution]/.
Any publicly registered service is accessible through the feed at the respective location. 
&lt;/p&gt;
&lt;p&gt;
In addition to the Atom Publishing Protocol, the Service Registry also supports publishing,
accessing, and removing endpoint references using WS-Transfer and the &lt;em&gt;Relay&lt;/em&gt; service
will automatically manage its endpoints in the Service Registry without requiring
any additional steps. 
&lt;/p&gt;
&lt;p&gt;
The Service Registry is an area that will see quite significant further additions
over the next few milestones including support for service categorization, search
across the hierarchy, and support for additional high-fidelity discovery protocols. 
&lt;/p&gt;
&lt;h4&gt;Connectivity 
&lt;/h4&gt;
&lt;p&gt;
The core of the connectivity feature area of the &lt;em&gt;.NET Service Bus&lt;/em&gt; is a scalable,
general-purpose Relay service. The Relay's communication fabric supports unicast and
multicast datagram distribution, connection-oriented bi-directional socket communication
and request-response messaging. 
&lt;/p&gt;
&lt;p&gt;
Towards listening services the Relay takes on the same role as operating-system provided
listeners such as Windows' HTTP.SYS. Instead of listening for HTTP requests locally,
a relayed HTTP service establishes an HTTP listener endpoint inside the cloud-based
Relay and clients send requests to that cloud-based listener from where they are forwarded
to the listening service. 
&lt;/p&gt;
&lt;p&gt;
The connection between the listener and the Relay is always initiated from the listener
side. In most connection modes (there are some exceptions that we'll get to) the listener
initiates a secured outbound TCP socket connection into the Relay, authenticates,
and then tells the Relay at which place in the naming tree it wants to start listening
and what type of listener should be established. 
&lt;/p&gt;
&lt;p&gt;
Since a number of tightly managed networking environments block outbound socket connections
and only permit outbound HTTP traffic, the socket based listeners are complemented
by an HTTP-based multiplexing polling mechanism that builds on a cloud-based message
buffer. In the PDC release the HTTP-based listeners only support the unicast and multicast
datagram communication, but bidirectional connectivity is quite easily achievable
by pairing two unicast connections with mutually reversed client and listener roles. 
&lt;/p&gt;
&lt;p&gt;
A special variation of the bi-directional socket communication mode is 'Direct Connect'.
The 'Direct Connect' NAT traversal technology is capable of negotiating direct end-to-end
socket connections between arbitrary endpoints even if both endpoints are located
behind NAT devices and Firewalls. Using Direct Connect you can start connections through
the Relay and 'Direct Connect' will negotiate the most direct possible connectivity
route between the two parties and once the route is established the connection will
be upgraded to the direct connection – without information loss. 
&lt;/p&gt;
&lt;p&gt;
With these connectivity options, the Relay can provide public, bi-directional connectivity
to mostly any service irrespective of whether the hosting machine is located behind
a NAT or whether the Firewalls layered up towards the public network don't allow inbound
traffic. The automatic mapping into the &lt;em&gt;Naming&lt;/em&gt; system means that the service
also gains a public address and the service can, on demand, be automatically published
into the &lt;em&gt;Service Registry&lt;/em&gt; to make the service discoverable. 
&lt;/p&gt;
&lt;p&gt;
In addition to providing NAT and Firewall traversal and discoverability the delegation
of the public network endpoint into the Relay provides a service with a number of
additional key advantages that are beneficial even if NAT traversal or discoverability
are not a problem you need to solve: 
&lt;/p&gt;
&lt;ul style="MARGIN-LEFT: 37pt"&gt;
&lt;li&gt;
The Relay functions as a "demilitarized zone" that is isolated from the service's
environment and takes on all external network traffic, filtering out unwanted traffic. 
&lt;li&gt;
The Relay anonymizes the listener and therefore effectively hides all details about
the network location of the listener thus reducing the potential attack surface of
the listening service to a minimum. 
&lt;li&gt;
The Relay is integrated with the &lt;a href="http://www.microsoft.com/azure/accesscontrol.mspx"&gt;&lt;em&gt;Access
Control&lt;/em&gt;&amp;nbsp;Service&lt;/a&gt; and can require clients to authenticate and be authorized
at the Relay before they can connect through to the listening service. This authorization
gate is enabled by default for all connections and can be selectively turned off if
the application wants to perform its own authentication and authorization. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
These points are important to consider in case you are worried about the fact that
the Relay service provides Firewall traversal. Firewalls are a means to prevent undesired
foreign access to networked resources – the Relay provides a very similar function
but does so on an endpoint-by-endpoint basis and provides an authentication and authorization
mechanism on the network path as well. 
&lt;/p&gt;
&lt;p&gt;
If your applications are already built on the .NET Framework and your services are
built using the Windows Communication Foundation (WCF) it's often just a matter of
changing your application's configuration settings to have your services listen on
the Relay instead on the local machine. 
&lt;/p&gt;
&lt;p&gt;
The Microsoft.ServiceBus client framework provides a set of WCF bindings that are
very closely aligned with the WCF bindings available in the .NET Framework 3.5. If
you are using the &lt;em&gt;NetTcpBinding&lt;/em&gt; in your application you switch to the &lt;em&gt;NetTcpRelayBinding&lt;/em&gt;,
the BasicHttpBinding maps to the &lt;em&gt;BasicHttpRelayBinding&lt;/em&gt;, and the &lt;em&gt;WebHttpBinding&lt;/em&gt; has
its equivalent in the &lt;em&gt;WebHttpRelayBinding&lt;/em&gt;. The key difference between the
standards WCF bindings and their Relay counterparts is that they establish a listener
in the cloud instead of listening locally. 
&lt;/p&gt;
&lt;p&gt;
All WS-Security and WS-ReliableMessaging scenarios that are supported by the standard
bindings are fully supported through the Relay. Transport-level message protection
using HTTPS or SSL-protected TCP connections is supported as well. 
&lt;/p&gt;
&lt;p&gt;
If the listener chooses to rely on WS-Security to perform its own authentication and
authorization instead of using the security gate built into the Relay, the HTTP-based
Relay bindings' policy projection is indeed identical to their respective standard
binding counterparts which means that client components can readily use the standard
.NET Framework 3.5 bindings (and other WS-* stacks such as Sun Microsystems' Metro
Extensions for the Java JAX-WS framework). 
&lt;/p&gt;
&lt;p&gt;
If you prefer RESTful services over SOAP services, you can build them on the &lt;em&gt;WebHttpRelayBinding&lt;/em&gt; using
the WCF Web programming model introduced in the .NET Framework 3.5. The Relay knows
how to route SOAP 1.1, SOAP 1.2 messages and arbitrary HTTP requests transparently. 
&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;NetEventRelayBinding&lt;/em&gt; doesn't have an exact counterpart in the standard
bindings. This binding provides access to the multicast publish/subscribe capability
in the Relay. Using this binding, clients act as event publishers and listeners act
as subscribers. An event-topic is represented by an agreed-upon name in the naming
system. There can be any number of publishers and any number of subscribers that use
the respective named rendezvous point in the Relay. Listeners can subscribe independent
of whether a publisher currently maintains an open connection and publishers can publish
messages irrespective of how many listeners are currently active – including zero.
The result is a very easy to use lightweight one-way publish/subscribe event distribution
mechanism that doesn't require any particular setup or management. 
&lt;/p&gt;
&lt;p&gt;
The discussion of the close alignment between the Relay's .NET programming experience
and the standard .NET Framework shouldn't imply that the Relay requires the use of
the .NET Framework. Microsoft is working with community partners to provide immediate
and native Relay support for the Java and Ruby platforms of which initial releases
will be available at or shortly after PDC with more language and platform support
lined up in the pipeline. 
&lt;/p&gt;
&lt;p&gt;
The Relay provides connectivity options that allow you build bidirectional communication
links for peer-to-peer communication, allows making select endpoints securely and
publicly reachable without having to open up the Firewall floodgates, and provides
a cloud-based pub/sub event bus that permits your application to distribute events
at Internet scale. I could start enumerating scenarios at this point, but it seems
like a safe bet that you can already think of some. 
&lt;/p&gt;
&lt;p&gt;
Find out more here: 
&lt;br&gt;
&lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;http://www.microsoft.com/azure/default.mspx&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.microsoft.com/azure/servicebus.mspx"&gt;http://www.microsoft.com/azure/servicebus.mspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=92d78bee-2cfd-4a29-95ab-c5abb9b905e7" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,92d78bee-2cfd-4a29-95ab-c5abb9b905e7.aspx</comments>
      <category>Talks</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=e59f4a38-8e07-401a-b291-3ab4a561a2ae</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,e59f4a38-8e07-401a-b291-3ab4a561a2ae.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,e59f4a38-8e07-401a-b291-3ab4a561a2ae.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=e59f4a38-8e07-401a-b291-3ab4a561a2ae</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier today I hopefully gave a somewhat reasonable, simple answer to the question
"<a href="http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx">What
is a Claim?</a>" Let's try the same with "Token":
</p>
        <p>
In the WS-* security world, "Token" is really just a another name the security
geniuses decided to use for "Handy package for all sorts of security
stuff". The most popular type of token is the <a href="http://en.wikipedia.org/wiki/SAML">SAML</a> (just
say "samel") token. If the ladies and gentlemen designing and writing security platform
infrastructure and frameworks are doing a good job you might want to know about the
existence of such a thing, but otherwise be blissfully ignorant of all the gory details. 
</p>
        <p>
Tokens are meant to be a thing that you need to know about in much the same way you
need to know about ... ummm... rebate coupons you can cut out of your local newspaper
or all those funny books that you get in the mail. I have really no idea how the accounting
works behind the scenes between the manufacturers and the stores, but it really doesn't
interest me much, either. What matters to me is that we get $4 off that jumbo pack
of diapers and we go through a lot of those these days with a 9 month old baby here
at home. We cut out the coupon, present it at the store, four bucks saved. Works for
me.
</p>
        <p>
A token is the same kind of deal. You go to some (security) service, get a token,
and present that token to some other service. The other service takes a good look
at the token and figures whether it 'trusts' the token issuer and might then
do some further inspection; if all is well you get four bucks off. Or you get
to do the thing you want to do at the service. The latter is more likely, but I liked
the idea for a moment.
</p>
        <p>
Remember when I mentioned the surprising fact that <strong>people lie</strong> from
time to time when I wrote about <a href="http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx">claims</a>?
Well, that's where tokens come in. The security stuff in a token is there to keep
people honest and to make '<a href="http://dictionary.reference.com/search?q=assertion">assertions</a>'
about claims. The security dudes and dudettes will say "Err, that's not the whole
story", but for me it's good enough. It's actually pretty common (that'll be
their objection) that there are tokens that don't carry any claims and where
the security service effectively says "whoever brings this token is a fine person;
they are ok to get in". It's like having a really close buddy relationship with the
boss of the nightclub when you are having troubles with the monsters guarding the
door. I'm getting a bit ahead of myself here, though.
</p>
        <p>
In the post about claims I claimed that "I am authorized to approve corporate
acquisitions with a transaction volume of up to $5Bln". That's a pretty obvious lie.
If there was such a thing as a one-click shopping button for companies on some Microsoft
Intranet site (there isn't, don't get any ideas) and I were to push it, I surely
should not be authorized to execute the transaction. The imaginary "just
one click and you own Xigg" button would surely have some sort of authorization
mechanism on it. 
</p>
        <p>
I don't know what Xigg is assumed to be worth these days, but there is actually be
a second authorization gate to check. I might indeed be authorized to do one-click
shopping for corporate acquisitions, but even with my made-up $5Bln limit claim, Xigg
may just be worth more that I'm claiming I'm authorized to approve. I digress.
</p>
        <p>
How would the one-click-merger-approval service be secured? It would expect some sort
of token that absolutely, positively asserts that my claim "I am authorized to approve corporate
acquisitions with a transaction volume of up to $5Bln" is truthful and the one-click-merger-approval
service would have to absolutely trust the security service that is making that
assertion. The resulting token that I'm getting from the security service would contain
the claim as an attribute of the assertion and that assertion would be signed and
encrypted in mysterious (for me) yet very secure and interoperable ways, so that I
can't tamper with it as much as I look at the token while having it in hands.
</p>
        <p>
The service receiving the token is the only one able to crack the token (I'll get
to that point in a later post) and look at its internals and the asserted attributes.
So what if I were indeed authorized to spend a bit of Microsoft's reserves
and I were trying to acquire Xigg at the touch of a button and, for some reason I
wouldn't understand, the valuation were outside my acquisition limit? That's
the service's job. It'd look at my claim, understand that I can't spend more than
$5Bln and say "nope!" - and it would likely send email to SteveB under the covers.
Trouble.
</p>
        <p>
Bottom line: For a client application, a token is a collection of opaque (and
mysterious) security stuff. The token may contain an assertion (saying "yep,
that's actually true") about a claim or a set of claims that I am making. I shouldn't
have to care about the further details unless I'm writing a service and I'm interested
in some deeper inspection of the claims that have been asserted. I will
get to that.
</p>
        <p>
Before that, I notice that I talked quite a bit about some sort of "security service"
here. Next post...
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e59f4a38-8e07-401a-b291-3ab4a561a2ae" />
      </body>
      <title>What is a Token?</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,e59f4a38-8e07-401a-b291-3ab4a561a2ae.aspx</guid>
      <link>http://vasters.com/clemensv/2008/04/03/What+Is+A+Token.aspx</link>
      <pubDate>Thu, 03 Apr 2008 06:10:36 GMT</pubDate>
      <description>&lt;p&gt;
Earlier today I hopefully gave a somewhat reasonable, simple answer to the question
"&lt;a href="http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx"&gt;What
is a Claim?&lt;/a&gt;" Let's try the same with "Token":
&lt;/p&gt;
&lt;p&gt;
In the WS-* security world, "Token" is really just a&amp;nbsp;another name the security
geniuses&amp;nbsp;decided to use&amp;nbsp;for "Handy package&amp;nbsp;for all sorts of security
stuff". The most popular type of token is the &lt;a href="http://en.wikipedia.org/wiki/SAML"&gt;SAML&lt;/a&gt; (just
say "samel") token. If the ladies and gentlemen designing and writing security platform
infrastructure and frameworks are doing a good job you might want to know about the
existence of such a thing, but otherwise be blissfully ignorant of all the gory details. 
&lt;/p&gt;
&lt;p&gt;
Tokens are meant to be a thing that you need to know about in much the same way you
need to know about ... ummm... rebate coupons you can cut out of your local newspaper
or all those funny books that you get in the mail. I have really no idea how the accounting
works behind the scenes between the manufacturers and the stores, but it really doesn't
interest me much, either. What matters to me is that we get $4 off that jumbo pack
of diapers and we go through a lot of those these days with a 9 month old baby here
at home. We cut out the coupon, present it at the store, four bucks saved. Works for
me.
&lt;/p&gt;
&lt;p&gt;
A token is the same kind of deal. You go to some (security) service, get a token,
and present that token to some other service. The other service takes a good look
at the token and figures whether it 'trusts' the token issuer and&amp;nbsp;might then
do some further inspection; if all is well you get four bucks off. Or&amp;nbsp;you get
to do the thing you want to do at the service. The latter is more likely, but I liked
the idea for a moment.
&lt;/p&gt;
&lt;p&gt;
Remember when I mentioned the surprising fact that &lt;strong&gt;people lie&lt;/strong&gt; from
time to time when I wrote about &lt;a href="http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx"&gt;claims&lt;/a&gt;?
Well, that's where tokens come in. The security stuff in a token is there to keep
people honest and to make '&lt;a href="http://dictionary.reference.com/search?q=assertion"&gt;assertions&lt;/a&gt;'
about claims. The security dudes and dudettes will say "Err, that's not the whole
story", but for me it's good enough.&amp;nbsp;It's actually pretty common (that'll be
their objection) that there are&amp;nbsp;tokens that don't carry any claims and where
the security service effectively says "whoever brings this token is a fine person;
they are ok to get in". It's like having a really close buddy relationship with the
boss of the nightclub when you are having troubles with the monsters guarding the
door. I'm getting a bit ahead of myself here, though.
&lt;/p&gt;
&lt;p&gt;
In the post about claims I claimed that "I am authorized to approve&amp;nbsp;corporate
acquisitions with a transaction volume of up to $5Bln". That's a pretty obvious lie.
If there was such a thing as a one-click shopping button for companies on some Microsoft
Intranet site (there isn't, don't get any ideas) and I were to push it, I&amp;nbsp;surely
should&amp;nbsp;not be authorized to execute the transaction.&amp;nbsp;The imaginary "just
one click and you&amp;nbsp;own Xigg" button would surely have some sort of authorization
mechanism on it. 
&lt;/p&gt;
&lt;p&gt;
I don't know what Xigg is assumed to be worth these days, but there is actually be
a second authorization gate to check. I might indeed be authorized to do one-click
shopping for corporate acquisitions, but even with my made-up $5Bln limit claim, Xigg
may just be worth more that I'm claiming I'm authorized to approve. I digress.
&lt;/p&gt;
&lt;p&gt;
How would the one-click-merger-approval service be secured? It would expect some sort
of token that absolutely, positively asserts that my claim "I am authorized to approve&amp;nbsp;corporate
acquisitions with a transaction volume of up to $5Bln" is truthful and&amp;nbsp;the one-click-merger-approval
service would have to absolutely trust the security service that&amp;nbsp;is making that
assertion. The resulting token that I'm getting from the security service would contain
the claim as an attribute of the assertion and that assertion would be signed and
encrypted in mysterious (for me) yet very secure and interoperable ways, so that I
can't tamper with it as much as I look at the token while having it in hands.
&lt;/p&gt;
&lt;p&gt;
The service receiving the token is the only one able to crack the token (I'll get
to that point in a later post) and look at its internals and the asserted attributes.
So what if I were indeed authorized to&amp;nbsp;spend&amp;nbsp;a bit of&amp;nbsp;Microsoft's&amp;nbsp;reserves
and I were trying to acquire Xigg at the touch of a button and, for some reason I
wouldn't understand,&amp;nbsp;the valuation were outside my acquisition limit? That's
the service's job. It'd look at my claim, understand that I can't spend more than
$5Bln and say "nope!" - and it would likely send email to SteveB under the covers.
Trouble.
&lt;/p&gt;
&lt;p&gt;
Bottom line: For a client application,&amp;nbsp;a token is a collection of opaque (and
mysterious) security stuff.&amp;nbsp;The token may contain&amp;nbsp;an assertion (saying "yep,
that's actually true") about a&amp;nbsp;claim or a set of claims that I am making. I shouldn't
have to care about the further details unless I'm writing a service and I'm interested
in some deeper&amp;nbsp;inspection of the claims that have been asserted.&amp;nbsp;I will
get to that.
&lt;/p&gt;
&lt;p&gt;
Before that, I notice that I talked quite a bit about some sort of "security service"
here. Next post...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e59f4a38-8e07-401a-b291-3ab4a561a2ae" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,e59f4a38-8e07-401a-b291-3ab4a561a2ae.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/CardSpace</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=6efdfc92-27ac-4d51-8aa1-f187eba098d0</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=6efdfc92-27ac-4d51-8aa1-f187eba098d0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you ask any search engine "What is a Claim?" and you mean the sort of claim used in
the WS-* security space, you'll likely find an answer somewhere, but that answer
is just as likely buried in a sea of complex terminology that is only really comprehensible
if you have already wrapped your head around the details of the WS-* security model.
I would have thought that by now there would be a simple and not too technical explanation
of the concept that's easy to find on the Web, but I haven't really had success finding
one.  
</p>
        <p>
So "What is a Claim?" It's really simple.
</p>
        <p>
A <strong>claim</strong> is just a simple statement like "I am Clemens Vasters", or
"I am over 21 years of age", or "I am a Microsoft employee", or "I work in the Connected
Systems Division", or "I am authorized to approve corporate acquisitions with
a transaction volume of up to $5Bln". A <strong>claim set</strong> is just a bundle
of such claims. 
</p>
        <p>
When I walk up to a service with some client program and want to do something on the
service that requires authorization, the client program sends a claim set
along with the request. For the client to know what claims to send along, the
service lets it know about its requirements in its <strong>policy</strong>. 
</p>
        <p>
When a request comes in, this imaginary (U.S.) service looks at the request
knowing <em>"I'm a service for an online game  promoting alcoholic
beverages!". </em>It then it looks at the claim set, finds the <em>"I am over
21 years of age"</em> claim and thinks <em>"Alright, I think we got that covered"</em>. 
</p>
        <p>
The service didn't really care who was trying to get at the service. And it shouldn't.
To cover the liquor company's legal behind, they only need to know that you are over
21. They don't really need to know (and you probably don't want them to know) who is
talking to them. From the client's perspective that's a good thing, because the
client is now in a position to refuse giving out (m)any clues about the
user's identity and only provide the exact data needed to pass the authorization
gate. Mind that the claim isn't the date of birth for that exact reason. The claim
just says "over 21".
</p>
        <p>
Providing control over what claims are being sent to a service (I'm lumping websites,
SOAP, and REST services all in the same bucket here) is one of the key reasons
why Windows CardSpace exists, by the way. The service asks for a set of claims,
you get to see what is being asked for, and it's ultimately your personal, interactive decision
to provide or refuse to provide that information. 
</p>
        <p>
The only problem with relying on simple statements (claims) of that sort is that <strong>people
lie</strong>. When you go to the <a href="http://www.jackdaniels.com/">Jack Daniel's</a> website,
you are asked to enter your date of birth before you can proceed. In reality, it's
any date you like and an 10-year old kid is easily smart enough to figure that out. 
</p>
        <p>
All that complex security stuff is mostly there to keep people honest. Next time ...
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6efdfc92-27ac-4d51-8aa1-f187eba098d0" />
      </body>
      <title>What is a Claim?</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx</guid>
      <link>http://vasters.com/clemensv/2008/04/02/What+Is+A+Claim.aspx</link>
      <pubDate>Wed, 02 Apr 2008 20:20:43 GMT</pubDate>
      <description>&lt;p&gt;
If you ask any search engine "What is a Claim?" and you mean the sort of claim used&amp;nbsp;in
the WS-* security space, you'll&amp;nbsp;likely find an answer somewhere, but that answer
is just as likely buried in a sea of complex terminology that is only really comprehensible
if you have already wrapped your head around the details of the WS-* security model.
I would have thought that by now there would be a simple and not too technical explanation
of the concept that's easy to find on the Web, but I haven't really had success finding
one.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
So "What is a Claim?" It's really simple.
&lt;/p&gt;
&lt;p&gt;
A &lt;strong&gt;claim&lt;/strong&gt; is just a simple statement like "I am Clemens Vasters", or
"I am over 21 years of age", or "I am a Microsoft employee", or "I work in the Connected
Systems Division", or "I am authorized to approve&amp;nbsp;corporate acquisitions with
a transaction volume of up to $5Bln". A &lt;strong&gt;claim set&lt;/strong&gt; is just a bundle
of such claims. 
&lt;/p&gt;
&lt;p&gt;
When I walk up to a service with some client program and want to do something on the
service that requires authorization,&amp;nbsp;the client program&amp;nbsp;sends a claim set
along with the request.&amp;nbsp;For the client to know what claims to send along, the
service&amp;nbsp;lets it know about its requirements in&amp;nbsp;its&amp;nbsp;&lt;strong&gt;policy&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
When a request comes in, this imaginary (U.S.) service&amp;nbsp;looks at&amp;nbsp;the request
knowing &lt;em&gt;"I'm a&amp;nbsp;service&amp;nbsp;for an online game&amp;nbsp; promoting&amp;nbsp;alcoholic
beverages!". &lt;/em&gt;It then it looks at the claim set,&amp;nbsp;finds the &lt;em&gt;"I am over
21 years of age"&lt;/em&gt; claim and&amp;nbsp;thinks &lt;em&gt;"Alright, I think we got that covered"&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;
The service&amp;nbsp;didn't really care who was trying to get at the service. And it shouldn't.
To cover the liquor company's legal behind, they only need to know that you are over
21. They don't really need to know (and you probably don't want them to know) who&amp;nbsp;is
talking to them.&amp;nbsp;From the client's perspective that's&amp;nbsp;a good thing, because&amp;nbsp;the
client is now in a position to&amp;nbsp;refuse giving out&amp;nbsp;(m)any clues about the
user's identity and only provide the exact data needed&amp;nbsp;to pass the authorization
gate. Mind that the claim isn't the date of birth for that exact reason. The claim
just says "over 21".
&lt;/p&gt;
&lt;p&gt;
Providing control over what claims are being sent to a service (I'm lumping websites,
SOAP, and REST services all in the same bucket here) is&amp;nbsp;one of the&amp;nbsp;key reasons
why Windows CardSpace exists, by the way. The service&amp;nbsp;asks for a set of claims,
you get to&amp;nbsp;see what is being asked for, and it's ultimately your personal, interactive&amp;nbsp;decision
to provide or refuse to provide that information. 
&lt;/p&gt;
&lt;p&gt;
The only problem with relying on simple statements (claims)&amp;nbsp;of that sort is that &lt;strong&gt;people
lie&lt;/strong&gt;.&amp;nbsp;When you go to the &lt;a href="http://www.jackdaniels.com/"&gt;Jack Daniel's&lt;/a&gt; website,
you are asked to enter your date of birth before you can proceed. In reality, it's
any date you like and an 10-year old kid is easily smart enough to figure that out. 
&lt;/p&gt;
&lt;p&gt;
All that complex security stuff is mostly there to keep people honest. Next time ...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6efdfc92-27ac-4d51-8aa1-f187eba098d0" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,6efdfc92-27ac-4d51-8aa1-f187eba098d0.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/CardSpace</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=798bbf5b-f9f9-45b9-87ba-f6a30c359af9</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=798bbf5b-f9f9-45b9-87ba-f6a30c359af9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="justify">
A flock of pigs has been doing aerobatics high up over Microsoft Campus in Redmond
in the past three weeks. Neither City of Redmond nor Microsoft spokespeople returned
calls requesting comments in time for this article. An Microsoft worker who requested
anonymity and has seen the pigs flying overhead commented that "they are as good as
the Blue Angels at Seafair, just funnier" and "they seem to circle over building 42
a lot, but I wouldn't know why". 
</p>
        <p>
In related news ... 
</p>
        <p align="justify">
We wrapped up the BizTalk Services "R11" CTP this last Thursday and put the latest
SDK release up on <a href="http://labs.biztalk.net/">http://labs.biztalk.net/</a>.
As you may or may not know, "BizTalk Services" is the codename for Microsoft's cloud-based
Identity and Connectivity services - with a significant set of further services in
the pipeline. The R11 release is a major milestone for the data center side of BizTalk
Services, but we've also added several new client-facing features, especially on the
Identity services. You can now authenticate using a certificate in addition to username
and CardSpace authentication, we have enabled support for 3rd party managed CardSpace
cards, and there is extended support for claims based authorization. 
</p>
        <p>
Now the surprising bit:
</p>
        <p align="justify">
Only about an hour before we locked down the SDK on Thursday, we checked a sample
into the samples tree that has a rather unusual set of prerequisites for something
coming out of Microsoft: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p align="justify">
Runtime: <a href="http://java.sun.com/javaee/">Java EE 5</a> on <a href="https://glassfish.dev.java.net/">Sun
Glassfish v2</a> + <a href="https://metro.dev.java.net/">Sun WSIT/Metro</a> (JAX-WS
extensions), Tool: <a href="http://netbeans.org">Netbeans 6.0 IDE</a>. 
</p>
        </blockquote>
        <p align="justify">
The sample shows how to use the BizTalk Services Identity Security Token Service (STS)
to secure the communication between a Java client and a Java service providing federated
authentication and claims-based authorization.
</p>
        <p align="justify">
The sample, which you can find in <em>./Samples/OtherPlatforms/StandaloneAccessControl/JavaEE5</em> once
you installed the SDK, is a pure Java sample not requiring any of our bits on either
the service or client side. The interaction with our services is purely happening
on the wire. 
</p>
        <p align="justify">
If you are a "Javahead", it might seem odd that we're shipping this sample inside
a Windows-only MSI installer and I will agree that that's odd. It's simply a function
of timing and the point in time when we knew that we could get it done (some more
on that below). For the next BizTalk Services SDK release I expect there to be an
additional .jar file for the Java samples.
</p>
        <p align="justify">
It's important to note that this isn't just a thing we did as a one-time thing and
because we could. We have done a significant amount of work on the backend protocol
implementations to start opening up a very broad set of scenarios on the BizTalk Services
Connectivity services for platforms other than .NET. We already have a set of additional
Java EE samples lined up for when we enable that functionality on the backend. However,
since getting security and identity working is a prerequisite for making all other
services work, that's where we started. There'll be more and there'll be more platform
and language choice than Java down the road. 
</p>
        <p align="justify">
Just to be perfectly clear: Around here we strongly believe that .NET and the Windows
Communication Foundation in particular is the most advanced platform to build services,
irrespective of whether they are of the WS-* or REST variety. If you care about my
personal opinion, I'll say that several months of research into the capabilities of
other platforms has only reaffirmed that belief for me and I don't even need to put
a Microsoft hat on to say that. 
</p>
        <p align="justify">
But we recognize and respect that there are a great variety of individual reasons
why people might not be using .NET and WCF. The obvious one is "platform". If you
run on Linux or Unix and/or if your deployment target is a Java Application Server,
then your platform is very likely not .NET. It's something else. If that's your
world, we still think that our services are something that's useful for your applications
and we want to show you why. And it is absolutely not enough for us to say "here is
the wire protocol documentation; go party!". Only Code is Truth.
</p>
        <p align="justify">
I'm also writing "Only Code is Truth" also because we've found - perhaps not too surprisingly
- that there is a significant difference between reading and implementing the WS-*
specs and having things actually work. And here I get to the point where a round of
public "Thank You" is due:
</p>
        <p align="justify">
The Metro team over at Sun Microsystems has made a very significant contribution to
making this all work. Before we started making changes to accommodate Java, there
would have been very little hope for anyone to get this seemingly simple
scenario to work. We had to make quite a few changes even though our service did follow
the specs. 
</p>
        <p align="justify">
While we were adjusting our backend STS accordingly, the Sun Metro team worked on
a set of issues that we identified on their end (with fantastic turnaround times)
and worked those into their public nightly builds. The Sun team also 'promoted' a
nightly build of Metro 1.2 to a semi-permanent <a href="https://metro.dev.java.net/servlets/ProjectDocumentList?folderID=8958&amp;expandFolder=8958&amp;folderID=7636">download
location</a> (the first 1.2 build that got that treatment), because it is the build
tested to successfully interop with our SDK release, even though that build is known
to have some regressions for some of their other test scenarios. As they work towards
wrapping up their 1.2 release and fix those other bugs, we’ll continue to test and
talk to help that the interop scenarios keep working. 
</p>
        <p align="justify">
As a result of this collaboration, Metro 1.2 is going to be a better and more interoperable
release for the Sun's customers and the greater Java community and BizTalk Services
as well as our future identity products will be better and more interoperable, too.
Win-Win. Thank you, Sun.
</p>
        <p align="justify">
As a goodie, I put some code into the Java sample that might be useful even if you
don't even care about our services. Since configuring the Java certificate stores
for standalone applications can be really painful, I added some simple code that's
using a week-old feature of the latest Metro 1.2 bits that allows configuring the
Truststores/Keystores dynamically and pull the stores from the client's .jar at runtime.
The code also has an authorization utility class that shows how to get and evaluate
claims on the service side by pulling the SAML token out of the context and pulling
the correct attributes from the token.
</p>
        <p>
Have fun.
</p>
        <p>
[By the way, this is not an April Fool's joke, in case you were wondering]<br /></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=798bbf5b-f9f9-45b9-87ba-f6a30c359af9" />
      </body>
      <title>BizTalk Services "R11" CTP Comes with a Surprise</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</guid>
      <link>http://vasters.com/clemensv/2008/03/31/BizTalk+Services+R11+CTP+Comes+With+A+Surprise.aspx</link>
      <pubDate>Mon, 31 Mar 2008 17:56:40 GMT</pubDate>
      <description>&lt;p align=justify&gt;
A flock of pigs has been doing aerobatics high up over Microsoft Campus in Redmond
in the past three weeks. Neither City of Redmond nor Microsoft spokespeople returned
calls requesting comments in time for this article. An Microsoft worker who requested
anonymity and has seen the pigs flying overhead commented that "they are as good as
the Blue Angels at Seafair, just funnier" and "they seem to circle over building 42
a lot, but I wouldn't know why". 
&lt;/p&gt;
&lt;p&gt;
In related news ... 
&lt;/p&gt;
&lt;p align=justify&gt;
We wrapped up the BizTalk Services "R11" CTP this last Thursday and put the latest
SDK release up on &lt;a href="http://labs.biztalk.net/"&gt;http://labs.biztalk.net/&lt;/a&gt;.
As you may or may not know, "BizTalk Services" is the codename for Microsoft's cloud-based
Identity and Connectivity services - with a significant set of further services in
the pipeline. The R11 release is a major milestone for the data center side of BizTalk
Services, but we've also added several new client-facing features, especially on the
Identity services. You can now authenticate using a certificate in addition to username
and CardSpace authentication, we have enabled support for 3rd party managed CardSpace
cards, and there is extended support for claims based authorization. 
&lt;/p&gt;
&lt;p&gt;
Now the surprising bit:
&lt;/p&gt;
&lt;p align=justify&gt;
Only about an hour before we locked down the SDK on Thursday, we checked a sample
into the samples tree that has a rather unusual set of prerequisites for something
coming out of Microsoft: 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p align=justify&gt;
Runtime: &lt;a href="http://java.sun.com/javaee/"&gt;Java EE 5&lt;/a&gt; on &lt;a href="https://glassfish.dev.java.net/"&gt;Sun
Glassfish v2&lt;/a&gt; + &lt;a href="https://metro.dev.java.net/"&gt;Sun WSIT/Metro&lt;/a&gt; (JAX-WS
extensions), Tool: &lt;a href="http://netbeans.org"&gt;Netbeans 6.0 IDE&lt;/a&gt;. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p align=justify&gt;
The sample shows how to use the BizTalk Services Identity Security Token Service (STS)
to secure the communication between a Java client and a Java service providing federated
authentication and claims-based authorization.
&lt;/p&gt;
&lt;p align=justify&gt;
The sample, which you can find in &lt;em&gt;./Samples/OtherPlatforms/StandaloneAccessControl/JavaEE5&lt;/em&gt; once
you installed the SDK, is a pure Java sample not requiring any of our bits on either
the service or client side. The interaction with our services is purely happening
on the wire. 
&lt;/p&gt;
&lt;p align=justify&gt;
If you are a "Javahead", it might seem odd that we're shipping this sample inside
a Windows-only MSI installer and I will agree that that's odd. It's simply a function
of timing and the point in time when we knew that we could get it done (some more
on that below). For the next BizTalk Services SDK release I expect there to be an
additional .jar file for the Java samples.
&lt;/p&gt;
&lt;p align=justify&gt;
It's important to note that this isn't just a thing we did as a one-time thing and
because we could. We have done a significant amount of work on the backend protocol
implementations to start opening up a very broad set of scenarios on the BizTalk Services
Connectivity services for platforms other than .NET. We already have a set of additional
Java EE samples lined up for when we enable that functionality on the backend. However,
since getting security and identity working is a prerequisite for making all other
services work, that's where we started. There'll be more and there'll be more platform
and language choice than Java down the road. 
&lt;/p&gt;
&lt;p align=justify&gt;
Just to be perfectly clear: Around here we strongly believe that .NET and the Windows
Communication Foundation in particular is the most advanced platform to build services,
irrespective of whether they are of the WS-* or REST variety. If you care about my
personal opinion, I'll say that several months of research into the capabilities of
other platforms has only reaffirmed that belief for me and I don't even need to put
a Microsoft hat on to say that. 
&lt;/p&gt;
&lt;p align=justify&gt;
But we recognize and respect that there are a great variety of individual reasons
why people might not be using .NET and WCF. The obvious one is "platform". If you
run on Linux or Unix and/or if your deployment target is a Java Application Server,
then your platform is very likely not .NET. It's something else.&amp;nbsp;If that's your
world, we still think that our services are something that's useful for your applications
and we want to show you why. And it is absolutely not enough for us to say "here is
the wire protocol documentation; go party!". Only Code is Truth.
&lt;/p&gt;
&lt;p align=justify&gt;
I'm also writing "Only Code is Truth" also because we've found - perhaps not too surprisingly
- that there is a significant difference between reading and implementing the WS-*
specs and having things actually work. And here I get to the point where a round of
public "Thank You" is due:
&lt;/p&gt;
&lt;p align=justify&gt;
The Metro team over at Sun Microsystems has made a very significant contribution to
making this all work. Before we started making changes to accommodate Java, there
would have been&amp;nbsp;very little&amp;nbsp;hope for anyone to get this seemingly simple
scenario to work. We had to make quite a few changes even though our service did follow
the specs. 
&lt;/p&gt;
&lt;p align=justify&gt;
While we were adjusting our backend STS accordingly, the Sun Metro team worked on
a set of issues that we identified on their end (with fantastic turnaround times)
and worked those into their public nightly builds. The Sun team also 'promoted' a
nightly build of Metro 1.2 to a semi-permanent &lt;a href="https://metro.dev.java.net/servlets/ProjectDocumentList?folderID=8958&amp;amp;expandFolder=8958&amp;amp;folderID=7636"&gt;download
location&lt;/a&gt; (the first 1.2 build that got that treatment), because it is the build
tested to successfully interop with our SDK release, even though that build is known
to have some regressions for some of their other test scenarios. As they work towards
wrapping up their 1.2 release and fix those other bugs, we’ll continue to test and
talk to help that the interop scenarios keep working. 
&lt;/p&gt;
&lt;p align=justify&gt;
As a result of this collaboration, Metro 1.2 is going to be a better and more interoperable
release for the Sun's customers and the greater Java community and BizTalk Services
as well as our future identity products will be better and more interoperable, too.
Win-Win. Thank you, Sun.
&lt;/p&gt;
&lt;p align=justify&gt;
As a goodie, I put some code into the Java sample that might be useful even if you
don't even care about our services. Since configuring the Java certificate stores
for standalone applications can be really painful, I added some simple code that's
using a week-old feature of the latest Metro 1.2 bits that allows configuring the
Truststores/Keystores dynamically and pull the stores from the client's .jar at runtime.
The code also has an authorization utility class that shows how to get and evaluate
claims on the service side by pulling the SAML token out of the context and pulling
the correct attributes from the token.
&lt;/p&gt;
&lt;p&gt;
Have fun.
&lt;/p&gt;
&lt;p&gt;
[By the way, this is not an April Fool's joke, in case you were wondering]&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=798bbf5b-f9f9-45b9-87ba-f6a30c359af9" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,798bbf5b-f9f9-45b9-87ba-f6a30c359af9.aspx</comments>
      <category>Architecture</category>
      <category>IT Strategy</category>
      <category>Technology</category>
      <category>Technology/CardSpace</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=3cc59a29-0e1a-487d-8b45-10ea559ef30d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3cc59a29-0e1a-487d-8b45-10ea559ef30d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3cc59a29-0e1a-487d-8b45-10ea559ef30d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3cc59a29-0e1a-487d-8b45-10ea559ef30d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We're all sinners. Lots of the authentication mechanisms on the Web are not even "best
effort", but rather just cleartext transmissions of usernames and passwords that are
easily intercepted and not secure at all. We're security sinners by using them and
even more so by allowing this. However, the reality is that there's very
likely more authentication on the Web done in an insecure fashion and in cleartext
than using any other mechanism. So if you are building WCF apps and you decide "that's
good enough" what to do?
</p>
        <p>
WCF is - rightfully - taking a pretty hard stance on these matters. If you try
to use any of the more advanced in-message authN and authZ mechnanisms such
as the <a href="http://msdn2.microsoft.com/en-us/library/ms731049.aspx">integration
with the ASP.NET membership</a>/<a href="http://msdn2.microsoft.com/en-us/library/aa702542.aspx">role
provider</a> models, you'll find yourself in security territory and our security designers
took very good care that you are not creating a config that results in the cleartext
transmission of credentials. And for that you'll need certificates and you'll
also find that it requires full trust (even in 3.5) to use that level of robust on-wire
security. 
</p>
        <p>
dasBlog has (we're sinners, too) a stance on authentication that's about as lax
as everyone else's stance in blog-land. There are not many MetaWeblog API
endpoints running over https (as they rather should) that I've seen. 
</p>
        <p>
So what I need for a bare minimum dasBlog install where the user isn't willing to
get an https certificate for their site is a very simple, <strong>consciously insecure</strong>,
bare-bones authentication and authorization mechanism for WCF services that uses the
ASP.NET membership/role model (dasBlog will use that model as we switch to the .NET
Framework 3.5 later this year). The It also needs to get completely out of the way
when the service is configured with any real AuthN/AuthZ mechanism. 
</p>
        <p>
So here's a behavior (some C# 3.0 syntax, but easy to fix) that you can add to channel
factories (client) and service endpoints (server) that will do just that. <strong>If
you care about confidentiality of credentials on the wire don't use it</strong>. For
this to work, you need to put the behavior on both ends. The behavior
will do nothing (as intended) when the binding isn't the <em>BasicHttpBinding</em> with <em>BasicHttpSecurityMode.None</em>).
The header will not show up in WSDL. 
</p>
        <p>
On the client, you simply add the behavior and otherwise set the credentials
as you would usually do for UserName authentication. This makes sure that the client
code stays compatible when you upgrade the wire protocol to a more secure
(yet still username-based) binding via config.
</p>
        <font size="4">
          <p>
          </p>
        </font>
        <font face="Courier New">
          <font color="#2b91af">MyClient</font> remoteService
= <font color="#0000ff">new</font><font color="#2b91af">MyClient</font>();<br />
remoteService.ChannelFactory.Endpoint.Behaviors.Add(<font color="#0000ff">new</font><font color="#2b91af">SimpleAuthenticationBehavior</font>());<br />
remoteService.ClientCredentials.UserName.UserName = <font color="#a31515">"admin"</font>;<br />
remoteService.ClientCredentials.UserName.Password = <font color="#a31515">"!adminadmin"</font>;</font>
        <p>
On the server, you just configure your ASP.NET membership and role database. With
that in place, you can even use role-based security attributes or any other authorization
mechnanism you are accustomed to in ASP.NET. Just as on the client, the behavior
goes out of the way and gives way for the "real thing" once you turn on security.
</p>
        <p>
          <span style="FONT-SIZE: 8pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">using</span>
          <span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">
            <font color="#000000"> System.Runtime.Serialization;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.ServiceModel;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.ServiceModel.Channels;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.ServiceModel.Description;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.ServiceModel.Dispatcher;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.ServiceModel.Security;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.Threading;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.Web.Security;<br /></font>
            <span style="COLOR: blue">using</span>
            <font color="#000000"> System.Xml.Serialization;<br /><br /></font>
            <span style="COLOR: blue">namespace</span>
            <font color="#000000"> dasBlog.Storage<br />
{<br /><span style="mso-spacerun: yes">    </span>[</font>
            <span style="COLOR: #2b91af">DataContract</span>
            <font color="#000000">(Namespace
= </font>
            <span style="COLOR: #2b91af">Names</span>
            <font color="#000000">.DataContractNamespace)]<br /></font>
            <font color="#000000">
              <span style="mso-spacerun: yes">   </span>
              <span style="mso-spacerun: yes"> </span>
            </font>
            <span style="COLOR: blue">class</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">SimpleAuthenticationHeader<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">    </span>{<br /><span style="mso-spacerun: yes">        </span>[</font>
            <span style="COLOR: #2b91af">DataMember</span>
            <font color="#000000">]<br /><span style="mso-spacerun: yes">        </span></font>
            <span style="COLOR: blue">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">string</span>
            <font color="#000000"> UserName;<br /><span style="mso-spacerun: yes">        </span>[</font>
            <span style="COLOR: #2b91af">DataMember</span>
            <font color="#000000">]<br /><span style="mso-spacerun: yes">        </span></font>
            <span style="COLOR: blue">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">string</span>
            <font color="#000000"> Password;<br /><span style="mso-spacerun: yes">    </span>}<br /><br /><span style="mso-spacerun: yes">    </span></font>
            <span style="COLOR: blue">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">class</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">SimpleAuthenticationBehavior</span>
            <font color="#000000"> : </font>
            <span style="COLOR: #2b91af">IEndpointBehavior<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">    </span>{<br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">        </span>#region</span>
            <font color="#000000"> IEndpointBehavior
Members<br /><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"> AddBindingParameters(</font>
            <span style="COLOR: #2b91af">ServiceEndpoint</span>
            <font color="#000000"> endpoint, <br />
                                         </font>
            <span style="COLOR: #2b91af">BindingParameterCollection</span>
            <font color="#000000"> bindingParameters)<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">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">void</span>
            <font color="#000000"> ApplyClientBehavior(</font>
            <span style="COLOR: #2b91af">ServiceEndpoint</span>
            <font color="#000000"> endpoint, <br />
                                        </font>
            <span style="COLOR: #2b91af">ClientRuntime</span>
            <font color="#000000"> clientRuntime)<br /><span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span></font>
            <span style="COLOR: blue">if</span>
            <font color="#000000"> (endpoint.Binding </font>
            <span style="COLOR: blue">is</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">BasicHttpBinding</span>
            <font color="#000000"> &amp;&amp;<br /><span style="mso-spacerun: yes">                </span>((</font>
            <span style="COLOR: #2b91af">BasicHttpBinding</span>
            <font color="#000000">)endpoint.Binding).Security.Mode
== </font>
            <span style="COLOR: #2b91af">BasicHttpSecurityMode</span>
            <font color="#000000">.None
)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">var</span>
            <font color="#000000"> credentials
= endpoint.Behaviors.Find&lt;</font>
            <span style="COLOR: #2b91af">ClientCredentials</span>
            <font color="#000000">&gt;();<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">if</span>
            <font color="#000000"> (credentials
!= </font>
            <span style="COLOR: blue">null</span>
            <font color="#000000"> &amp;&amp; credentials.UserName
!= </font>
            <span style="COLOR: blue">null</span>
            <font color="#000000"> &amp;&amp; credentials.UserName.UserName
!= </font>
            <span style="COLOR: blue">null</span>
            <font color="#000000">)<br /><span style="mso-spacerun: yes">                </span>{<br /><span style="mso-spacerun: yes">                    </span>clientRuntime.MessageInspectors.Add(</font>
            <span style="COLOR: blue">new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">ClientMessageInspector</span>
            <font color="#000000">(credentials.UserName));<span style="mso-spacerun: yes">                    </span><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">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">void</span>
            <font color="#000000"> ApplyDispatchBehavior(</font>
            <span style="COLOR: #2b91af">ServiceEndpoint</span>
            <font color="#000000"> endpoint,
System.ServiceModel.Dispatcher.</font>
            <span style="COLOR: #2b91af">EndpointDispatcher</span>
            <font color="#000000"> endpointDispatcher)<br /><span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span></font>
            <span style="COLOR: blue">if</span>
            <font color="#000000"> (endpoint.Binding </font>
            <span style="COLOR: blue">is</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">BasicHttpBinding</span>
            <font color="#000000"> &amp;&amp;<br /><span style="mso-spacerun: yes">                </span>((</font>
            <span style="COLOR: #2b91af">BasicHttpBinding</span>
            <font color="#000000">)endpoint.Binding).Security.Mode
== </font>
            <span style="COLOR: #2b91af">BasicHttpSecurityMode</span>
            <font color="#000000">.None)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span>endpointDispatcher.DispatchRuntime.MessageInspectors.Add(</font>
            <span style="COLOR: blue">new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">DispatchMessageInspector</span>
            <font color="#000000">());<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">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">void</span>
            <font color="#000000"> Validate(</font>
            <span style="COLOR: #2b91af">ServiceEndpoint</span>
            <font color="#000000"> endpoint)<br /><span style="mso-spacerun: yes">        </span>{<br /><span style="mso-spacerun: yes">            </span><br /><span style="mso-spacerun: yes">        </span>}<br /><br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">        </span>#endregion<br /><br /></span>
            <span style="mso-spacerun: yes">
              <font color="#000000">        </font>
            </span>
            <span style="COLOR: blue">class</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">DispatchMessageInspector</span>
            <font color="#000000"> : </font>
            <span style="COLOR: #2b91af">IDispatchMessageInspector<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">        </span>{<br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">            </span>#region</span>
            <font color="#000000"> IDispatchMessageInspector
Members<br /><br /><span style="mso-spacerun: yes">            </span></font>
            <span style="COLOR: blue">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">object</span>
            <font color="#000000"> AfterReceiveRequest(</font>
            <span style="COLOR: blue">ref</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">Message</span>
            <font color="#000000"> request, </font>
            <span style="COLOR: #2b91af">IClientChannel</span>
            <font color="#000000"> channel, </font>
            <span style="COLOR: #2b91af">InstanceContext</span>
            <font color="#000000"> instanceContext)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">int</span>
            <font color="#000000"> headerIndex
= request.Headers.FindHeader(</font>
            <span style="COLOR: #a31515">"simpleAuthenticationHeader"</span>
            <font color="#000000">, </font>
            <span style="COLOR: #a31515">"http://dasblog.info/2007/08/security"</span>
            <font color="#000000">);<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">if</span>
            <font color="#000000"> (headerIndex
&gt;= 0)<br /><span style="mso-spacerun: yes">                </span>{<br /><span style="mso-spacerun: yes">                    </span></font>
            <span style="COLOR: blue">var</span>
            <font color="#000000"> header
= request.Headers.GetHeader&lt;</font>
            <span style="COLOR: #2b91af">SimpleAuthenticationHeader</span>
            <font color="#000000">&gt;(headerIndex);<br /><span style="mso-spacerun: yes">                    </span>request.Headers.RemoveAt(headerIndex);<br /><span style="mso-spacerun: yes">                    </span></font>
            <span style="COLOR: blue">if</span>
            <font color="#000000"> ( </font>
            <span style="COLOR: #2b91af">Membership</span>
            <font color="#000000">.ValidateUser(header.UserName,
header.Password) )<br /><span style="mso-spacerun: yes">                    </span>{<br /><span style="mso-spacerun: yes">                        </span></font>
            <span style="COLOR: blue">var</span>
            <font color="#000000"> identity
= </font>
            <span style="COLOR: blue">new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">FormsIdentity</span>
            <font color="#000000">(</font>
            <span style="COLOR: blue">new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">FormsAuthenticationTicket</span>
            <font color="#000000">(header.UserName, </font>
            <span style="COLOR: blue">false</span>
            <font color="#000000">,
15));<br /><span style="mso-spacerun: yes">                        </span></font>
            <span style="COLOR: #2b91af">Thread</span>
            <font color="#000000">.CurrentPrincipal
= </font>
            <span style="COLOR: blue">new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">RolePrincipal</span>
            <font color="#000000">(identity);<br /><span style="mso-spacerun: yes">                    </span>}<br /><span style="mso-spacerun: yes">                </span>}<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">return</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">null</span>
            <font color="#000000">;<br /><span style="mso-spacerun: yes">            </span>}<br /><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"> BeforeSendReply(</font>
            <span style="COLOR: blue">ref</span>
            <font color="#000000"> System.ServiceModel.Channels.</font>
            <span style="COLOR: #2b91af">Message</span>
            <font color="#000000"> reply, </font>
            <span style="COLOR: blue">object</span>
            <font color="#000000"> correlationState)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span><br /><span style="mso-spacerun: yes">            </span>}<br /><br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">            </span>#endregion<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">        </span>}<br /><br /><span style="mso-spacerun: yes">        </span></font>
            <span style="COLOR: blue">class</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">ClientMessageInspector</span>
            <font color="#000000"> : </font>
            <span style="COLOR: #2b91af">IClientMessageInspector<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">        </span>{<br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">            </span>#region</span>
            <font color="#000000"> IClientMessageInspector
Members<br /><br /><span style="mso-spacerun: yes">            </span></font>
            <span style="COLOR: #2b91af">UserNamePasswordClientCredential</span>
            <font color="#000000"> creds;<br /><br /><span style="mso-spacerun: yes">            </span></font>
            <span style="COLOR: blue">public</span>
            <font color="#000000"> ClientMessageInspector(</font>
            <span style="COLOR: #2b91af">UserNamePasswordClientCredential</span>
            <font color="#000000"> creds)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span></font>
            <span style="COLOR: blue">this</span>
            <font color="#000000">.creds
= creds;<br /><span style="mso-spacerun: yes">            </span>}<br /><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"> AfterReceiveReply(</font>
            <span style="COLOR: blue">ref</span>
            <font color="#000000"> System.ServiceModel.Channels.</font>
            <span style="COLOR: #2b91af">Message</span>
            <font color="#000000"> reply, </font>
            <span style="COLOR: blue">object</span>
            <font color="#000000"> correlationState)<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">public</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">object</span>
            <font color="#000000"> BeforeSendRequest(</font>
            <span style="COLOR: blue">ref</span>
            <font color="#000000"> System.ServiceModel.Channels.</font>
            <span style="COLOR: #2b91af">Message</span>
            <font color="#000000"> request, </font>
            <span style="COLOR: #2b91af">IClientChannel</span>
            <font color="#000000"> channel)<br /><span style="mso-spacerun: yes">            </span>{<br /><span style="mso-spacerun: yes">                </span>request.Headers.Add(</font>
            <span style="COLOR: #2b91af">MessageHeader</span>
            <font color="#000000">.CreateHeader(</font>
            <span style="COLOR: #a31515">"simpleAuthenticationHeader"</span>
            <font color="#000000">, </font>
            <span style="COLOR: #a31515">
              <a href="http://dasblog.info/2007/08/security">http://dasblog.info/2007/08/security</a>
            </span>
            <font color="#000000">, 
<br /></font>
            <span style="COLOR: blue">                                   
new</span>
            <font color="#000000">
            </font>
            <span style="COLOR: #2b91af">SimpleAuthenticationHeader</span>
            <font color="#000000">{
UserName = creds.UserName, Password = creds.Password }));<br /><span style="mso-spacerun: yes">               </span><span style="mso-spacerun: yes"> </span></font>
            <span style="COLOR: blue">return</span>
            <font color="#000000">
            </font>
            <span style="COLOR: blue">null</span>
            <font color="#000000">;<br /><span style="mso-spacerun: yes">            </span>}<br /><br /></font>
            <span style="COLOR: blue">
              <span style="mso-spacerun: yes">            </span>#endregion<br /></span>
            <font color="#000000">
              <span style="mso-spacerun: yes">        </span>}<br /><span style="mso-spacerun: yes">    </span>}<br />
}</font>
          </span>
        </p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3cc59a29-0e1a-487d-8b45-10ea559ef30d" />
      </body>
      <title>Sin, Sin, Sin: How to do Simple, Webby, and Completely Insecure ASP.NET Membership Authentication and Role Authorization with WCF</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3cc59a29-0e1a-487d-8b45-10ea559ef30d.aspx</guid>
      <link>http://vasters.com/clemensv/2007/08/22/Sin+Sin+Sin+How+To+Do+Simple+Webby+And+Completely+Insecure+ASPNET+Membership+Authentication+And+Role+Authorization+With+WCF.aspx</link>
      <pubDate>Wed, 22 Aug 2007 17:20:05 GMT</pubDate>
      <description>&lt;p&gt;
We're all sinners. Lots of the authentication mechanisms on the Web are not even "best
effort", but rather just cleartext transmissions of usernames and passwords that are
easily intercepted and not secure at all. We're security sinners by using them and
even more so by allowing this.&amp;nbsp;However,&amp;nbsp;the reality is that there's very
likely more authentication on the Web done in an insecure fashion and in&amp;nbsp;cleartext
than using any other mechanism. So if you are building WCF apps and you decide "that's
good enough" what to do?
&lt;/p&gt;
&lt;p&gt;
WCF is - rightfully - taking a pretty hard stance on these matters.&amp;nbsp;If you try
to use any of the&amp;nbsp;more advanced&amp;nbsp;in-message authN and authZ mechnanisms such
as the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms731049.aspx"&gt;integration
with the ASP.NET membership&lt;/a&gt;/&lt;a href="http://msdn2.microsoft.com/en-us/library/aa702542.aspx"&gt;role
provider&lt;/a&gt; models, you'll find yourself in security territory and our security designers
took very good care that you are not creating a config that&amp;nbsp;results in the cleartext
transmission of credentials.&amp;nbsp;And for that you'll need certificates and you'll
also find that it requires full trust (even in 3.5) to use that level of robust on-wire
security. 
&lt;/p&gt;
&lt;p&gt;
dasBlog has (we're sinners, too)&amp;nbsp;a stance on authentication that's about as lax
as everyone else's stance in blog-land.&amp;nbsp;There are not many&amp;nbsp;MetaWeblog API
endpoints running over https (as&amp;nbsp;they rather&amp;nbsp;should) that I've seen.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
So what I need for a bare minimum dasBlog install where the user isn't willing to
get an https certificate for their site is a very simple, &lt;strong&gt;consciously insecure&lt;/strong&gt;,
bare-bones authentication and authorization mechanism for WCF services that uses the
ASP.NET membership/role model (dasBlog will use that model as we switch to the .NET
Framework 3.5 later this year). The It also needs to get completely out of the way
when the service is configured with any real AuthN/AuthZ mechanism. 
&lt;/p&gt;
&lt;p&gt;
So here's a behavior (some C# 3.0 syntax, but easy to fix) that you can add to channel
factories (client) and service endpoints (server) that will do just that. &lt;strong&gt;If
you care about confidentiality of credentials on the wire don't use it&lt;/strong&gt;. For
this to work, you need to put&amp;nbsp;the behavior&amp;nbsp;on both ends.&amp;nbsp;The behavior
will do nothing (as intended) when the binding isn't the &lt;em&gt;BasicHttpBinding&lt;/em&gt; with &lt;em&gt;BasicHttpSecurityMode.None&lt;/em&gt;).
The header will&amp;nbsp;not show up in WSDL. 
&lt;/p&gt;
&lt;p&gt;
On the client, you simply&amp;nbsp;add the behavior and otherwise set the credentials
as you would usually do for UserName authentication. This makes sure that the client
code stays compatible when you upgrade the wire protocol to&amp;nbsp;a&amp;nbsp;more secure
(yet still username-based)&amp;nbsp;binding via config.
&lt;/p&gt;
&lt;font size=4&gt; 
&lt;p&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#2b91af&gt;MyClient&lt;/font&gt;&amp;nbsp;remoteService
= &lt;font color=#0000ff&gt;new&lt;/font&gt; &lt;font color=#2b91af&gt;MyClient&lt;/font&gt;();&lt;br&gt;
remoteService.ChannelFactory.Endpoint.Behaviors.Add(&lt;font color=#0000ff&gt;new&lt;/font&gt; &lt;font color=#2b91af&gt;SimpleAuthenticationBehavior&lt;/font&gt;());&lt;br&gt;
remoteService.ClientCredentials.UserName.UserName = &lt;font color=#a31515&gt;"admin"&lt;/font&gt;;&lt;br&gt;
remoteService.ClientCredentials.UserName.Password = &lt;font color=#a31515&gt;"!adminadmin"&lt;/font&gt;;&lt;/font&gt;&gt;
&lt;p&gt;
On the server, you just configure your ASP.NET membership and role database. With
that in place, you can even use role-based security attributes&amp;nbsp;or any other authorization
mechnanism you are accustomed to in ASP.NET. Just&amp;nbsp;as on the client, the behavior
goes out of the way and gives way for the "real thing" once you turn on security.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; System.Runtime.Serialization;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Description;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Dispatcher;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Security;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Threading;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Web.Security;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Xml.Serialization;&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt;&lt;font color=#000000&gt; dasBlog.Storage&lt;br&gt;
{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;DataContract&lt;/span&gt;&lt;font color=#000000&gt;(Namespace
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Names&lt;/span&gt;&lt;font color=#000000&gt;.DataContractNamespace)]&lt;br&gt;
&lt;/font&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&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;SimpleAuthenticationHeader&lt;br&gt;
&lt;/span&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: #2b91af"&gt;DataMember&lt;/span&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; &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;string&lt;/span&gt;&lt;font color=#000000&gt; UserName;&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: #2b91af"&gt;DataMember&lt;/span&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; &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;string&lt;/span&gt;&lt;font color=#000000&gt; Password;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&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; &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;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;SimpleAuthenticationBehavior&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IEndpointBehavior&lt;br&gt;
&lt;/span&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;/font&gt;&lt;span style="COLOR: blue"&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;#region&lt;/span&gt;&lt;font color=#000000&gt; IEndpointBehavior
Members&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;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; AddBindingParameters(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceEndpoint&lt;/span&gt;&lt;font color=#000000&gt; endpoint,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;BindingParameterCollection&lt;/span&gt;&lt;font color=#000000&gt; bindingParameters)&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;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;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; ApplyClientBehavior(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceEndpoint&lt;/span&gt;&lt;font color=#000000&gt; endpoint,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ClientRuntime&lt;/span&gt;&lt;font color=#000000&gt; clientRuntime)&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;if&lt;/span&gt;&lt;font color=#000000&gt; (endpoint.Binding &lt;/font&gt;&lt;span style="COLOR: blue"&gt;is&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;BasicHttpBinding&lt;/span&gt;&lt;font color=#000000&gt; &amp;amp;&amp;amp;&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;BasicHttpBinding&lt;/span&gt;&lt;font color=#000000&gt;)endpoint.Binding).Security.Mode
== &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;BasicHttpSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None
)&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: blue"&gt;var&lt;/span&gt;&lt;font color=#000000&gt; credentials
= endpoint.Behaviors.Find&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ClientCredentials&lt;/span&gt;&lt;font color=#000000&gt;&amp;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; (credentials
!= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt; &amp;amp;&amp;amp; credentials.UserName
!= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt; &amp;amp;&amp;amp; credentials.UserName.UserName
!= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&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;clientRuntime.MessageInspectors.Add(&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;ClientMessageInspector&lt;/span&gt;&lt;font color=#000000&gt;(credentials.UserName));&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;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;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; ApplyDispatchBehavior(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceEndpoint&lt;/span&gt;&lt;font color=#000000&gt; endpoint,
System.ServiceModel.Dispatcher.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;EndpointDispatcher&lt;/span&gt;&lt;font color=#000000&gt; endpointDispatcher)&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;if&lt;/span&gt;&lt;font color=#000000&gt; (endpoint.Binding &lt;/font&gt;&lt;span style="COLOR: blue"&gt;is&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;BasicHttpBinding&lt;/span&gt;&lt;font color=#000000&gt; &amp;amp;&amp;amp;&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;BasicHttpBinding&lt;/span&gt;&lt;font color=#000000&gt;)endpoint.Binding).Security.Mode
== &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;BasicHttpSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None)&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;endpointDispatcher.DispatchRuntime.MessageInspectors.Add(&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;DispatchMessageInspector&lt;/span&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;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;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; Validate(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceEndpoint&lt;/span&gt;&lt;font color=#000000&gt; endpoint)&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;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;/font&gt;&lt;span style="COLOR: blue"&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;#endregion&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&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;DispatchMessageInspector&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IDispatchMessageInspector&lt;br&gt;
&lt;/span&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;/font&gt;&lt;span style="COLOR: blue"&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;#region&lt;/span&gt;&lt;font color=#000000&gt; IDispatchMessageInspector
Members&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: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt; AfterReceiveRequest(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;ref&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt; request, &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IClientChannel&lt;/span&gt;&lt;font color=#000000&gt; channel, &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;InstanceContext&lt;/span&gt;&lt;font color=#000000&gt; instanceContext)&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: blue"&gt;int&lt;/span&gt;&lt;font color=#000000&gt; headerIndex
= request.Headers.FindHeader(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"simpleAuthenticationHeader"&lt;/span&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"http://dasblog.info/2007/08/security"&lt;/span&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;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (headerIndex
&amp;gt;= 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;&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;var&lt;/span&gt;&lt;font color=#000000&gt; header
= request.Headers.GetHeader&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;SimpleAuthenticationHeader&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;(headerIndex);&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;request.Headers.RemoveAt(headerIndex);&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: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; ( &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Membership&lt;/span&gt;&lt;font color=#000000&gt;.ValidateUser(header.UserName,
header.Password) )&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt;&lt;font color=#000000&gt; identity
= &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;FormsIdentity&lt;/span&gt;&lt;font color=#000000&gt;(&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;FormsAuthenticationTicket&lt;/span&gt;&lt;font color=#000000&gt;(header.UserName, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;&lt;font color=#000000&gt;,
15));&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Thread&lt;/span&gt;&lt;font color=#000000&gt;.CurrentPrincipal
= &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;RolePrincipal&lt;/span&gt;&lt;font color=#000000&gt;(identity);&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;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;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&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;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: 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; BeforeSendReply(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;ref&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt; reply, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt; correlationState)&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;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;/font&gt;&lt;span style="COLOR: blue"&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;#endregion&lt;br&gt;
&lt;/span&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;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;ClientMessageInspector&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IClientMessageInspector&lt;br&gt;
&lt;/span&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;/font&gt;&lt;span style="COLOR: blue"&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;#region&lt;/span&gt;&lt;font color=#000000&gt; IClientMessageInspector
Members&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;UserNamePasswordClientCredential&lt;/span&gt;&lt;font color=#000000&gt; creds;&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: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; ClientMessageInspector(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;UserNamePasswordClientCredential&lt;/span&gt;&lt;font color=#000000&gt; creds)&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: blue"&gt;this&lt;/span&gt;&lt;font color=#000000&gt;.creds
= creds;&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: 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; AfterReceiveReply(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;ref&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt; reply, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt; correlationState)&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;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: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt; BeforeSendRequest(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;ref&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt; request, &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IClientChannel&lt;/span&gt;&lt;font color=#000000&gt; channel)&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;request.Headers.Add(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;MessageHeader&lt;/span&gt;&lt;font color=#000000&gt;.CreateHeader(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"simpleAuthenticationHeader"&lt;/span&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;&lt;a href="http://dasblog.info/2007/08/security"&gt;http://dasblog.info/2007/08/security&lt;/a&gt;&lt;/span&gt;&lt;font color=#000000&gt;, 
&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;SimpleAuthenticationHeader&lt;/span&gt;&lt;font color=#000000&gt;{
UserName = creds.UserName, Password = creds.Password }));&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; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&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;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&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;#endregion&lt;br&gt;
&lt;/span&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; &lt;/span&gt;}&lt;br&gt;
}&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3cc59a29-0e1a-487d-8b45-10ea559ef30d" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3cc59a29-0e1a-487d-8b45-10ea559ef30d.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=9677a491-9037-4b79-baa3-bcf093737957</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,9677a491-9037-4b79-baa3-bcf093737957.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,9677a491-9037-4b79-baa3-bcf093737957.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=9677a491-9037-4b79-baa3-bcf093737957</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>
            <font color="#ff1493">UPDATE:</font> The code has been updated. Ignore this
post and <a href="http://vasters.com/clemensv/PermaLink,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx">go
here</a>.</strong>
        </p>
        <p>
I'm writing lots of code lately. I've rejoined the dasBlog community and I'm
busy writing a prototype for the .NET Framework 3.5 version of dasBlog (we just
released the 2.0 version, see <a href="http://www.dasblog.info/">http://www.dasblog.info/</a>).
</p>
        <p>
One of the goals of the prototype, which we'll eventually merge into the main
codebase once the .NET Framework 3.5 is available at hosting sites is to standardize
on WCF for all non-HTML endpoints. Since lots of the relevant inter-blog and blogging
tool APIs are still based on XML-RPC, that called for an implementation of XML-RPC
on WCF. I've just isolated that code and <a href="http://wcf.netfx3.com/files/folders/creating_and_using_custom_bindings/entry11943.aspx">put
it up on wcf.netfx3.com</a>.
</p>
        <p>
My XML-RPC implementation is a binding with a special encoder and a set of behaviors.
The Service Model programming experience is completely "normal" with no special extension
attributes. That means you can also expose the XML-RPC contracts as SOAP endpoints
with all the advanced WCF bindings and features if you like. 
</p>
        <p>
The binding supports client and service side and is completely config enabled. Here's
a snippet from the MetaWeblog contract:
</p>
        <font size="4">
          <p>
          </p>
        </font>
        <font face="Courier New">[<font color="#2b91af">ServiceContract</font>(Namespace
= <font color="#a31515"><a href="http://www.xmlrpc.com/metaWeblogApi">http://www.xmlrpc.com/metaWeblogApi</a></font>)]<br /><font color="#0000ff">public</font><font color="#0000ff">interface</font><font color="#2b91af">IMetaWeblog</font> :
Microsoft.ServiceModel.Samples.XmlRpc.Contracts.Blogger.</font>
        <font face="Courier New">
          <font color="#2b91af">IBlogger<br /></font>{<br />
   [<font color="#2b91af">OperationContract</font>(Action=<font color="#a31515">"metaWeblog.editPost"</font>)]<br /><font color="#0000ff">   bool</font> metaweblog_editPost(<font color="#0000ff">string</font> postid,<br /><font color="#0000ff">                            
string</font> username,<br /><font color="#0000ff">                             string</font> password,<br /><font color="#2b91af">                             Post</font> post,<br /><font color="#0000ff">                            
bool</font> publish);</font>
        <p>
          <font face="Courier New">   [<font color="#2b91af">OperationContract</font>(Action=<font color="#a31515">"metaWeblog.getCategories"</font>)]<br /><font color="#2b91af">   CategoryInfo</font>[] metaweblog_getCategories(<font color="#0000ff"> string</font> blogid,<br /><font color="#0000ff">                                     
      string</font> username,<br /><font color="#0000ff">                                     
      string</font> password);<br />
    ...<br /></font>
          <font face="Courier New">}</font>
        </p>
        <p>
For your convenience I've included complete Blogger, MetaWeblog, and MovableType
API contracts along with the respective data types in the test application. The test
app is a small in-memory blog that you can use with the blogging function of Word
2007 as a client or some other blogging client for testing. 
</p>
        <p>
Of the other interesting XML-RPC APIs, the <a href="http://www.hixie.ch/specs/pingback/pingback">Pingback
API</a> has the following contract:
</p>
        <p>
          <span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font size="2">
              <font face="Courier New">
                <font color="#000000">
                  <span style="mso-spacerun: yes">    </span>[</font>
                <span style="COLOR: #2b91af">ServiceContract</span>
                <font color="#000000">(Namespace=</font>
                <span style="COLOR: #a31515">"http://www.hixie.ch/specs/pingback/pingback"</span>
              </font>
            </font>
            <font size="2">
              <font face="Courier New">
                <font color="#000000">)]<br /><span style="mso-spacerun: yes">    </span></font>
                <span style="COLOR: blue">public</span>
                <font color="#000000">
                </font>
                <span style="COLOR: blue">interface</span>
                <font color="#000000">
                </font>
              </font>
            </font>
            <span style="COLOR: #2b91af">
              <font size="2" face="Courier New">IPingback<br /></font>
            </span>
            <font size="2">
              <font face="Courier New">
                <font color="#000000">
                  <span style="mso-spacerun: yes">    </span>{<br /><span style="mso-spacerun: yes">        </span>[</font>
                <span style="COLOR: #2b91af">OperationContract</span>
                <font color="#000000">(Action=</font>
                <span style="COLOR: #a31515">"pingback.ping"</span>
              </font>
            </font>
            <font size="2">
              <font face="Courier New">
                <font color="#000000">)]<br /><span style="mso-spacerun: yes">        </span></font>
                <span style="COLOR: blue">string</span>
                <font color="#000000"> ping(</font>
                <span style="COLOR: blue">string</span>
                <font color="#000000"> sourceUri, </font>
                <span style="COLOR: blue">string</span>
              </font>
            </font>
            <font size="2">
              <font face="Courier New">
                <font color="#000000"> targetUri);<br /><span style="mso-spacerun: yes">    </span>}</font>
              </font>
            </font>
          </span>
        </p>
        <p>
          <span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
            <font size="2" face="Verdana">and
the <a href="http://www.xmlrpc.com/weblogsCom">WeblogUpdates API</a> looks like this:</font>
          </span>
        </p>
        <span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes">
          <p style="MARGIN: 0in 0in 10pt" class="MsoNormal">
            <span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes">
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">   
[</font>
                  <span style="COLOR: #2b91af">DataContract</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">]<br /><span style="mso-spacerun: yes">    </span></font>
                  <span style="COLOR: blue">public</span>
                  <font color="#000000">
                  </font>
                  <span style="COLOR: blue">struct</span>
                  <font color="#000000">
                  </font>
                </font>
              </font>
              <span style="COLOR: #2b91af">
                <font size="2" face="Courier New">WeblogUpdatesReply<br /></font>
              </span>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">
                    <span style="mso-spacerun: yes">    </span>{<br /><span style="mso-spacerun: yes">        </span>[</font>
                  <span style="COLOR: #2b91af">DataMember</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">]<br /><span style="mso-spacerun: yes">        </span></font>
                  <span style="COLOR: blue">public</span>
                  <font color="#000000">
                  </font>
                  <span style="COLOR: blue">bool</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000"> flerror;<br /><span style="mso-spacerun: yes">        </span>[</font>
                  <span style="COLOR: #2b91af">DataMember</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">]<br /><span style="mso-spacerun: yes">        </span></font>
                  <span style="COLOR: blue">public</span>
                  <font color="#000000">
                  </font>
                  <span style="COLOR: blue">string</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000"> message;<br /><span style="mso-spacerun: yes">    </span>}<br /><br /><span style="mso-spacerun: yes">    </span>[</font>
                  <span style="COLOR: #2b91af">ServiceContract</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">]<br /><span style="mso-spacerun: yes">    </span></font>
                  <span style="COLOR: blue">public</span>
                  <font color="#000000">
                  </font>
                  <span style="COLOR: blue">interface</span>
                  <font color="#000000">
                  </font>
                </font>
              </font>
              <span style="COLOR: #2b91af">
                <font size="2" face="Courier New">IWeblogUpdates<br /></font>
              </span>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">
                    <span style="mso-spacerun: yes">    </span>{<br /><span style="mso-spacerun: yes">        </span>[</font>
                  <span style="COLOR: #2b91af">OperationContract</span>
                  <font color="#000000">(Action
= </font>
                  <span style="COLOR: #a31515">"weblogUpdates.extendedPing"</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">)]<br /><span style="mso-spacerun: yes">        </span></font>
                  <span style="COLOR: #2b91af">WeblogUpdatesReply</span>
                  <font color="#000000"> ExtendedPing(</font>
                  <span style="COLOR: blue">string</span>
                  <font color="#000000"> weblogName, </font>
                  <span style="COLOR: blue">string</span>
                  <font color="#000000"> weblogUrl, </font>
                  <span style="COLOR: blue">string</span>
                  <font color="#000000"> checkUrl, </font>
                  <span style="COLOR: blue">string</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000"> rssUrl);<br /><span style="mso-spacerun: yes">        </span>[</font>
                  <span style="COLOR: #2b91af">OperationContract</span>
                  <font color="#000000">(Action=</font>
                  <span style="COLOR: #a31515">"weblogUpdates.ping"</span>
                </font>
              </font>
              <font face="Courier New">
                <font size="2">
                  <font color="#000000">)]<br /><span style="mso-spacerun: yes">        </span></font>
                  <span style="COLOR: #2b91af">WeblogUpdatesReply</span>
                  <font color="#000000"> Ping(</font>
                  <span style="COLOR: blue">string</span>
                  <font color="#000000"> weblogName, </font>
                  <span style="COLOR: blue">string</span>
                </font>
              </font>
              <font color="#000000" size="2" face="Courier New"> weblogUrl);<br /><span style="mso-spacerun: yes">    </span>}</font>
            </span>
          </p>
          <p>
          </p>
        </span>I'm expecting some interop bugs since I've done a clean implementation
from the specs, so if you find any please let me know.
<p>
The code is subject to the Microsoft samples license, which means that you can put
it into your (blogging) apps. Enjoy.
</p><img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=9677a491-9037-4b79-baa3-bcf093737957" /></body>
      <title>XML-RPC with WCF</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,9677a491-9037-4b79-baa3-bcf093737957.aspx</guid>
      <link>http://vasters.com/clemensv/2007/08/21/XMLRPC+With+WCF.aspx</link>
      <pubDate>Tue, 21 Aug 2007 07:46:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;&lt;font color=#ff1493&gt;UPDATE:&lt;/font&gt; The code has been updated. Ignore this
post and &lt;a href="http://vasters.com/clemensv/PermaLink,guid,679ca50b-c907-4831-81c4-369ef7b85839.aspx"&gt;go
here&lt;/a&gt;.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I'm writing lots of code&amp;nbsp;lately. I've rejoined the dasBlog community and I'm
busy&amp;nbsp;writing a prototype for the .NET Framework 3.5 version of dasBlog (we just
released the 2.0 version, see &lt;a href="http://www.dasblog.info/"&gt;http://www.dasblog.info/&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
One of the&amp;nbsp;goals of the prototype, which we'll eventually merge into the main
codebase once&amp;nbsp;the .NET Framework 3.5 is available at hosting sites is to standardize
on WCF for all non-HTML endpoints. Since lots of the relevant inter-blog and blogging
tool APIs&amp;nbsp;are still based on XML-RPC, that called for an implementation of XML-RPC
on WCF. I've just isolated that code and &lt;a href="http://wcf.netfx3.com/files/folders/creating_and_using_custom_bindings/entry11943.aspx"&gt;put
it up on wcf.netfx3.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
My XML-RPC implementation is a binding with a special encoder and a set of behaviors.
The Service Model programming experience is completely "normal" with no special extension
attributes. That means you can also expose the XML-RPC contracts as SOAP endpoints
with all the advanced WCF bindings and features if you like. 
&lt;/p&gt;
&lt;p&gt;
The binding&amp;nbsp;supports client and service side and is completely config enabled.&amp;nbsp;Here's
a snippet from the MetaWeblog contract:
&lt;/p&gt;
&lt;font size=4&gt; 
&lt;p&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;[&lt;font color=#2b91af&gt;ServiceContract&lt;/font&gt;(Namespace
= &lt;font color=#a31515&gt;&lt;a href="http://www.xmlrpc.com/metaWeblogApi"&gt;http://www.xmlrpc.com/metaWeblogApi&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;IMetaWeblog&lt;/font&gt; :
Microsoft.ServiceModel.Samples.XmlRpc.Contracts.Blogger.&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#2b91af&gt;IBlogger&lt;br&gt;
&lt;/font&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; [&lt;font color=#2b91af&gt;OperationContract&lt;/font&gt;(Action=&lt;font color=#a31515&gt;"metaWeblog.editPost"&lt;/font&gt;)]&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp; bool&lt;/font&gt; metaweblog_editPost(&lt;font color=#0000ff&gt;string&lt;/font&gt; postid,&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
string&lt;/font&gt; username,&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&lt;/font&gt; password,&lt;br&gt;
&lt;font color=#2b91af&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post&lt;/font&gt; post,&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
bool&lt;/font&gt; publish);&lt;/font&gt;&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp; [&lt;font color=#2b91af&gt;OperationContract&lt;/font&gt;(Action=&lt;font color=#a31515&gt;"metaWeblog.getCategories"&lt;/font&gt;)]&lt;br&gt;
&lt;font color=#2b91af&gt;&amp;nbsp;&amp;nbsp; CategoryInfo&lt;/font&gt;[] metaweblog_getCategories(&lt;font color=#0000ff&gt; string&lt;/font&gt; blogid,&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string&lt;/font&gt; username,&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string&lt;/font&gt; password);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
For your convenience I've included&amp;nbsp;complete Blogger, MetaWeblog, and MovableType
API contracts along with the respective data types in the test application. The test
app is a small in-memory blog that you can use with the blogging function of Word
2007 as a client or some other blogging client for testing. 
&lt;/p&gt;
&lt;p&gt;
Of the other interesting XML-RPC APIs, the &lt;a href="http://www.hixie.ch/specs/pingback/pingback"&gt;Pingback
API&lt;/a&gt; has the following contract:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; 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 face="Courier New"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;&lt;font color=#000000&gt;(Namespace=&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"http://www.hixie.ch/specs/pingback/pingback"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font face="Courier New"&gt;&lt;font color=#000000&gt;)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&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;interface&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;&lt;font size=2 face="Courier New"&gt;IPingback&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font size=2&gt;&lt;font face="Courier New"&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: #2b91af"&gt;OperationContract&lt;/span&gt;&lt;font color=#000000&gt;(Action=&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"pingback.ping"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font face="Courier New"&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; ping(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; sourceUri, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font face="Courier New"&gt;&lt;font color=#000000&gt; targetUri);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt;&lt;font size=2 face=Verdana&gt;and
the &lt;a href="http://www.xmlrpc.com/weblogsCom"&gt;WeblogUpdates API&lt;/a&gt; looks like this:&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes"&gt; 
&lt;p style="MARGIN: 0in 0in 10pt" class=MsoNormal&gt;
&lt;span style="LINE-HEIGHT: 115%; FONT-FAMILY: Consolas; FONT-SIZE: 8pt; mso-bidi-font-family: 'Times New Roman'; mso-no-proof: yes"&gt;&lt;font face="Courier New"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;DataContract&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &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;struct&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;&lt;font size=2 face="Courier New"&gt;WeblogUpdatesReply&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&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: #2b91af"&gt;DataMember&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &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;bool&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; flerror;&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: #2b91af"&gt;DataMember&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &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;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; message;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&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; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &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;interface&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;&lt;font size=2 face="Courier New"&gt;IWeblogUpdates&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&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: #2b91af"&gt;OperationContract&lt;/span&gt;&lt;font color=#000000&gt;(Action
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"weblogUpdates.extendedPing"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WeblogUpdatesReply&lt;/span&gt;&lt;font color=#000000&gt; ExtendedPing(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; weblogName, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; weblogUrl, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; checkUrl, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size=2&gt;&lt;font color=#000000&gt; rssUrl);&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: #2b91af"&gt;OperationContract&lt;/span&gt;&lt;font color=#000000&gt;(Action=&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"weblogUpdates.ping"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WeblogUpdatesReply&lt;/span&gt;&lt;font color=#000000&gt; Ping(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; weblogName, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#000000 size=2 face="Courier New"&gt; weblogUrl);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/span&gt;I'm expecting some interop bugs since I've done a clean implementation from
the specs, so if you find any please let me know.&gt;
&lt;p&gt;
The code is subject to the Microsoft samples license, which means that you can put
it into your (blogging) apps. Enjoy.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=9677a491-9037-4b79-baa3-bcf093737957" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,9677a491-9037-4b79-baa3-bcf093737957.aspx</comments>
      <category>MSDN</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
      <category>Technology/Weblogs</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=64a8caa0-f9c1-4515-82d3-359a95c56954</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=64a8caa0-f9c1-4515-82d3-359a95c56954</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00112345678910111213.jpg" border="0" />Having
an <a href="http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx">Internet
Service Bus</a> up in the cloud is not very entertaining unless there are services
in the bus. Therefore, I built one (and already showed some of the <a href="http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx">code
basics</a>) that’s hopefully fun to play with and will soon share the first version
with you after some scrubbing and pending a few updates to the ISB that will optimize
the authentication process. It’s a 0.1 version and an experiment. The code download
should be ready in the next two weeks, including those adjustments. But you can actually
play with parts of it today without compiling or installing anything. The info is
at the bottom of this post.
</p>
        <p>
To make matters really interesting, this sample not only shows how to plug a service
into the cloud and call it from some Console app, but is a combo of two rather unusual
hosts for WCF services: A Windows Live Messenger Add-In that acts as the server, and
a Windows Vista Sidebar gadget that acts as the client. 
</p>
        <p>
Since the Silicon Valley scene is currently all over <a href="http://www.twitter.com/">Twitter</a> and
clones of Twitter are apparently popping up <a href="http://www.techcrunch.com/2007/05/14/web-2-in-germany-copy-paste-innovation-or-more/">somewhere
every day</a>, I thought I could easily provide fodder to the proponents of the alleged
Microsoft tradition of purely relying on copying other’s ideas and clone them as well
;-)  Well, no, maybe not. This is a bit different. 
</p>
        <p>
          <img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image0021234567891011121314.jpg" border="0" />TweetieBot
is an example of a simple personal service. If you choose to host it, you own it,
you run it, you control it. The data is held nowhere but on your personal machine
and it’s using the BizTalk Services ISB to stick its head up into the cloud and at
a stable endpoint so that its easily reachable for a circle of friends, bridging the
common obstacles of dynamic IPs, firewalls and NAT. No need to use UPnP or open up
ports on your router. If you choose to do so, you can encrypt traffic so that there’s
no chance that anyone looking at our ISB nor anyone else can see the what’s actually
going across the wire. 
</p>
        <p>
Right now, lots of the Web 2.0 world lives on the assumption that everything needs
to live at central places and that community forms around ad-driven hubs. The mainframe
folks had a similar stance in the 70s and 80s and then Personal Computers came along.
The pendulum is always swinging and I have little doubt that it will swing back to
“personal” once more and that the federation of personal services will seriously challenge
the hub model once more.
</p>
        <p>
So what does the sample do? As indicated, TweetieBot is a bot that plugs into a Windows
Live Messenger using a simple Add-In. <a href="http://community.bartdesmet.net/blogs/bart/archive/2006/09/17/4431.aspx">Bart
De Smet</a> has a brilliant summary for how to build such Add-Ins. When the Add-In
is active and someone chats the bot, it answers politely and remembers the chat line,
time and sender. The bird has a leaky long term memory, though. It forgets everything
past the last 40 lines.
</p>
        <p>
Where it gets interesting is that the Add-In can stick three endpoints into the BizTalk
Services ISB:
</p>
        <ul>
          <li>
A Request/Response Web Service that allows retrieving the list of the last 40 (or
less) “tweets” and also allows client to submit tweets programmatically. 
</li>
          <li>
An RSS service that allows (right now) anyone to peek in to the chat log of the last
40 tweets. 
</li>
          <li>
An Event service that allows subscribers to get real-time notifications whenever a
new tweet is recorded.</li>
        </ul>
        <p>
The accompanying Sidebar Gadget, which is implemented <a href="http://blogs.msdn.com/karstenj/archive/2006/10/09/activex-wpf-gadget.aspx">using
WPF</a>, is a client for two of these services. 
</p>
        <p>
          <img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00312345678910.jpg" border="0" /> <img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image00412345.jpg" border="0" />When
you drop the Gadget on the Sidebar, it will prompt for the IM address of the TweetieBot
service you’d like to subscribe to. Once you’ve authenticated at the relay using your
registered Information Card, the gadget will pull and show the current list of Tweets
and subscribe to the Events service for real-time updates. And whenever someone chats
the bot, the Sidebar gadget will immediately show the new entry. So even though the
Gadget lives on some client machine that’s hidden between several layers of firewalls
and behind NAT, it can actually get push-style event notifications through the cloud! 
</p>
        <p>
“How do I send events to clients?” must be one of the most frequent questions that
I’ve been asked about Web Services in the past several years. Well, this is your answer
right here.
</p>
        <p>
While I’m still toying around with the code and the guys on the 1st floor in my building
are doing some tweaks on the ISB infrastructure to make multi-endpoint authentication
simpler, you can already play with the bot and help me a bit: 
</p>
        <p>
Using Windows Live Messenger you can chat (<a href="msnim:chat?contact=TweetieBot@hotmail.com">click
here</a>) <a href="mailto:tweetiebot@hotmail.com">tweetiebot@hotmail.com</a><b>now</b>.
Drop a few lines. If the bot is online (which means that I’m not tinkering with it)
it will reply. Then look at this <a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss/">RSS
feed</a> [1] and you can see what you and everyone else have been telling the bot
recently. Enjoy.
</p>
        <p>
[1] <a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss">http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss</a></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=64a8caa0-f9c1-4515-82d3-359a95c56954" />
      </body>
      <title>TweetieBot - A BizTalk Services Experiment</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/16/TweetieBot+A+BizTalk+Services+Experiment.aspx</link>
      <pubDate>Wed, 16 May 2007 19:33:48 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00112345678910111213.jpg" border=0&gt;Having
an &lt;a href="http://vasters.com/clemensv/PermaLink,guid,842e5373-60c1-4390-b820-00dba8b0cb4c.aspx"&gt;Internet
Service Bus&lt;/a&gt; up in the cloud is not very entertaining unless there are services
in the bus. Therefore, I built one (and already showed some of the &lt;a href="http://vasters.com/clemensv/PermaLink,guid,603e2393-c8de-40dd-b2e9-88f504b44149.aspx"&gt;code
basics&lt;/a&gt;) that’s hopefully fun to play with and will soon share the first version
with you after some scrubbing and pending a few updates to the ISB that will optimize
the authentication process. It’s a 0.1 version and an experiment. The code download
should be ready in the next two weeks, including those adjustments. But you can actually
play with parts of it today without compiling or installing anything. The info is
at the bottom of this post.
&lt;/p&gt;
&lt;p&gt;
To make matters really interesting, this sample not only shows how to plug a service
into the cloud and call it from some Console app, but is a combo of two rather unusual
hosts for WCF services: A Windows Live Messenger Add-In that acts as the server, and
a Windows Vista Sidebar gadget that acts as the client. 
&lt;/p&gt;
&lt;p&gt;
Since the Silicon Valley scene is currently all over &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt; and
clones of Twitter are apparently popping up &lt;a href="http://www.techcrunch.com/2007/05/14/web-2-in-germany-copy-paste-innovation-or-more/"&gt;somewhere
every day&lt;/a&gt;, I thought I could easily provide fodder to the proponents of the alleged
Microsoft tradition of purely relying on copying other’s ideas and clone them as well
;-)&amp;nbsp; Well, no, maybe not. This is a bit different. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image0021234567891011121314.jpg" border=0&gt;TweetieBot
is an example of a simple personal service. If you choose to host it, you own it,
you run it, you control it. The data is held nowhere but on your personal machine
and it’s using the BizTalk Services ISB to stick its head up into the cloud and at
a stable endpoint so that its easily reachable for a circle of friends, bridging the
common obstacles of dynamic IPs, firewalls and NAT. No need to use UPnP or open up
ports on your router. If you choose to do so, you can encrypt traffic so that there’s
no chance that anyone looking at our ISB nor anyone else can see the what’s actually
going across the wire. 
&lt;/p&gt;
&lt;p&gt;
Right now, lots of the Web 2.0 world lives on the assumption that everything needs
to live at central places and that community forms around ad-driven hubs. The mainframe
folks had a similar stance in the 70s and 80s and then Personal Computers came along.
The pendulum is always swinging and I have little doubt that it will swing back to
“personal” once more and that the federation of personal services will seriously challenge
the hub model once more.
&lt;/p&gt;
&lt;p&gt;
So what does the sample do? As indicated, TweetieBot is a bot that plugs into a Windows
Live Messenger using a simple Add-In. &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2006/09/17/4431.aspx"&gt;Bart
De Smet&lt;/a&gt; has a brilliant summary for how to build such Add-Ins. When the Add-In
is active and someone chats the bot, it answers politely and remembers the chat line,
time and sender. The bird has a leaky long term memory, though. It forgets everything
past the last 40 lines.
&lt;/p&gt;
&lt;p&gt;
Where it gets interesting is that the Add-In can stick three endpoints into the BizTalk
Services ISB:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
A Request/Response Web Service that allows retrieving the list of the last 40 (or
less) “tweets” and also allows client to submit tweets programmatically. 
&lt;li&gt;
An RSS service that allows (right now) anyone to peek in to the chat log of the last
40 tweets. 
&lt;li&gt;
An Event service that allows subscribers to get real-time notifications whenever a
new tweet is recorded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The accompanying Sidebar Gadget, which is implemented &lt;a href="http://blogs.msdn.com/karstenj/archive/2006/10/09/activex-wpf-gadget.aspx"&gt;using
WPF&lt;/a&gt;, is a client for two of these services. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="FLOAT: left" src="http://vasters.com/clemensv/content/binary/image00312345678910.jpg" border=0&gt;&amp;nbsp;&lt;img style="FLOAT: right" src="http://vasters.com/clemensv/content/binary/image00412345.jpg" border=0&gt;When
you drop the Gadget on the Sidebar, it will prompt for the IM address of the TweetieBot
service you’d like to subscribe to. Once you’ve authenticated at the relay using your
registered Information Card, the gadget will pull and show the current list of Tweets
and subscribe to the Events service for real-time updates. And whenever someone chats
the bot, the Sidebar gadget will immediately show the new entry. So even though the
Gadget lives on some client machine that’s hidden between several layers of firewalls
and behind NAT, it can actually get push-style event notifications through the cloud! 
&lt;/p&gt;
&lt;p&gt;
“How do I send events to clients?” must be one of the most frequent questions that
I’ve been asked about Web Services in the past several years. Well, this is your answer
right here.
&lt;/p&gt;
&lt;p&gt;
While I’m still toying around with the code and the guys on the 1st floor in my building
are doing some tweaks on the ISB infrastructure to make multi-endpoint authentication
simpler, you can already play with the bot and help me a bit: 
&lt;/p&gt;
&lt;p&gt;
Using Windows Live Messenger you can chat (&lt;a href="msnim:chat?contact=TweetieBot@hotmail.com"&gt;click
here&lt;/a&gt;) &lt;a href="mailto:tweetiebot@hotmail.com"&gt;tweetiebot@hotmail.com&lt;/a&gt; &lt;b&gt;now&lt;/b&gt;.
Drop a few lines. If the bot is online (which means that I’m not tinkering with it)
it will reply. Then look at this &lt;a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss/"&gt;RSS
feed&lt;/a&gt; [1] and you can see what you and everyone else have been telling the bot
recently. Enjoy.
&lt;/p&gt;
&lt;p&gt;
[1] &lt;a href="http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss"&gt;http://connect.biztalk.net/services/tweetiebot/tweetiebot%40hotmail.com/rss&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=64a8caa0-f9c1-4515-82d3-359a95c56954" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,64a8caa0-f9c1-4515-82d3-359a95c56954.aspx</comments>
      <category>Technology</category>
      <category>Technology/BizTalk</category>
      <category>Technology/ISB</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=22aef11a-20e4-4583-ae05-8ad0c15c7526</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,22aef11a-20e4-4583-ae05-8ad0c15c7526.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,22aef11a-20e4-4583-ae05-8ad0c15c7526.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=22aef11a-20e4-4583-ae05-8ad0c15c7526</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For those of you who couldn't make it to MIX, here are the (Silverlight-) videos of
the talks from the Connected Systems Division deep-linked to <a href="http://sessions.visitmix.com">sessions.visitmix.com</a></p>
        <ul>
          <li>
            <a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=DEV03 - Navigating the Programmable Web&amp;speakers=Don Box, Steve Maine&amp;source=videos/DEV03.wmv" target="_blank">Don
Box, Steve Maine: <strong>Navigating the Programmable Web</strong></a>
          </li>
          <li>
            <a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=XBD07 - Enable Windows CardSpace and Information Cards in Your Web Site&amp;speakers=Garrett Serack, Mike Jones, Pat Felsted&amp;source=videos/XBD07.wmv" target="_blank">Garrett
Serack, Mike Jones, Pat Felsted: <strong>Enable Windows CardSpace and Information
Cards on Your Web Site</strong></a>
          </li>
          <li>
            <a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=PAN03 - PANEL DISCUSSION: Digital Identity and the Psychology of Security&amp;speakers=Kaliya Hamlin, Kim Cameron, Laurie Rae, Marc Canter, Scott Kveton&amp;source=videos/PAN03.wmv" target="_blank">Kim
Cameron and Panel: <strong>Digital Identity and the Psychology of Security</strong></a>
          </li>
        </ul>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=22aef11a-20e4-4583-ae05-8ad0c15c7526" />
      </body>
      <title>Connected Systems @MIX: The Videos</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,22aef11a-20e4-4583-ae05-8ad0c15c7526.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/05/Connected+Systems+MIX+The+Videos.aspx</link>
      <pubDate>Sat, 05 May 2007 04:07:23 GMT</pubDate>
      <description>&lt;p&gt;
For those of you who couldn't make it to MIX, here are the (Silverlight-) videos of
the talks from the Connected Systems Division deep-linked to &lt;a href="http://sessions.visitmix.com"&gt;sessions.visitmix.com&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=DEV03 - Navigating the Programmable Web&amp;amp;speakers=Don Box, Steve Maine&amp;amp;source=videos/DEV03.wmv" target=_blank&gt;Don
Box, Steve Maine: &lt;strong&gt;Navigating the Programmable Web&lt;/strong&gt;&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=XBD07 - Enable Windows CardSpace and Information Cards in Your Web Site&amp;amp;speakers=Garrett Serack, Mike Jones, Pat Felsted&amp;amp;source=videos/XBD07.wmv" target=_blank&gt;Garrett
Serack, Mike Jones, Pat Felsted: &lt;strong&gt;Enable Windows CardSpace and Information
Cards on Your Web Site&lt;/strong&gt;&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://int1.fp.sandpiper.net/soma/applications/silverlight/v1/Default.html?title=PAN03 - PANEL DISCUSSION: Digital Identity and the Psychology of Security&amp;amp;speakers=Kaliya Hamlin, Kim Cameron, Laurie Rae, Marc Canter, Scott Kveton&amp;amp;source=videos/PAN03.wmv" target=_blank&gt;Kim
Cameron and Panel: &lt;strong&gt;Digital Identity and the Psychology of Security&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=22aef11a-20e4-4583-ae05-8ad0c15c7526" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,22aef11a-20e4-4583-ae05-8ad0c15c7526.aspx</comments>
      <category>Talks</category>
      <category>Technology</category>
      <category>Technology/CardSpace</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=aa502cba-e47c-4cfe-a036-875175ad295a</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,aa502cba-e47c-4cfe-a036-875175ad295a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,aa502cba-e47c-4cfe-a036-875175ad295a.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=aa502cba-e47c-4cfe-a036-875175ad295a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We love WS-* as much as we do love Web-Style services. I say "Web-style",
full knowing that the buzzterm is REST. Since REST is an architectural style and not
an implementation technology, it makes sense to make a distinction and, also, claiming
complete RESTfulness for a system is actually a pretty high bar to aspire to. So in
order to avoid monikers like POX or Lo-REST/Hi-REST, I just call it what it
what this is all about to mere mortals whose don't have an advanced degree in HTTP
Philosophy: Services that work like the Web - or Web-Style. That's not to say
that a Web-Style service cannot be fully RESTful. It surely can be. But if all you
want to do is GET to serve up data into mashups and manipulate your backend resources
in some other way, that's up to you. Anyways....
</p>
        <p>
Tomorrow at 10:00am (Session DEV03, Room Delfino 4101A), our resident Lo-REST/Hi-REST/POX/Web-Style Program
Manager <strong>Steve Maine</strong> and our Architect <strong>Don Box</strong> will
explain to you how to use the new Web-Style "Programmable Web" features that we're
adding to the .NET Framework 3.5 to implement the server magic and the service-client
magic to power all the user experience goodness you've seen here at MIX.
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <div style="FONT-WEIGHT: bold">
            <em>Navigating the Programmable Web</em>
          </div>
          <div>
            <em>
            </em>
          </div>
          <div>
            <em>
              <span class="catalogSpeakerLabel">Speaker(s):</span>
              <span>Don Box - Microsoft</span>, <span>Steve
Maine</span></em>
          </div>
          <div>
            <em>
              <span class="catalogCategoryLabel">Audience(s):</span> Developer</em>
          </div>
          <div>
            <em>RSS. ATOM. JSON. POX. REST. WS-*. What are all these terms, and how do they
impact the daily life of a developer trying to navigate today’s programmable Web?
Join us as we explore how to consume and create Web services using a variety of different
formats and protocols. Using popular services (Flickr, GData, and Amazon S3) as case
studies, we look at what it takes to program against these services using the Microsoft
platform today and how that will change in the future.</em>
          </div>
        </blockquote>
        <div dir="ltr">If you are in Vegas for MIX, come see the session. I just saw the demo,
it'll be good.
</div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=aa502cba-e47c-4cfe-a036-875175ad295a" />
      </body>
      <title>Live at MIX: WCF and the Web (and Steve Maine, and Don Box)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,aa502cba-e47c-4cfe-a036-875175ad295a.aspx</guid>
      <link>http://vasters.com/clemensv/2007/05/02/Live+At+MIX+WCF+And+The+Web+And+Steve+Maine+And+Don+Box.aspx</link>
      <pubDate>Wed, 02 May 2007 00:51:05 GMT</pubDate>
      <description>&lt;p&gt;
We love WS-*&amp;nbsp;as much as we do love&amp;nbsp;Web-Style services. I say "Web-style",
full knowing that the buzzterm is REST. Since REST is an architectural style and not
an implementation technology, it makes sense to make a distinction and, also, claiming
complete RESTfulness for a system is actually a pretty high bar to aspire to. So in
order to avoid&amp;nbsp;monikers like POX or Lo-REST/Hi-REST, I just call it what&amp;nbsp;it
what this is all about to mere mortals whose don't have an advanced degree in HTTP
Philosophy: Services that work like the Web - or Web-Style.&amp;nbsp;That's not to say
that a Web-Style service cannot be fully RESTful. It surely can be. But if all you
want to do is GET to serve up data into mashups and manipulate your backend resources
in some other way, that's up to you. Anyways....
&lt;/p&gt;
&lt;p&gt;
Tomorrow at 10:00am (Session DEV03, Room Delfino 4101A), our&amp;nbsp;resident Lo-REST/Hi-REST/POX/Web-Style&amp;nbsp;Program
Manager&amp;nbsp;&lt;strong&gt;Steve Maine&lt;/strong&gt; and our Architect &lt;strong&gt;Don Box&lt;/strong&gt; will
explain to you how to use the new Web-Style "Programmable Web" features that we're
adding to the .NET Framework 3.5 to implement&amp;nbsp;the server magic and the service-client
magic to power all the&amp;nbsp;user experience&amp;nbsp;goodness you've seen here at MIX.
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;div style="FONT-WEIGHT: bold"&gt;&lt;em&gt;Navigating the Programmable Web&lt;/em&gt;
&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&lt;/em&gt;
&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&lt;span class=catalogSpeakerLabel&gt;Speaker(s):&lt;/span&gt; &lt;span&gt;Don Box - Microsoft&lt;/span&gt;, &lt;span&gt;Steve
Maine&lt;/span&gt;&lt;/em&gt;
&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&lt;span class=catalogCategoryLabel&gt;Audience(s):&lt;/span&gt; Developer&lt;/em&gt;
&lt;/div&gt;
&lt;div&gt;&lt;em&gt;RSS. ATOM. JSON. POX. REST. WS-*. What are all these terms, and how do they
impact the daily life of a developer trying to navigate today’s programmable Web?
Join us as we explore how to consume and create Web services using a variety of different
formats and protocols. Using popular services (Flickr, GData, and Amazon S3) as case
studies, we look at what it takes to program against these services using the Microsoft
platform today and how that will change in the future.&lt;/em&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;div dir=ltr&gt;If you are in Vegas for MIX, come see the session. I just saw the demo,
it'll be good.
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=aa502cba-e47c-4cfe-a036-875175ad295a" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,aa502cba-e47c-4cfe-a036-875175ad295a.aspx</comments>
      <category>Talks</category>
      <category>Technology</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</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=50eba4bc-5ceb-4052-a428-ec063870f80d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,50eba4bc-5ceb-4052-a428-ec063870f80d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,50eba4bc-5ceb-4052-a428-ec063870f80d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=50eba4bc-5ceb-4052-a428-ec063870f80d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We <a href="http://msdn2.microsoft.com/en-us/library/bb310550.aspx">just published
a great whitepaper</a> written by our WCF/WF Performance PM Saurabh Gupta on the relative
performance of WCF compared to ASMX, WSE, Enterprise Services, and Remoting. This
is material for your favorites folder. The summary says:
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>To summarize the results, WCF is 25%—50% faster than ASP.NET Web Services, and
approximately 25% faster than .NET Remoting. Comparison with .NET Enterprise Service
is load dependant, as in one case WCF is nearly 100% faster but in another scenario
it is nearly 25% slower. For WSE 2.0/3.0 implementations, migrating them to WCF will
obviously provide the most significant performance gains <strong>of almost 4x</strong>.</em>
          </p>
        </blockquote>
        <p>
The one scenario where WCF is slower are some comparison scenarios with ES. I'd
say that even getting within strinking distance of ES/COM+/DCOM/RPC performance
for a V1 release that's based on Web services technology is quite an astonishing
accomplishment. The ES/COM+/DCOM/RPC stack underneath had almost 15 years to
get to where it's at. And the 4x should give you a really convincing reason to make
the move from WSE to WCF.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=50eba4bc-5ceb-4052-a428-ec063870f80d" />
      </body>
      <title>So how much faster is it really and is it? WCF performance in comparison. </title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,50eba4bc-5ceb-4052-a428-ec063870f80d.aspx</guid>
      <link>http://vasters.com/clemensv/2007/04/02/So+How+Much+Faster+Is+It+Really+And+Is+It+WCF+Performance+In+Comparison.aspx</link>
      <pubDate>Mon, 02 Apr 2007 21:41:34 GMT</pubDate>
      <description>&lt;p&gt;
We &lt;a href="http://msdn2.microsoft.com/en-us/library/bb310550.aspx"&gt;just published
a great whitepaper&lt;/a&gt; written by our WCF/WF Performance PM Saurabh Gupta on the relative
performance of WCF compared to ASMX, WSE, Enterprise Services, and Remoting. This
is material for your favorites folder. The summary says:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;To summarize the results, WCF is 25%—50% faster than ASP.NET Web Services, and
approximately 25% faster than .NET Remoting. Comparison with .NET Enterprise Service
is load dependant, as in one case WCF is nearly 100% faster but in another scenario
it is nearly 25% slower. For WSE 2.0/3.0 implementations, migrating them to WCF will
obviously provide the most significant performance gains &lt;strong&gt;of almost 4x&lt;/strong&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The one&amp;nbsp;scenario where WCF is slower are some comparison scenarios with ES. I'd
say that even getting within strinking distance&amp;nbsp;of ES/COM+/DCOM/RPC performance
for a V1 release that's based on Web services&amp;nbsp;technology is quite an astonishing
accomplishment. The ES/COM+/DCOM/RPC stack underneath&amp;nbsp;had almost 15 years to
get to where it's at. And the 4x should give you a really convincing reason to&amp;nbsp;make
the move&amp;nbsp;from WSE to WCF.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=50eba4bc-5ceb-4052-a428-ec063870f80d" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,50eba4bc-5ceb-4052-a428-ec063870f80d.aspx</comments>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=4ee51b44-49bd-4b10-8960-74fe1af93f3f</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,4ee51b44-49bd-4b10-8960-74fe1af93f3f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,4ee51b44-49bd-4b10-8960-74fe1af93f3f.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=4ee51b44-49bd-4b10-8960-74fe1af93f3f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Before I continue pointing out SDK samples, why not take a look at a great end-to-end
.NET Framework 3.0 demo first? It's been out there for a while and hence this isn't
really news, but in case you've not seen it (or the latest revision of it) go
check out <a href="http://www.dinnernow.net">DinnerNow</a>. The demo covers WCF, Workflow,
CardSpace and PowerShell. Awesome piece of work from our Evangelism team. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=4ee51b44-49bd-4b10-8960-74fe1af93f3f" />
      </body>
      <title>Dinner Now</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,4ee51b44-49bd-4b10-8960-74fe1af93f3f.aspx</guid>
      <link>http://vasters.com/clemensv/2007/04/02/Dinner+Now.aspx</link>
      <pubDate>Mon, 02 Apr 2007 19:46:26 GMT</pubDate>
      <description>&lt;p&gt;
Before I continue pointing out SDK samples, why not take a look at a&amp;nbsp;great end-to-end
.NET Framework 3.0 demo first? It's been out there for a while and hence this isn't
really news, but in case you've not seen it (or the latest revision of it)&amp;nbsp;go
check out &lt;a href="http://www.dinnernow.net"&gt;DinnerNow&lt;/a&gt;. The demo covers WCF, Workflow,
CardSpace and PowerShell. Awesome piece of work from our Evangelism team. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=4ee51b44-49bd-4b10-8960-74fe1af93f3f" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,4ee51b44-49bd-4b10-8960-74fe1af93f3f.aspx</comments>
      <category>Technology/WCF</category>
      <category>Technology/Workflow</category>
      <category>Technology/CardSpace</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=5f8cfcfb-637c-4bfb-8816-934162922273</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,5f8cfcfb-637c-4bfb-8816-934162922273.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,5f8cfcfb-637c-4bfb-8816-934162922273.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=5f8cfcfb-637c-4bfb-8816-934162922273</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the "niche" features in WCF that deserves a lot more attention than it is getting
is our P2P support. The <a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.netpeertcpbinding.aspx">NetPeerTcpBinding</a> looks,
from the developer perspective, mostly like any other binding. The main
difference between P2P applications and "normal" client/server apps is, of course,
that they are serverless. Hence, P2P apps are commonly based on message
exchanges where every <a href="http://msdn2.microsoft.com/en-us/library/ms729832.aspx">peer
node</a> in a <a href="http://msdn2.microsoft.com/en-us/library/ms734692.aspx">mesh</a> talks
to everyone else in a broadcast fashion and that model favors (but doesn't require)
symmetric duplex contracts*
</p>
        <p>
When I say that it works like mostly any other binding, I really only mean the developer
experience. The NetPeerTcpBinding packs so much network intelligence under its hood
that it boggles the mind. The P2P technology underneath will figure out the optimal
layout for a peer mesh, propagate messages through the mesh in an optimal fashion
using members of the mesh as routers as appropriate. You can hook in filters to control
the message propagation, you can control the hop counts, there are detection
mechanisms for when a party gets split off the mesh and reconnects, and
there are various ways to secure your meshes. And you basically get all
the stuff for free if you just pick that binding and configure it.
</p>
        <p>
The Peer Channel team <a href="http://blogs.msdn.com/peerchan/">has a blog</a>, too.
Links to samples:
</p>
        <p>
(a) <a href="http://msdn2.microsoft.com/en-us/library/ms752266.aspx">Basic NetPeerTcpBinding
samples</a> - Uses the PNRP resolver mode<br />
(b) Scenario samples:<br />
       (i) <a href="http://msdn2.microsoft.com/en-us/library/ms751502.aspx">Chat</a> -
Demonstrates Chat using the non-PNRP custom resolver<br />
       (ii) <a href="http://msdn2.microsoft.com/en-us/library/ms751466.aspx">Custom
Resolver</a> - Demonstrates how to write your own Custom Resolver service and
client.
</p>
        <p>
          <hr />
* A symmetric duplex contract defines itself as the callback contract:<br /><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">[<span style="COLOR: teal">ServiceContract</span>(CallbackContract
= <font color="#000000"><span style="COLOR: blue">typeof</span>(<span style="COLOR: teal">IChat</span>)</font>)]<br /></span><span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">public</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="COLOR: blue">interface</span><span style="COLOR: teal">IChat<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">{<br /></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> 
...<br /></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes">}</span></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=5f8cfcfb-637c-4bfb-8816-934162922273" />
      </body>
      <title>P2P Made Easy</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,5f8cfcfb-637c-4bfb-8816-934162922273.aspx</guid>
      <link>http://vasters.com/clemensv/2007/03/30/P2P+Made+Easy.aspx</link>
      <pubDate>Fri, 30 Mar 2007 15:44:41 GMT</pubDate>
      <description>&lt;p&gt;
One of the "niche" features in WCF that deserves a lot more attention than it is getting
is our P2P support. The &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.netpeertcpbinding.aspx"&gt;NetPeerTcpBinding&lt;/a&gt;&amp;nbsp;looks,
from the developer&amp;nbsp;perspective, mostly&amp;nbsp;like any other binding. The main
difference between P2P applications and "normal" client/server apps is, of course,
that they are serverless. Hence, P2P apps are commonly&amp;nbsp;based on&amp;nbsp;message
exchanges where every &lt;a href="http://msdn2.microsoft.com/en-us/library/ms729832.aspx"&gt;peer
node&lt;/a&gt;&amp;nbsp;in a &lt;a href="http://msdn2.microsoft.com/en-us/library/ms734692.aspx"&gt;mesh&lt;/a&gt; talks
to everyone else&amp;nbsp;in a broadcast fashion and that model favors (but doesn't require)
symmetric duplex contracts*
&lt;/p&gt;
&lt;p&gt;
When I say that it works like mostly any other binding, I really only mean the developer
experience. The NetPeerTcpBinding packs so much network intelligence under its hood
that it boggles the mind. The P2P technology underneath will figure out the optimal
layout for a peer mesh, propagate messages through the mesh in an optimal fashion
using members of the mesh as routers as appropriate. You can hook in filters to control
the message propagation, you can control the hop counts, there&amp;nbsp;are detection
mechanisms for when&amp;nbsp;a party gets&amp;nbsp;split off the mesh and reconnects, and
there&amp;nbsp;are various ways to secure your meshes.&amp;nbsp;And you basically get all
the stuff for free if you just pick that binding and configure it.
&lt;/p&gt;
&lt;p&gt;
The Peer Channel team &lt;a href="http://blogs.msdn.com/peerchan/"&gt;has a blog&lt;/a&gt;, too.
Links to samples:
&lt;/p&gt;
&lt;p&gt;
(a) &lt;a href="http://msdn2.microsoft.com/en-us/library/ms752266.aspx"&gt;Basic&amp;nbsp;NetPeerTcpBinding
samples&lt;/a&gt; - Uses the PNRP resolver mode&lt;br&gt;
(b) Scenario samples:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (i) &lt;a href="http://msdn2.microsoft.com/en-us/library/ms751502.aspx"&gt;Chat&lt;/a&gt; -
Demonstrates Chat using the non-PNRP custom resolver&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (ii) &lt;a href="http://msdn2.microsoft.com/en-us/library/ms751466.aspx"&gt;Custom
Resolver&lt;/a&gt;&amp;nbsp;- Demonstrates how to write your own Custom Resolver service and
client.
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
* A symmetric duplex contract defines itself as the callback contract:&lt;br&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;[&lt;span style="COLOR: teal"&gt;ServiceContract&lt;/span&gt;(CallbackContract
= &lt;font color=#000000&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR: teal"&gt;IChat&lt;/span&gt;)&lt;/font&gt;)]&lt;br&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;interface&lt;/span&gt; &lt;span style="COLOR: teal"&gt;IChat&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;{&lt;br&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;
...&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=5f8cfcfb-637c-4bfb-8816-934162922273" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,5f8cfcfb-637c-4bfb-8816-934162922273.aspx</comments>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=15460bc6-50a4-4a41-9efc-410186e5c52a</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,15460bc6-50a4-4a41-9efc-410186e5c52a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,15460bc6-50a4-4a41-9efc-410186e5c52a.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=15460bc6-50a4-4a41-9efc-410186e5c52a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are a lot of blog entries that I'd write if they weren't already written. Stupid
statement. No, really. One of the great qualities of the documentation that we
built for WCF and WF and CardSpace is that it's completely legible and understandable :)
</p>
        <p>
Since there's just a lot of stuff in the SDK docs and one easily gets lost in the
forest, I'll point out a few of the conceptual docs and/or samples and may add the
one or the other commentary here or there. For the first one that I selfishly point
out the only actual commentary is that I wrote that piece ;)
</p>
        <p>
Go read about <a href="http://msdn2.microsoft.com/en-us/library/aa717047.aspx">Message
Inspectors</a> and how to implement client- and/or server-side schema-based validation
in WCF, complete with the ability to refer to the validation schemas by config.
Adventure-seekers might be interested in poking around in that code and replace the
schema validation and the schemas with XSLTs and transforms. That would create some
interesting followup-challenges for synthesizing the ContractDescription that
projects out the correct pre-transformation representation for WSDL, but I guess that'd
be part of the fun. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=15460bc6-50a4-4a41-9efc-410186e5c52a" />
      </body>
      <title>WCF Schema Validation with Message Inspectors</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,15460bc6-50a4-4a41-9efc-410186e5c52a.aspx</guid>
      <link>http://vasters.com/clemensv/2007/03/29/WCF+Schema+Validation+With+Message+Inspectors.aspx</link>
      <pubDate>Thu, 29 Mar 2007 21:03:59 GMT</pubDate>
      <description>&lt;p&gt;
There are a lot of blog entries that I'd write if they weren't already written. Stupid
statement. No, really. One of the great qualities of the documentation&amp;nbsp;that we
built for&amp;nbsp;WCF and WF and CardSpace is that it's completely legible and understandable&amp;nbsp;:)
&lt;/p&gt;
&lt;p&gt;
Since there's just a lot of stuff in the SDK docs and one easily gets lost in the
forest, I'll point out a few of the conceptual docs and/or samples and may add the
one or the other commentary here or there. For the first one that I selfishly point
out the only actual commentary is that I wrote that piece ;)
&lt;/p&gt;
&lt;p&gt;
Go read about &lt;a href="http://msdn2.microsoft.com/en-us/library/aa717047.aspx"&gt;Message
Inspectors&lt;/a&gt; and how to implement client- and/or server-side schema-based validation
in WCF,&amp;nbsp;complete with the ability to refer to the validation schemas by config.
Adventure-seekers might be interested in poking around in that code and replace the
schema validation and the schemas with XSLTs and transforms. That would create some
interesting followup-challenges for&amp;nbsp;synthesizing&amp;nbsp;the ContractDescription&amp;nbsp;that
projects out the correct pre-transformation representation for WSDL, but I guess that'd
be&amp;nbsp;part of the fun. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=15460bc6-50a4-4a41-9efc-410186e5c52a" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,15460bc6-50a4-4a41-9efc-410186e5c52a.aspx</comments>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=46106a0e-05a7-4e4b-b156-0331d1c9aa57</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=46106a0e-05a7-4e4b-b156-0331d1c9aa57</wfw:commentRss>
      <title>Poison Control.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</guid>
      <link>http://vasters.com/clemensv/2007/03/29/Poison+Control.aspx</link>
      <pubDate>Thu, 29 Mar 2007 08:02:54 GMT</pubDate>
      <description>&lt;p&gt;
A bad sign for how much I’m coding these days is that I had a HDD crash three weeks
ago and only restored Visual Studio into fully working condition with all my tools
and stuff today. I’ve decided that that has to change otherwise I’ll get really rusty.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/drnick/archive/2007/02/13/more-poison-message-handling.aspx"&gt;Picking
up&lt;/a&gt; the thread from “Professor Indigo” Nicholas Allen, I’ve built a little program
that illustrates an alternate handling strategy for poisonous messages that WCF throws
into the poison queue on Vista and Longhorn Server if you ask it to (&lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Move&lt;/a&gt;).
The one we’re &lt;a href="http://msdn2.microsoft.com/en-us/library/ms789028.aspx"&gt;showing
in the docs&lt;/a&gt; is implementing a local resolution strategy that’s being fired within
the service when the service ends up faulting; that’s the strategy for &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.configuration.msmqbindingelementbase.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Fault&lt;/a&gt; and
works for MSMQ 3.0. The strategy I’m showing here requires our latest OS wave.
&lt;/p&gt;
&lt;p&gt;
When a message arrives at a WCF endpoint through a queue, WCF will – if the queue
is transactional – open a transaction and de-queue the message. It will then try to
dispatch it to the target service and operation. Assuming the dispatch works, the
operation gets invoked and – might – tank. If it does, an exception is raised, thrown
back into the WCF stack and the transaction aborts. Happily, WCF grabs the next message
from the queue – which happens to be the one that just caused the failure due to the
rollback – and the operation – might – tank again.
&lt;/p&gt;
&lt;p&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
Now, the reasons why the operation might fail are as numerous as the combinations
of program statement combinations that you could put there. Anything could happen.
The program is completely broken, the input data causes the app to go to that branch
that nobody ever cared to test – or apparently not enough, the backend database is
permanently offline, the machine is having an extremely bad hardware day, power fails,
you name it. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
So what if the application just keeps choking and throwing on that particular message?
With either of the aforementioned error handling modes, WCF is going to take the message
out of the loop when its patience with the patient is exhausted. With the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.configuration.msmqbindingelementbase.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Fault&lt;/a&gt; option,
WCF will raise an error event that can be caught and processed with &lt;a href="http://msdn2.microsoft.com/en-us/library/ms789028.aspx"&gt;a
handler&lt;/a&gt;. When you use &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Move&lt;/a&gt; things
are a bit more flexible, because the message causing all that trouble now sits in
a queue again.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The headache-causing problem with poison messages is that you really, really need
to do something about them. From the sender’s perspective, the message has been delivered
and it puts its trust into the receiver to do the right thing. “Here’s that $1,000,000
purchase order! I’m done, go party!”. If the receiving service goes into the bug-induced
loop of recurring death, you’ve got two problems: You have a nasty bug that’s probably
difficult to repro since it happens under stress, and you’ve got a $1,000,000 purchase
order unhappily sitting in a dark hole. Guess what your great-grand-boss’ boss cares
more about.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The second, technically slightly more headache-causing problem with poison messages
(if that’s possible to imagine) is that they just sit there with all the gold and
diamonds that they might represent, but they are effectively just a bunch of (if you’re
lucky) XML goo. Telling a system operator to go and check the poison message queues
or to surface their contents to him/her and look what’s going on there is probably
not a winning strategy.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
So what to do? Your high-throughput automated-processing solution that does the regular
business behind the queue has left the building for lunch. That much is clear. How
do you hook in some alternate processing path that does at least surface the problem
to an operator or “information worker”– or even a call center agent pool – in a legible
and intelligible fashion so that a human can look at the problem and try finding a
fix? In the end, we’ve got the best processing unit for non-deterministic and unexpected
events sitting &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;between our shoulders,
one would hope. How about writing a slightly less automated service alternative that’s
easy to adjust and try to get the issue surfaced to someone or just try multiple things
[Did someone just say “Workflow”?] – and hook that straight up to where all the bad
stuff lands: the poison queue. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
Here’s the code. I just coded that up for illustrative purposes and hence there’s
absolutely room for improvement. I’m going to put the project files up on wcf.netfx3.com
and will update this post with the link. We’ll start with the boilerplate stuff and
the “regular” service: 
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; System;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Collections.Generic;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Text;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Runtime.Serialization;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Description;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Workflow.Runtime;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; ServerErrorHandlingWorkflow;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; ServerData;&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt;&lt;font color=#000000&gt; Server&lt;br&gt;
{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;&lt;font color=#000000&gt;(Namespace=&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Program&lt;/span&gt;&lt;font color=#000000&gt;.ServiceNamespaceURI)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;interface&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&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: #2b91af"&gt;OperationContract&lt;/span&gt;&lt;font color=#000000&gt;(IsOneWay=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(TransactionAutoCompleteOnSessionClose=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;ReleaseServiceInstanceOnTransactionComplete=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&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;ApplicationService&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&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: #2b91af"&gt;OperationBehavior&lt;/span&gt;&lt;font color=#000000&gt;(TransactionAutoComplete=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;,TransactionScopeRequired=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&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; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;System.Diagnostics.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;DebuggerStepThrough&lt;/span&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; &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; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data)&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="BACKGROUND: yellow; COLOR: blue; mso-highlight: yellow"&gt;throw&lt;/span&gt;&lt;span style="BACKGROUND: yellow; mso-highlight: yellow"&gt;&lt;font color=#000000&gt; &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;Exception&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"The
method or operation is not implemented."&lt;/span&gt;&lt;font color=#000000&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;br&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; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Not much excitement here except that the highlighted line will always cause the service
to tank. In real life, the path to that particular place where the service consistently
finds its way into a trouble-spot is more convoluted and may involve a few thousand
lines, but this is a good approximation for what happens when you hit a poison message.
Stuff keeps failing.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The next snippet is our alternate service. Instead of boldly trying to do complex
processing, it simply punts the message data to a Workflow. That’s assuming that the
message isn’t completely messed up to begin with and can indeed be de-serialized.
To mitigate that scenario we could also use a one-way &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/ServiceStation/default.aspx#S8"&gt;universal
contract&lt;/a&gt; and be even more careful. The key difference between this and the “regular”
service is that the alternate service turns off the WCF address filter check. We’ll
get back to that.&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="BACKGROUND: aqua; mso-highlight: aqua"&gt;&lt;font color=#000000&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(AddressFilterMode
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;AddressFilterMode&lt;/span&gt;&lt;font color=#000000&gt;.Any)]&lt;/font&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&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;ApplicationErrorService&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&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;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; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data)&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;Dictionary&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;
workflowArgs = &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;Dictionary&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt;&amp;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;workflowArgs.Add(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"ApplicationData"&lt;/span&gt;&lt;font color=#000000&gt;,data);&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;WorkflowInstance&lt;/span&gt;&lt;font color=#000000&gt; workflowInstance
= 
&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;Program&lt;/span&gt;&lt;font color=#000000&gt;.WorkflowRuntime.CreateWorkflow(&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&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;ErrorHandlingWorkflow&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;workflowArgs);&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;workflowInstance.Start();&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;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
So now we’ve got the fully automated middle-of-the-road default service and our “what
do we do next” alternate service. Let’s hook them up.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&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;Program&lt;br&gt;
&lt;/span&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;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;const&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; ServiceNamespaceURI
= 
&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: #a31515"&gt;"http://samples.microsoft.com/2007/03/WCF/PoisonHandling/Service"&lt;/span&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; &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;static&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WorkflowRuntime&lt;/span&gt;&lt;font color=#000000&gt; WorkflowRuntime
= &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;WorkflowRuntime&lt;/span&gt;&lt;font color=#000000&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 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; msmqQueueName
= Properties.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Settings&lt;/span&gt;&lt;font color=#000000&gt;.Default.QueueName;&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; msmqPoisonQueueName
= msmqQueueName+&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;";poison"&lt;/span&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;string&lt;/span&gt;&lt;font color=#000000&gt; &lt;span style="BACKGROUND: fuchsia; mso-highlight: fuchsia"&gt;netMsmqQueueName&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"net.msmq://"&lt;/span&gt;&lt;font color=#000000&gt; +
msmqQueueName.Replace(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;'\\'&lt;/span&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;'/'&lt;/span&gt;&lt;font color=#000000&gt;).Replace(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"$"&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;""&lt;/span&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;string&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="BACKGROUND: lime; mso-highlight: lime"&gt;&lt;font color=#000000&gt;netMsmqPoisonQueueName
= netMsmqQueueName+&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;";poison"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;br&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (!System.Messaging.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;MessageQueue&lt;/span&gt;&lt;font color=#000000&gt;.Exists(msmqQueueName))&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;System.Messaging.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;MessageQueue&lt;/span&gt;&lt;font color=#000000&gt;.Create(msmqQueueName, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&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;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
First – and for this little demo only – we’re setting up a local queue and do a little
stringsmithing to get the app.config stored MSMQ format queue name into the net.msmq
URI format. Next …&lt;font face=Calibri&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&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&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt; applicationServiceHost
= &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;ApplicationService&lt;/span&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;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt; queueBinding
= &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;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None);&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;queueBinding.ReceiveErrorHandling
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ReceiveErrorHandling&lt;/span&gt;&lt;font color=#000000&gt;.Move; 
&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;queueBinding.ReceiveRetryCount
= 1;&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;queueBinding.RetryCycleDelay
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;TimeSpan&lt;/span&gt;&lt;font color=#000000&gt;.FromSeconds(1);&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;applicationServiceHost.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;IApplicationContract&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;queueBinding,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="BACKGROUND: fuchsia; mso-highlight: fuchsia"&gt;netMsmqQueueName&lt;/span&gt;);&lt;br style="mso-special-character: line-break"&gt;
&lt;br style="mso-special-character: line-break"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Now we’ve bound the “regular” application service to the queue. I’m setting the binding
parameters (look them up at your leisure) in a way that we’re failing very fast here.
By default, the RetryCycleDelay is set to 30 minutes, which means that WCF is giving
you a reasonable chance to fix temporary issues while stuff hangs out in the retry
queue. Now for the poison handler service:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&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; &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;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt; poisonHandlerServiceHost
= &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;ApplicationErrorService&lt;/span&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;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt; poisonBinding
= &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;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None);&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;poisonBinding.ReceiveErrorHandling
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ReceiveErrorHandling&lt;/span&gt;&lt;font color=#000000&gt;.Drop;&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;poisonHandlerServiceHost.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;IApplicationContract&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;poisonBinding, 
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;span style="BACKGROUND: lime; mso-highlight: lime"&gt;netMsmqPoisonQueueName&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Looks almost the same, hmm? The trick here is that we’re pointing this one to the
poison queue into which the regular service drops all the stuff that it can’t deal
with. Otherwise it’s (almost) just a normal service. The key difference between the
ApplicationErrorService service and its sibling is that the poison-message handler
service implementation is decorated with &lt;span style="FONT-SIZE: 10pt; BACKGROUND: aqua; FONT-FAMILY: 'Courier New'; mso-no-proof: yes; mso-highlight: aqua"&gt;&lt;font color=#000000&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(AddressFilterMode
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;AddressFilterMode&lt;/span&gt;&lt;font color=#000000&gt;.Any)]&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;.&lt;/span&gt;Since
the original message was sent to the a different (the original) queue and we’re now
looking at a sub-queue that has a different name and therefore a different WS-Addressing:To
identity, WCF would normally reject processing that message. With this behavior setting
we can tell WCF to ignore that and have the service treat the message as if it landed
at the right place – which is what we want.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
And now for the unspectacular run-it and drop-a-message-into-queue finale:&lt;font face=Calibri&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&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;applicationServiceHost.Open();&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;poisonHandlerServiceHost.Open();&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;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Application
running"&lt;/span&gt;&lt;font color=#000000&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;ChannelFactory&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;
client = 
&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; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;new &lt;/span&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;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;(queueBinding,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;netMsmqQueueName);&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;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt; channel
= client.CreateChannel();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&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;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data
= &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;ApplicationData&lt;/span&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;data.FirstName
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Clemens"&lt;/span&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;data.LastName
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Vasters"&lt;/span&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;channel.SubmitData(data);&lt;span style="mso-tab-count: 1"&gt;&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;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;((&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IClientChannel&lt;/span&gt;&lt;font color=#000000&gt;)channel).Close();&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 exit"&lt;/span&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; &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;Console&lt;/span&gt;&lt;font color=#000000&gt;.ReadLine();&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; &lt;/span&gt;}&lt;br&gt;
}&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
The Workflow that’s hooked up to the poison handler in my particular sample project
does nothing big. It’s got a property that is initialized with the data item and just
has a code activity that spits out the message to the console. It could send an email,
page an operator through messenger, etcetc. Whatever works. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=46106a0e-05a7-4e4b-b156-0331d1c9aa57" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</comments>
      <category>Technology/MSMQ</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=f895f919-b327-4e9d-9021-cdad9d0d6c9c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,f895f919-b327-4e9d-9021-cdad9d0d6c9c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,f895f919-b327-4e9d-9021-cdad9d0d6c9c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=f895f919-b327-4e9d-9021-cdad9d0d6c9c</wfw:commentRss>
      <title>Doug got email.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,f895f919-b327-4e9d-9021-cdad9d0d6c9c.aspx</guid>
      <link>http://vasters.com/clemensv/2007/01/18/Doug+Got+Email.aspx</link>
      <pubDate>Thu, 18 Jan 2007 04:04:35 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://douglasp.com/blog/default.aspx"&gt;Doug Purdy&lt;/a&gt;, the (my) Group Program
Manager of the Connected Framework team (owning WCF and WF) just got email:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;Dear
Douglas,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;
&lt;font face="Times New Roman" color=#000000 size=3&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="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;Last
year you emailed us regarding .NET Framework 3.0. &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;We
are emailing you to let you know that we &lt;strong&gt;have installed .NET Framework 3.0
on our webservers&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;/span&gt;&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;
&lt;font face="Times New Roman" color=#000000 size=3&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="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;We
continue to improve our product so please keep an eye out on our service.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;
&lt;font face="Times New Roman" color=#000000 size=3&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="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;Have
a great day.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;
&lt;font face="Times New Roman" color=#000000 size=3&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="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;&lt;strong&gt;&lt;a href="http://discountasp.net/"&gt;DiscountASP.NET&lt;o:p&gt;&lt;/o:p&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;-
Microsoft Gold Partner&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;-
2006 and 2005 Product of the Year: asp.netPRO Magazine Readers' Choice&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;-
Best ASP.NET Web Hosting: 2006 and 2005 asp.netPRO Magazine Readers' Choice&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face="Times New Roman"&gt;-
Best .NET Hosting Provider: .NET Developer's Journal 2005 Readers' Choice&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
How is your ISP doing?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=f895f919-b327-4e9d-9021-cdad9d0d6c9c" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,f895f919-b327-4e9d-9021-cdad9d0d6c9c.aspx</comments>
      <category>Technology/WCF</category>
      <category>Technology/Workflow</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>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=cd61e19d-df0d-47ff-8040-d0b4bb77e10c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,cd61e19d-df0d-47ff-8040-d0b4bb77e10c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,cd61e19d-df0d-47ff-8040-d0b4bb77e10c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=cd61e19d-df0d-47ff-8040-d0b4bb77e10c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've posted the current <a href="http://wcf.netfx3.com/content/WindowsCommunicationFoundationTrainingProviders.aspx">WCF
Training Providers</a> list on wcf.netfx3.com this weekend. All of these folks are
running custom-built training classes for WCF and until we here at MS come out with
the "official" Microsoft Official Curriculum" for WCF and the other .NET Framework
3.0 technologies (which will take several months from when Vista ships), these offerings
are indeed our preferred option for you to get WCF training. 
</p>
        <p>
One event that I'll personally highlight and happily and shamelessly advertise
is <a href="http://www.newtelligence.com/PermaLink.aspx?guid=75b55828-ecf0-45d2-adf7-a438b02f41b2">a
cooperation by my ex-firm newtelligence and my friends at IDesign</a>, because it's
coming up very soon. One of the coolest aspect of <a href="http://www.tornadocamp.net/WCF/">that
class</a> is that it is scheduled to take place in Europe's #1 vacation spot Mallorca,
which means that cheap flights should be available from anywhere and the weather is
nice, too. <a href="http://www.tornadocamp.net/wcf/SignUp.aspx">Registration is open</a> and
my understanding is that it closes this week! I wish I could go.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=cd61e19d-df0d-47ff-8040-d0b4bb77e10c" />
      </body>
      <title>Shameless WCF Training Plug</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,cd61e19d-df0d-47ff-8040-d0b4bb77e10c.aspx</guid>
      <link>http://vasters.com/clemensv/2006/09/25/Shameless+WCF+Training+Plug.aspx</link>
      <pubDate>Mon, 25 Sep 2006 23:51:10 GMT</pubDate>
      <description>&lt;p&gt;
I've posted the current&amp;nbsp;&lt;a href="http://wcf.netfx3.com/content/WindowsCommunicationFoundationTrainingProviders.aspx"&gt;WCF
Training Providers&lt;/a&gt; list on wcf.netfx3.com this weekend. All of these folks are
running custom-built training classes for WCF and until we here at MS come out with
the "official" Microsoft Official Curriculum" for WCF and the other .NET Framework
3.0 technologies (which will take several months from when Vista ships), these&amp;nbsp;offerings
are indeed&amp;nbsp;our preferred option for you to get WCF training. 
&lt;/p&gt;
&lt;p&gt;
One event that I'll personally highlight and happily and shamelessly&amp;nbsp;advertise
is &lt;a href="http://www.newtelligence.com/PermaLink.aspx?guid=75b55828-ecf0-45d2-adf7-a438b02f41b2"&gt;a
cooperation by my ex-firm newtelligence and my friends at IDesign&lt;/a&gt;, because it's
coming up very soon. One of the coolest aspect of &lt;a href="http://www.tornadocamp.net/WCF/"&gt;that
class&lt;/a&gt; is that it is scheduled to take place in Europe's #1 vacation spot Mallorca,
which means that cheap flights should be available from anywhere and the weather is
nice, too. &lt;a href="http://www.tornadocamp.net/wcf/SignUp.aspx"&gt;Registration is open&lt;/a&gt; and
my understanding is that it closes this week! I wish I could go.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=cd61e19d-df0d-47ff-8040-d0b4bb77e10c" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,cd61e19d-df0d-47ff-8040-d0b4bb77e10c.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=6a2590f3-f735-4b29-8241-45d94acad149</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,6a2590f3-f735-4b29-8241-45d94acad149.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,6a2590f3-f735-4b29-8241-45d94acad149.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=6a2590f3-f735-4b29-8241-45d94acad149</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strike>Indigo</strike> The Windows Communication Foundation's RC1 bits are now live.
RC means "Release Candidate" and our team is really, really serious about this
release being as close to what we intend to ship as we can ever get. Our database
view with unresolved code-defects is essentially empty (there is a not more of a handful
of small fixes for very esoteric scenarios that we're still doing for RTM). The time
of breaking changes is absolutely and finally over for "WCF Version 1".
</p>
        <p>
The team is very excited about this. There's lots of joy in the hallways. We're getting
close to being done. Remember when you saw the first WS-* specs popping up out there
some 6 years ago? That's when this thing was started. You can just imagine how pumped
the testers, developers and program managers are around here. And even though I
am new to the family, I get to celebrate a little too. Greatness.
</p>
        <p>
Get the RC1 for the .NET Framework 3.0 with the WCF bits from here:<br /><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=19E21845-F5E3-4387-95FF-66788825C1AF&amp;displaylang=en"><font color="#0000ff">http://www.microsoft.com/downloads/details.aspx?FamilyId=19E21845-F5E3-4387-95FF-66788825C1AF&amp;displaylang=en</font></a></span> 
</p>
        <p>
There's one little issue with the Visual Studio Tools aligned with that version, so
it will take another day or so until those get uploaded.
</p>
        <p>
As always, if you find problems, tell us: <a href="http://connect.microsoft.com/wcf">http://connect.microsoft.com/wcf</a></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6a2590f3-f735-4b29-8241-45d94acad149" />
      </body>
      <title>"Indigo is live."</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,6a2590f3-f735-4b29-8241-45d94acad149.aspx</guid>
      <link>http://vasters.com/clemensv/2006/09/01/Indigo+Is+Live.aspx</link>
      <pubDate>Fri, 01 Sep 2006 21:00:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strike&gt;Indigo&lt;/strike&gt; The Windows Communication Foundation's RC1 bits are now live.
RC means "Release Candidate" and&amp;nbsp;our team is really, really serious about this
release being as close to what we intend to ship as we can ever get. Our database
view with unresolved code-defects is essentially empty (there is a not more of a handful
of small fixes for very esoteric scenarios that we're still doing for RTM). The time
of breaking changes is absolutely and finally over for "WCF Version 1".
&lt;/p&gt;
&lt;p&gt;
The team is very excited about this. There's lots of joy in the hallways. We're getting
close to being done. Remember when you saw the first WS-* specs popping up out there
some 6 years ago? That's when this thing was started. You can just imagine how pumped
the testers, developers and program managers are around here. And even though&amp;nbsp;I
am new to the family, I get to celebrate a little too. Greatness.
&lt;/p&gt;
&lt;p&gt;
Get the RC1 for the .NET Framework 3.0 with the WCF bits from here:&lt;br&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=19E21845-F5E3-4387-95FF-66788825C1AF&amp;amp;displaylang=en"&gt;&lt;font color=#0000ff&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=19E21845-F5E3-4387-95FF-66788825C1AF&amp;amp;displaylang=en&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
There's one little issue with the Visual Studio Tools aligned with that version, so
it will take another day or so until those get uploaded.
&lt;/p&gt;
&lt;p&gt;
As always, if you find problems, tell us: &lt;a href="http://connect.microsoft.com/wcf"&gt;http://connect.microsoft.com/wcf&lt;/a&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6a2590f3-f735-4b29-8241-45d94acad149" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,6a2590f3-f735-4b29-8241-45d94acad149.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=47b65fb9-0d86-4c72-8028-35941b580a45</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,47b65fb9-0d86-4c72-8028-35941b580a45.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,47b65fb9-0d86-4c72-8028-35941b580a45.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=47b65fb9-0d86-4c72-8028-35941b580a45</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">In the ongoing <a href="http://www.microsoft.com/events/series/archdesignsystems.mspx#Next%20Generation:%20.NET%20Framework%203.0%20and%20Vista">MSDN
Architecture Webcast Series</a> with broad coverage of all things WCF (see the
"Next Generation: .NET Framework 3.0 and Vista" section for archived and upcoming
content), I am <a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032299346&amp;EventCategory=4&amp;culture=en-US&amp;CountryCode=US">on
today</a> (8AM PST, 11AM EST, 17:00 CET), live from my kitchen table in Germany, with
a remix of my "RSS, REST, POX, Sites-as-Services" talks from MIX06 and TechEd. <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=47b65fb9-0d86-4c72-8028-35941b580a45" /></body>
      <title>Webcast Today....</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,47b65fb9-0d86-4c72-8028-35941b580a45.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/21/Webcast+Today.aspx</link>
      <pubDate>Wed, 21 Jun 2006 08:57:52 GMT</pubDate>
      <description>In the ongoing &lt;a href="http://www.microsoft.com/events/series/archdesignsystems.mspx#Next%20Generation:%20.NET%20Framework%203.0%20and%20Vista"&gt;MSDN
Architecture Webcast Series&lt;/a&gt;&amp;nbsp;with broad coverage of all things WCF (see the
"Next Generation: .NET Framework 3.0 and Vista" section for archived and upcoming
content), I am &lt;a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032299346&amp;amp;EventCategory=4&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;on
today&lt;/a&gt; (8AM PST, 11AM EST, 17:00 CET), live from&amp;nbsp;my kitchen table in Germany,&amp;nbsp;with
a remix of my "RSS, REST, POX, Sites-as-Services" talks from MIX06 and TechEd. &lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=47b65fb9-0d86-4c72-8028-35941b580a45" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,47b65fb9-0d86-4c72-8028-35941b580a45.aspx</comments>
      <category>Talks</category>
      <category>Talks/MIX06</category>
      <category>Talks/TechEd US</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=1d54f6d7-4860-4e7e-a020-6cab738770b0</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,1d54f6d7-4860-4e7e-a020-6cab738770b0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,1d54f6d7-4860-4e7e-a020-6cab738770b0.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=1d54f6d7-4860-4e7e-a020-6cab738770b0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Cool. I hadn't even seen this demo until now, even though we already have it for a
while. Our technical evangelist Craig McMurtry posted the <a href="http://wcf.netfx3.com/files/48/distributed_applications/entry2977.aspx">"Digital
Fortress"</a> demo, which is an implementation of the computer systems that play major
roles in Dan Brown's novel "Digital Fortress". There are several reasons why
I find this demo interesting and pretty amusing.
</p>
        <p>
First of all, it has a "Hollywood-Style UI", which is funny. It's got the huge full-screen
login screen with a "sort-of-looks-like-the-NSA" logo, a big count-down clock and
a "control screen" (below) with the gratuitous graphics and big buttons one might
expect. The other thing that's very interesting is that it is a <em>management
tools demo</em> (of all things). The key to bust the evil conspiracy is to trace
suspicious network activity across many nodes on the network and the script packaged
with the demo shows you how to get that done using the built-in WCF tracing facilities. <a href="http://wcf.netfx3.com/files/48/distributed_applications/entry2977.aspx">Download.</a></p>
        <p align="center">
          <img src="http://friends.newtelligence.net/clemensv/content/binary/fortress.jpg" border="0" />
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=1d54f6d7-4860-4e7e-a020-6cab738770b0" />
      </body>
      <title>WCF Goes To Hollywood.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,1d54f6d7-4860-4e7e-a020-6cab738770b0.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/21/WCF+Goes+To+Hollywood.aspx</link>
      <pubDate>Wed, 21 Jun 2006 08:39:35 GMT</pubDate>
      <description>&lt;p&gt;
Cool. I hadn't even seen this demo until now, even though we already have it for a
while.&amp;nbsp;Our technical evangelist Craig McMurtry posted the &lt;a href="http://wcf.netfx3.com/files/48/distributed_applications/entry2977.aspx"&gt;"Digital
Fortress"&lt;/a&gt; demo, which is an implementation of&amp;nbsp;the computer systems that play&amp;nbsp;major
roles in Dan Brown's novel "Digital Fortress". There are several&amp;nbsp;reasons&amp;nbsp;why
I find this demo interesting and pretty amusing.
&lt;/p&gt;
&lt;p&gt;
First of all, it has a "Hollywood-Style UI", which is funny. It's got the huge full-screen
login screen with a "sort-of-looks-like-the-NSA" logo, a big count-down clock and
a "control screen" (below) with the gratuitous graphics and big buttons one might
expect. The other thing that's very interesting is that&amp;nbsp;it is a &lt;em&gt;management
tools demo&lt;/em&gt; (of all things).&amp;nbsp;The key to bust the evil conspiracy is to trace
suspicious network activity across many nodes on the network and the script packaged
with the demo shows you how to get that done using the built-in WCF tracing facilities. &lt;a href="http://wcf.netfx3.com/files/48/distributed_applications/entry2977.aspx"&gt;Download.&lt;/a&gt;
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://friends.newtelligence.net/clemensv/content/binary/fortress.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=1d54f6d7-4860-4e7e-a020-6cab738770b0" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,1d54f6d7-4860-4e7e-a020-6cab738770b0.aspx</comments>
      <category>MSDN</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=6059315f-0d8e-4671-a883-9e6d15a48b02</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,6059315f-0d8e-4671-a883-9e6d15a48b02.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,6059315f-0d8e-4671-a883-9e6d15a48b02.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=6059315f-0d8e-4671-a883-9e6d15a48b02</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>[Note to self: Schedule the video taping session early in a bound-to-be-stressful
week, not 2 hours before you need to leave for the airport on Friday.]</em>
        </p>
        <p>
MSDN TV has a <a href="http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20060615WCFCV/manifest.xml">new
episode</a> featuring <a href="http://dictionary.reference.com/browse/yours truly">yours
truly</a> speaking about WCF bindings (and what they cause in the channel stack).
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6059315f-0d8e-4671-a883-9e6d15a48b02" />
      </body>
      <title>MSDN TV: WCF Bindings.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,6059315f-0d8e-4671-a883-9e6d15a48b02.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/18/MSDN+TV+WCF+Bindings.aspx</link>
      <pubDate>Sun, 18 Jun 2006 12:56:50 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;[Note to self: Schedule the video taping session early in a bound-to-be-stressful
week, not 2 hours before you need to leave for the airport on Friday.]&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
MSDN TV has a &lt;a href="http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20060615WCFCV/manifest.xml"&gt;new
episode&lt;/a&gt; featuring &lt;a href="http://dictionary.reference.com/browse/yours truly"&gt;yours
truly&lt;/a&gt; speaking about WCF bindings (and what they cause in the channel stack).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6059315f-0d8e-4671-a883-9e6d15a48b02" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,6059315f-0d8e-4671-a883-9e6d15a48b02.aspx</comments>
      <category>MSDN</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=57b03894-e197-4512-b9ea-648105890103</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,57b03894-e197-4512-b9ea-648105890103.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,57b03894-e197-4512-b9ea-648105890103.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=57b03894-e197-4512-b9ea-648105890103</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was sad when "Indigo" and "Avalon" went away. It'd be great if we'd have
a pool of cool legal-approved code-names for which we own the trademark rights and
which we could stick to. Think Delphi or Safari. "Indigo" was cool insofar as
it was very handy to refer to the technology set, but was removed far enough
from the specifics that it doesn't create a sharply defined, product-like island
within the larger managed-code landscape or has legacy connotations like "ADO.NET".
 Also, my talks these days could be 10 minutes shorter if I could refer to Indigo
instead of "Windows Communications Foundation". Likewise, my job title wouldn't have
to have a line wrap on the business card of I ever spelled it out in full.
</p>
        <p>
However, when I learned about the WinFX name going away (several weeks before the
public announcement) and the new "Vista Wave" technologies (WPF/WF/WCF/WCS) being rolled
up under the <a href="http://msdn.microsoft.com/winfx/">.NET Framework</a> brand,
I was quite happy. Ever since it became clear in 2004 that the grand plan to put
a complete, covers-all-and-everything managed API on top (and on quite a
bit of the bottom) of everything Windows would have to wait until siginificantly after
Vista and that therefore the Win16&gt;Win32&gt;WinFX continuity would not
tell the true story, that name made only limited sense to stick to. The .NET Framework
is the #1 choice for business applications and a well established brand. People refer
to themselves as being "dotnet" developers. But even though the .NET Framework covers
a lot of ground and "Indigo", "Avalon", "InfoCard", and "Workflow" are overwhelmingly
(or exclusively) managed-code based, there are still quite a few things in Windows
Vista that still require using P/Invoke or COM/Interop from managed code or unmanaged
code outright. That's not a problem. Something has to manage the managed code
and there's no urgent need to rewrite entire subsystems to managed code if you
only want to add or revise features. 
</p>
        <p>
So now all the new stuff is now part of the .NET Framework. That is a good, good,
good change. This says what it all is. 
</p>
        <p>
Admittedly confusing is the "3.0" bit. What we'll ship is a Framework 3.0 that rides
on top of the 2.0 CLR and includes the 2.0 versions of the Base-Class Library, Windows
Forms, and ASP.NET. It doesn't include the formerly-announced-as-to-be-part-of-3.0
technologies like VB9 (there you have the version number consistency flying out
the window outright), C# 3.0, and LINQ. Personally, I think that it might be
a tiny bit less confusing if the Framework had a version-number neutral name such
as ".NET Framework 2006" which would allow doing what we do now with less potential
for confusion, but only a tiny bit. Certainly not enough to stage a war
over "2006" vs. "3.0".
</p>
        <p>
It's a matter of project management reality and also one of platform predictability
that the ASP.NET, or Windows Forms teams do not and should not ship a full
major-version revision of their bits every year. They shipped Whidbey (2.0) in late
2005 and hence it's healthy for them to have boarded the scheduled-to-arrive-in-2007
boat heading to Orcas. We (the "WinFX" teams) subscribed to the Vista ship docking later
this year and we bring great innovation which will be preinstalled on every copy of
it. LINQ as well as VB9 and C# incorporating it on a language-level are
very obviously Visual Studio bound and hence they are on the Orcas ferry as well.
The .NET Framework is a steadily growing development platform that spans technologies
from the Developer Division, Connected Systems, Windows Server, Windows Client, SQL
Server, and other groups, and my gut feeling is that it will become the norm that
it will be extended off-cycle from the Developer Division's Visual Studio and
CLR releases. Whenever a big ship docks in the port, may it be Office, SQL, BizTalk,
Windows Server, or Windows Client, and as more and more of the still-unmanaged Win32/Win64
surface area gets wrapped, augmented or replaced by managed-code APIs over time and
entirely new things are added, there might be bits that fit into and update the
Framework.  
</p>
        <p>
So one sane way to think about the .NET Framework version number is that it merely
labels the overall package and not the individual assemblies and components included
within it. Up to 2.0 everything was pretty synchronized, but given the ever-increasing
scale of the thing, it's good to think of that being a lucky (even if intended) coindicence
of scheduling. This surely <a href="http://en.wikipedia.org/wiki/Microsoft_BackOffice">isn't
the first time</a> that packages were versioned independently of their components.
There was and is no reason for the ASP.NET team to gratuitously recompile their existing
bits with a new version number just to have the GAC look pretty and to create the
illusion that everything is new - and to break Visual Studio compatibility in the
process.
</p>
        <p>
Of course, once we cover 100% of the Win32 surface area, we can rename it all into
WinFX again ;-)  (just kidding)
</p>
        <p>
[All the usual "personal opinion" disclaimers apply to this post]
</p>
        <p>
          <font size="1">
            <em>Update:</em> Removed reference to "Win64".</font>
        </p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=57b03894-e197-4512-b9ea-648105890103" />
      </body>
      <title>Code-Name WinFX vs .NET Framework 3.0</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,57b03894-e197-4512-b9ea-648105890103.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/18/CodeName+WinFX+Vs+NET+Framework+30.aspx</link>
      <pubDate>Sun, 18 Jun 2006 12:39:48 GMT</pubDate>
      <description>&lt;p&gt;
I was sad when "Indigo" and "Avalon" went away. It'd be great&amp;nbsp;if we'd&amp;nbsp;have
a pool of cool legal-approved code-names for which we own the trademark rights and
which we could stick to.&amp;nbsp;Think Delphi or Safari. "Indigo" was cool insofar as
it was very handy to refer to the technology set, but&amp;nbsp;was removed&amp;nbsp;far&amp;nbsp;enough
from the specifics that it doesn't&amp;nbsp;create a sharply defined, product-like island
within the larger managed-code landscape or has legacy connotations&amp;nbsp;like "ADO.NET".
&amp;nbsp;Also, my talks these days could be 10 minutes shorter if I could refer to Indigo
instead of "Windows Communications Foundation". Likewise, my job title wouldn't have
to&amp;nbsp;have a line wrap on the business card of I ever spelled it out in full.
&lt;/p&gt;
&lt;p&gt;
However, when I learned about the WinFX name going away (several weeks before the
public announcement) and the new "Vista Wave" technologies (WPF/WF/WCF/WCS) being&amp;nbsp;rolled
up&amp;nbsp;under the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/winfx/"&gt;.NET Framework&lt;/a&gt;&amp;nbsp;brand,
I was&amp;nbsp;quite happy. Ever since it became clear in 2004 that the grand plan to&amp;nbsp;put
a complete,&amp;nbsp;covers-all-and-everything&amp;nbsp;managed API on top (and on quite a
bit of the bottom) of everything Windows would have to wait until siginificantly after
Vista and that&amp;nbsp;therefore&amp;nbsp;the Win16&amp;gt;Win32&amp;gt;WinFX continuity would not
tell the true story, that name made only limited sense to stick to. The .NET Framework
is the #1 choice for business applications and a well established brand. People refer
to themselves as being "dotnet" developers. But even though the .NET Framework covers
a lot of ground and "Indigo", "Avalon", "InfoCard", and "Workflow" are&amp;nbsp;overwhelmingly
(or exclusively) managed-code based, there are still quite a few things in Windows
Vista that still require using P/Invoke or COM/Interop from managed code or unmanaged
code outright. That's not a problem.&amp;nbsp;Something has to manage the managed code
and there's no urgent need to rewrite entire subsystems to managed code if&amp;nbsp;you
only want to add or revise features.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
So now all the new stuff is now part of the .NET Framework. That is a good, good,
good&amp;nbsp;change. This says what it all is. 
&lt;/p&gt;
&lt;p&gt;
Admittedly confusing is the "3.0" bit. What we'll ship is a Framework 3.0 that rides
on top of the 2.0 CLR and includes the 2.0 versions of the Base-Class Library, Windows
Forms,&amp;nbsp;and ASP.NET. It doesn't include the formerly-announced-as-to-be-part-of-3.0
technologies like VB9 (there&amp;nbsp;you have the version number consistency flying out
the window outright), C# 3.0, and&amp;nbsp;LINQ. Personally, I think&amp;nbsp;that it might&amp;nbsp;be
a tiny bit less confusing if the Framework had a version-number neutral name such
as ".NET Framework 2006" which would allow&amp;nbsp;doing what we do now with less potential
for confusion, but only a tiny bit.&amp;nbsp;Certainly not enough to&amp;nbsp;stage a war
over "2006" vs. "3.0".
&lt;/p&gt;
&lt;p&gt;
It's a matter of project management&amp;nbsp;reality and also one of platform predictability
that the ASP.NET, or Windows Forms&amp;nbsp;teams&amp;nbsp;do not and should not ship a full
major-version revision of their bits every year. They shipped Whidbey (2.0) in late
2005 and hence&amp;nbsp;it's healthy for them&amp;nbsp;to&amp;nbsp;have boarded the scheduled-to-arrive-in-2007
boat heading to Orcas. We (the "WinFX" teams) subscribed to the Vista ship&amp;nbsp;docking&amp;nbsp;later
this year and we bring great innovation which will be preinstalled on every copy of
it. LINQ&amp;nbsp;as well as&amp;nbsp;VB9 and C# incorporating it on a language-level are
very obviously Visual Studio bound and hence they are on the Orcas ferry as well.
The .NET Framework is a steadily growing development platform that spans technologies
from the Developer Division, Connected Systems, Windows Server, Windows Client, SQL
Server, and other groups, and my gut feeling is that it will become the norm that
it will be extended off-cycle from the Developer Division's&amp;nbsp;Visual Studio and
CLR releases. Whenever a big ship docks in the port, may it be Office, SQL, BizTalk,
Windows Server, or Windows Client, and as more and more of the still-unmanaged Win32/Win64
surface area gets wrapped, augmented or replaced by managed-code APIs over time and
entirely new things are added, there might be bits that&amp;nbsp;fit into and update the
Framework. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
So one sane way to think about the .NET Framework version number is that&amp;nbsp;it merely
labels the overall package and not the individual assemblies and components included
within it. Up to 2.0&amp;nbsp;everything was pretty synchronized, but&amp;nbsp;given the ever-increasing
scale of the thing, it's good to think of that being a lucky (even if intended) coindicence
of scheduling. This surely &lt;a href="http://en.wikipedia.org/wiki/Microsoft_BackOffice"&gt;isn't
the first time&lt;/a&gt; that&amp;nbsp;packages were versioned independently of their components.
There was and is no reason for the ASP.NET team to gratuitously recompile their existing
bits with a new version number just to have the GAC look pretty and to create the
illusion that everything is new - and to break Visual Studio compatibility in the
process.
&lt;/p&gt;
&lt;p&gt;
Of course, once we cover 100% of the Win32 surface area, we can rename it all into
WinFX again ;-)&amp;nbsp; (just kidding)
&lt;/p&gt;
&lt;p&gt;
[All the usual&amp;nbsp;"personal opinion" disclaimers apply to this post]
&lt;/p&gt;
&lt;p&gt;
&lt;font size=1&gt;&lt;em&gt;Update:&lt;/em&gt; Removed reference to "Win64".&lt;/font&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=57b03894-e197-4512-b9ea-648105890103" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,57b03894-e197-4512-b9ea-648105890103.aspx</comments>
      <category>IT Strategy</category>
      <category>Technology</category>
      <category>Technology/ASP.NET</category>
      <category>Technology/Avalon</category>
      <category>Technology/CLR</category>
      <category>Technology/Indigo</category>
      <category>Technology/Longhorn</category>
      <category>Technology/WCF</category>
      <category>Technology/Windows</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=1e863a78-33d6-4a85-b5e2-f7d241b423d9</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,1e863a78-33d6-4a85-b5e2-f7d241b423d9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,1e863a78-33d6-4a85-b5e2-f7d241b423d9.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=1e863a78-33d6-4a85-b5e2-f7d241b423d9</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.mcateer-roarty.info/blogs/the_roarty_blog/archive/2006/06/16/290.aspx">I've
been quoted</a> as to have said so at TechEd and I'll happily repeat it: "XML is the
assembly language of Web 2.0", even though some (and likely some more) disagree. <a href="http://www.codenameindigo.net/PermaLink.aspx?guid=a806afa2-2415-4e86-8ea4-88a312b1823b">James
Speer</a> writes <em>"<font face="MS Reference Sans Serif">Besides, Assembly
Language is hard, XML isn’t."</font></em> , which I have to disagree with. 
</p>
        <p>
True, throwing together some angle brackets isn't the hardest thing in the world,
but beating things into the right shape is hard and probably even harder than
in assembly. Yes, one can totally, after immersing oneself in the intricacies of Schema,
write complex types and ponder for days and months about the right use of attributes
and elements. It's absolutely within reach for a WSDL zealot to code up messages,
portTypes and operations by hand. But please, if you think that's the right way to
do things, I also demand that you write and apply your <a href="http://msdn.microsoft.com/ws/2005/07/ws-security-policy/">security
policy</a> in angle bracket notation from the top of your head and generate WCF config
from that using svcutil instead of just throwing a binding together, because
XML is so easy. Oh? Too hard? Well, it turns out that except for our developers
and testers who are focusing on getting these mappings right, nobody on our product
team would probably ever even want to try writing such a beast by hand for any code
that sits above the deep-down guts of our stack. This isn't the fault of the specifications
(or people here being ignorant), but it's a function of security being hard and the
related metadata being complex. Similar things, even though the complexity isn't
quite as extreme there, can be said about the other extensions to the policy
framework such as <a href="http://msdn.microsoft.com/library/en-us/dnglobspec/html/WS-RMPolicy.pdf">WS-RM
Policy</a> or those for <a href="http://msdn.microsoft.com/ws/2005/08/ws-atomictransaction/">WS-AT</a>. 
</p>
        <p>
As we're getting to the point where full range of functionality covered by WS-* specifications
is due to hit the mainstream by us releasing WCF and our valued competitors releasing
their respective implementations, hand-crafted contracts will become increasingly
meaningless, because it's beyond the capacity of anyone whose job it is to build solutions
for their customers to write complete set of contracts that not only ensures simple
data interop but also protocol interop. Just as there were days that all you
needed was assembly and INT21h to write a DOS program (yikes) or knowledge
of "C" alongside stdio.h and fellows to write anything for everthing, things
are changing now in the same way in Web Services land. Command of XSD and WSDL is
no longer sufficient, all the other stuff is just as important to make things work. 
</p>
        <p>
Our WCF [DataContract] doesn't support attributes. That's a deliberate choice because
we want to enforce simplicity and enhance interoperability of schemas. We put
an abstraction over XSD and limit the control over it, because we want to simplify
the stuff that goes across the wire. We certainly allow everyone to use the XmlSerializer
with all of it's attribute based fine-grained control over schema, even though there
are quite a few Schema constructs that even that doesn't support when building schema
from such metadata. If you choose to, you can just ignore all of our serialization
magic and fiddle with the XML Infoset outright and supply your own schema. However,
XML and Schema are specifications that everyone and their dog wanted to get features
into and Schema is hopelessly overengineered. Ever since we all (the industry, not
only MS) boarded the SOAP/WS train, we're debating how to constrain the features
of that monster to a reasonable subset that makes sense and the debate doesn't want
to end.
</p>
        <p>
James writes that he <em>"</em><font face="MS Reference Sans Serif"><em>take</em>[s]<em> a
lot of care in terms of elements vs. attributes and mak</em>[es]<em> sure the structure
of the XML is business-document-like", </em>which only really makes sense if XML documents
used in WS scenarios were meant for immediate human consumption, which they're not. </font></p>
        <p>
          <font face="Verdana">We want to promote a model that is simple and consistent to serialize
to and from on any platform and that things like the differentiation between
attributes and elements doesn't stand in the way of allowing a 1:1 mapping into alternate,
non-XML serialization formats such as JSON or what-have-you (most of which
don't care about that sort of differentiation).  </font>
          <font face="MS Reference Sans Serif">James'
statement about "business-document-like" structures is also interesting considering
EDIFACT, X.12 or SWIFT, all of which only know records, fields and values,
and don't care about that sort of subtle element/attribute differentation, either.
(Yes, no of those might be "hip" any more, but they are implemented and power a considerable
chunk of the world economy's data exchange).</font>
        </p>
        <p>
          <font face="MS Reference Sans Serif">By now, XML is the foundation for everything
that happens on the web, and I surely don't want to have it go away. But have arrived at
the point where matters have gotten so complicated that a layer of abstraction over
pretty much all things XML has become a necessity for everyone who makes their money
building customer solutions and not by teaching or writing about XML. In
my last session at TechEd, I asked a room of about 200 people "Who of you hand-writes
XSLT transforms?" 4 hands. "Who of you <em>used to</em> hand-write XSLT transforms?"
40+ hands. I think it's safe to assume that a bunch of those folks who have sworn
off masochism and no longer hand-code XSLT are now using tools like the BizTalk Mapper
or Altova's MapForce, which means that XSL/T is alive and kicking, but only downstairs
in the basement. However, the abstractions that these tools provide also allow
bypassing XSLT altogether and generate the transformation logic straight into compiled
C++, Java, or C# code, which is what MapForce offers. </font>
          <font face="MS Reference Sans Serif">WSDL
is already walking down that path.</font>
        </p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=1e863a78-33d6-4a85-b5e2-f7d241b423d9" />
      </body>
      <title>XML is the assembly language of Web 2.0</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,1e863a78-33d6-4a85-b5e2-f7d241b423d9.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/18/XML+Is+The+Assembly+Language+Of+Web+20.aspx</link>
      <pubDate>Sun, 18 Jun 2006 10:24:01 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.mcateer-roarty.info/blogs/the_roarty_blog/archive/2006/06/16/290.aspx"&gt;I've
been quoted&lt;/a&gt; as to have said so at TechEd and I'll happily repeat it: "XML is the
assembly language of Web 2.0", even though some (and likely some more) disagree. &lt;a href="http://www.codenameindigo.net/PermaLink.aspx?guid=a806afa2-2415-4e86-8ea4-88a312b1823b"&gt;James
Speer&lt;/a&gt;&amp;nbsp;writes&amp;nbsp;&lt;em&gt;"&lt;font face="MS Reference Sans Serif"&gt;Besides, Assembly
Language is hard, XML isn’t."&lt;/font&gt;&lt;/em&gt; ,&amp;nbsp;which I have to disagree with. 
&lt;/p&gt;
&lt;p&gt;
True, throwing together some angle brackets isn't the hardest thing in the world,
but beating things into the right&amp;nbsp;shape is hard and probably even harder than
in assembly. Yes, one can totally, after immersing oneself in the intricacies of Schema,
write complex types and ponder for days and months about the right use of attributes
and elements. It's absolutely within reach for a WSDL zealot to code up messages,
portTypes and operations by hand. But please, if you think that's the right way to
do things, I also demand that you write and apply your &lt;a href="http://msdn.microsoft.com/ws/2005/07/ws-security-policy/"&gt;security
policy&lt;/a&gt; in angle bracket notation from the top of your head and generate WCF config
from that using&amp;nbsp;svcutil instead of just throwing a binding together, because
XML is so easy.&amp;nbsp;Oh? Too hard? Well, it turns out that except for our developers
and testers who are focusing on getting these mappings right, nobody on our product
team would probably ever even want to try writing such a beast by hand for any code
that sits above the deep-down guts of our stack. This isn't the fault of the specifications
(or people here being ignorant), but it's a function of security being hard and the
related metadata being complex.&amp;nbsp;Similar things, even though the complexity isn't
quite as extreme there,&amp;nbsp;can be said about the&amp;nbsp;other extensions to the policy
framework such as &lt;a href="http://msdn.microsoft.com/library/en-us/dnglobspec/html/WS-RMPolicy.pdf"&gt;WS-RM
Policy&lt;/a&gt;&amp;nbsp;or those for&amp;nbsp;&lt;a href="http://msdn.microsoft.com/ws/2005/08/ws-atomictransaction/"&gt;WS-AT&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
As we're getting to the point where full range of functionality covered by WS-* specifications
is due to hit the mainstream by us releasing WCF and our valued competitors releasing
their respective implementations, hand-crafted contracts will become increasingly
meaningless, because it's beyond the capacity of anyone whose job it is to build solutions
for their customers to write complete set of contracts that not only ensures simple
data interop but also protocol interop.&amp;nbsp;Just as there were days that all you
needed was assembly and INT21h&amp;nbsp;to write a DOS program (yikes) or&amp;nbsp;knowledge
of "C"&amp;nbsp;alongside stdio.h and fellows to write anything for everthing, things
are changing now in the same way in Web Services land. Command of XSD and WSDL&amp;nbsp;is
no longer sufficient, all the other stuff is just as important to make things work. 
&lt;/p&gt;
&lt;p&gt;
Our WCF [DataContract] doesn't support attributes. That's a deliberate choice because
we want to enforce simplicity and enhance interoperability&amp;nbsp;of schemas. We put
an abstraction over XSD and limit the control over it, because we want to simplify
the stuff that goes across the wire. We certainly allow&amp;nbsp;everyone to use the XmlSerializer
with all of it's attribute based fine-grained control over schema, even though there
are quite a few Schema constructs that even that doesn't support when building schema
from such metadata. If you choose to, you can just ignore all of our serialization
magic and fiddle with the XML Infoset outright and supply your own schema. However,
XML and Schema are specifications that everyone and their dog wanted to get features
into and Schema is hopelessly overengineered. Ever since we all (the industry, not
only MS)&amp;nbsp;boarded the SOAP/WS train, we're debating how to constrain the features
of that monster to a reasonable subset that makes sense and the debate doesn't want
to end.
&lt;/p&gt;
&lt;p&gt;
James writes that he &lt;em&gt;"&lt;/em&gt;&lt;font face="MS Reference Sans Serif"&gt;&lt;em&gt;take&lt;/em&gt;[s]&lt;em&gt; a
lot of care in terms of elements vs. attributes and mak&lt;/em&gt;[es]&lt;em&gt; sure the structure
of the XML is business-document-like", &lt;/em&gt;which only really makes sense if XML documents
used in WS scenarios were meant for immediate human consumption, which they're not. &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face=Verdana&gt;We want to promote a model that is simple and consistent to serialize
to and from on any platform and that&amp;nbsp;things like&amp;nbsp;the differentiation between
attributes and elements doesn't stand in the way of allowing a 1:1 mapping into&amp;nbsp;alternate,
non-XML&amp;nbsp;serialization formats such as JSON or what-have-you&amp;nbsp;(most of which
don't&amp;nbsp;care about that sort of differentiation).&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font face="MS Reference Sans Serif"&gt;James'
statement about "business-document-like" structures is also interesting&amp;nbsp;considering
EDIFACT, X.12&amp;nbsp;or SWIFT, all of which&amp;nbsp;only know records, fields and values,
and don't care about that sort of subtle element/attribute differentation, either.
(Yes, no of those might be "hip" any more, but they are implemented and power a considerable
chunk of the world economy's data exchange).&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="MS Reference Sans Serif"&gt;By now, XML is the foundation for everything
that happens on the web, and I surely don't want to have it go away. But have arrived&amp;nbsp;at
the point where matters have gotten so complicated that a layer of abstraction over
pretty much all things XML has become a necessity for everyone who makes their money
building customer solutions and not by&amp;nbsp;teaching or writing about XML.&amp;nbsp;In
my last session at TechEd, I asked a room of about 200 people "Who of you&amp;nbsp;hand-writes
XSLT transforms?" 4 hands. "Who of you &lt;em&gt;used to&lt;/em&gt;&amp;nbsp;hand-write XSLT transforms?"
40+ hands. I think it's safe to assume that a bunch of those folks who&amp;nbsp;have sworn
off masochism and no longer hand-code XSLT are now using tools like the BizTalk Mapper
or Altova's MapForce, which means that XSL/T is alive and kicking, but&amp;nbsp;only downstairs
in the basement.&amp;nbsp;However, the abstractions that these tools provide also allow
bypassing XSLT altogether and generate the transformation logic straight into compiled
C++, Java, or C# code, which is what MapForce offers.&amp;nbsp;&lt;/font&gt;&lt;font face="MS Reference Sans Serif"&gt;WSDL
is already walking down that path.&lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=1e863a78-33d6-4a85-b5e2-f7d241b423d9" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,1e863a78-33d6-4a85-b5e2-f7d241b423d9.aspx</comments>
      <category>Talks/TechEd US</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=479cc904-6008-4d1d-ae2a-c53d5d101ce6</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,479cc904-6008-4d1d-ae2a-c53d5d101ce6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,479cc904-6008-4d1d-ae2a-c53d5d101ce6.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=479cc904-6008-4d1d-ae2a-c53d5d101ce6</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My first of two sessions this week here at TechEd is on Thursday, at 2:45pm in room
153ABC on "Designing Bindings and Contracts". 
</p>
        <p>
I realize that the title sounds a bit abstract and a different way to put this would
be "How to choose the correct bindings and what to consider about contracts in a variety
of architectual scenarios", but that would have been a bit long as a title. in the
talk I'll explain the system-defined bindings that we ship in the product so that
we've got stuff to work with and then I'll get out the tablet pen and draw up a bunch
of scenarios and how our bindings (read: communication options) make sense in those.
What's the best choice for N-Tier inside and outside of the corporate perimeter, what
do you do for queueing-style apps, how do you implement volatile or durable 1:1 pub/sub,
how do you implement broadcasts and where do they make sense, etc. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=479cc904-6008-4d1d-ae2a-c53d5d101ce6" />
      </body>
      <title>TechEd: What I am going to talk about on Thursday</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,479cc904-6008-4d1d-ae2a-c53d5d101ce6.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/13/TechEd+What+I+Am+Going+To+Talk+About+On+Thursday.aspx</link>
      <pubDate>Tue, 13 Jun 2006 16:09:57 GMT</pubDate>
      <description>&lt;p&gt;
My first of two sessions this week here at TechEd is on Thursday, at 2:45pm in room
153ABC on "Designing Bindings and Contracts". 
&lt;/p&gt;
&lt;p&gt;
I realize that the title sounds a bit abstract and a different way to put this would
be "How to choose the correct bindings and what to consider about contracts in a variety
of architectual scenarios", but that would have been a bit long as a title. in the
talk I'll explain the system-defined bindings that we ship in the product so that
we've got stuff to work with and then I'll get out the tablet pen and draw up a bunch
of scenarios and how our bindings (read: communication options) make sense in those.
What's the best choice for N-Tier inside and outside of the corporate perimeter, what
do you do for queueing-style apps, how do you implement volatile or durable 1:1 pub/sub,
how do you implement broadcasts and where do they make sense, etc. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=479cc904-6008-4d1d-ae2a-c53d5d101ce6" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,479cc904-6008-4d1d-ae2a-c53d5d101ce6.aspx</comments>
      <category>Architecture</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=ca3a1146-4d0e-45a5-9369-9a74ffdeda71</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,ca3a1146-4d0e-45a5-9369-9a74ffdeda71.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,ca3a1146-4d0e-45a5-9369-9a74ffdeda71.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=ca3a1146-4d0e-45a5-9369-9a74ffdeda71</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We've just released the "<a href="http://wcf.netfx3.com/files/folders/encoders/entry3262.aspx">Windows
Communication Foundation RSS Toolkit</a>" on our new community site. This toolkit,
which comes with complete source code, illustrates how to expose ATOM and RSS
feeds through WCF endpoints. I will discuss the toolkit in my session <strong>CON339,
Room 107ABC, Friday 10:45am</strong> here at TechEd. 
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=ca3a1146-4d0e-45a5-9369-9a74ffdeda71" />
      </body>
      <title>TechEd: WCF RSS Toolkit released</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,ca3a1146-4d0e-45a5-9369-9a74ffdeda71.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/13/TechEd+WCF+RSS+Toolkit+Released.aspx</link>
      <pubDate>Tue, 13 Jun 2006 14:23:12 GMT</pubDate>
      <description>&lt;p&gt;
We've just released the "&lt;a href="http://wcf.netfx3.com/files/folders/encoders/entry3262.aspx"&gt;Windows
Communication Foundation RSS Toolkit&lt;/a&gt;" on our new community site. This toolkit,
which comes with complete source code,&amp;nbsp;illustrates how to expose ATOM and RSS
feeds through WCF endpoints. I will discuss the toolkit in my session &lt;strong&gt;CON339,
Room 107ABC, Friday 10:45am&lt;/strong&gt; here at TechEd. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=ca3a1146-4d0e-45a5-9369-9a74ffdeda71" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,ca3a1146-4d0e-45a5-9369-9a74ffdeda71.aspx</comments>
      <category>Talks/TechEd US</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=62b10909-f329-4cc6-8a7e-a9123559a7b9</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,62b10909-f329-4cc6-8a7e-a9123559a7b9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,62b10909-f329-4cc6-8a7e-a9123559a7b9.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=62b10909-f329-4cc6-8a7e-a9123559a7b9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just so that you know: In addition to the regular breakout sessions, we have a number
of interactive <a href="http://wcf.netfx3.com/content/TechEd2006ChalkTalkSchedule.aspx">chalk
talks</a> scheduled here at the Connected Systems Technical Learning Center in the
Expo Hall. Come by.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=62b10909-f329-4cc6-8a7e-a9123559a7b9" />
      </body>
      <title>TechEd: WCF and Workflow Chalk Talks</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,62b10909-f329-4cc6-8a7e-a9123559a7b9.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/12/TechEd+WCF+And+Workflow+Chalk+Talks.aspx</link>
      <pubDate>Mon, 12 Jun 2006 14:38:15 GMT</pubDate>
      <description>&lt;p&gt;
Just so that you know: In addition to the regular breakout sessions, we have a number
of interactive &lt;a href="http://wcf.netfx3.com/content/TechEd2006ChalkTalkSchedule.aspx"&gt;chalk
talks&lt;/a&gt; scheduled here at the Connected Systems Technical Learning Center in the
Expo Hall. Come by.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=62b10909-f329-4cc6-8a7e-a9123559a7b9" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,62b10909-f329-4cc6-8a7e-a9123559a7b9.aspx</comments>
      <category>Talks/TechEd US</category>
      <category>Technology</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
      <category>Technology/Workflow</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=76e10b03-8d1a-4e17-82c8-32a14f8debae</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,76e10b03-8d1a-4e17-82c8-32a14f8debae.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,76e10b03-8d1a-4e17-82c8-32a14f8debae.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=76e10b03-8d1a-4e17-82c8-32a14f8debae</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is my first TechEd! - as a Microsoft employee. It's of course not my first tech
event in my new job (Egypt, Jordan, UK, France, Switzerland, Holland, Belgium, Denmark,
Las Vegas/USA, Slovenia, and Israel are on the year-to-date list - on top
of three long-distance commutes to Redmond), but the big TechEds are always special.
It'll be fun. Come by the Connected Systems area in the exhibition hall and find me
to chat if you are here in Boston.
</p>
        <p>
Frankly, I didn't expect a Sunday night keynote to be nearly as well attended as it
was, but it looks that experiment mostly worked. The theme of the keynote were <a href="http://www.microsoft.com/presspass/features/2006/jun06/06-11Promises.mspx">Microsoft's
4 Core Promises</a> for IT Pros and Developers nicely wrapped into a video story based
on the TV show "24" and with that show's IT superwoman Chloe O'Brian (actress <a href="http://imdb.com/name/nm0707476/">Mary
Lynn Rajskub</a>) up on stage with Bob Muglia (our team's VP far up above in my chain
of command), who acted as the MC for the show. Finally we got an apology
from a Hollywood character for all the IT idiocy the put up on screen. Thanks, Chloe.
</p>
        <p>
Our team has a lot of very cool stuff to talk about at this show. The first highlight
is John Justice's WCF Intro talk (Session CON208, Room 157ABC) <strong>today at 5:00pm</strong> with
a "meet the team" panel Q&amp;A session at the end. Block the time.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=76e10b03-8d1a-4e17-82c8-32a14f8debae" />
      </body>
      <title>TechEd 2006 U.S. Kicks Off</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,76e10b03-8d1a-4e17-82c8-32a14f8debae.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/12/TechEd+2006+US+Kicks+Off.aspx</link>
      <pubDate>Mon, 12 Jun 2006 12:48:51 GMT</pubDate>
      <description>&lt;p&gt;
This is my first TechEd! - as a Microsoft employee. It's of course not my first tech
event in my new job (Egypt, Jordan, UK, France, Switzerland, Holland, Belgium, Denmark,
Las Vegas/USA, Slovenia, and Israel&amp;nbsp;are on the year-to-date list -&amp;nbsp;on top
of&amp;nbsp;three long-distance commutes to Redmond), but the big TechEds are always special.
It'll be fun. Come by the Connected Systems area in the exhibition hall and find me
to chat if you are here in Boston.
&lt;/p&gt;
&lt;p&gt;
Frankly, I didn't expect a Sunday night keynote to be nearly as well attended as it
was, but it looks that experiment mostly worked. The theme of the keynote were&amp;nbsp;&lt;a href="http://www.microsoft.com/presspass/features/2006/jun06/06-11Promises.mspx"&gt;Microsoft's
4 Core Promises&lt;/a&gt; for IT Pros and Developers nicely wrapped into a video story based
on the TV show "24" and with that show's&amp;nbsp;IT superwoman&amp;nbsp;Chloe O'Brian (actress &lt;a href="http://imdb.com/name/nm0707476/"&gt;Mary
Lynn Rajskub&lt;/a&gt;) up on stage with Bob Muglia (our team's VP far up above in my chain
of command), who&amp;nbsp;acted as&amp;nbsp;the MC for the show. Finally we got an apology
from a Hollywood character for all the IT idiocy the put up on screen. Thanks, Chloe.
&lt;/p&gt;
&lt;p&gt;
Our team has a lot of very cool stuff to&amp;nbsp;talk about at this show. The first highlight
is John Justice's WCF Intro talk (Session CON208, Room 157ABC) &lt;strong&gt;today at 5:00pm&lt;/strong&gt; with
a "meet the team" panel Q&amp;amp;A session at the end.&amp;nbsp;Block the time.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=76e10b03-8d1a-4e17-82c8-32a14f8debae" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,76e10b03-8d1a-4e17-82c8-32a14f8debae.aspx</comments>
      <category>Technology</category>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=47add500-56af-4611-83f1-b13c8068a6f8</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,47add500-56af-4611-83f1-b13c8068a6f8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,47add500-56af-4611-83f1-b13c8068a6f8.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=47add500-56af-4611-83f1-b13c8068a6f8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Late last night, my colleague <a href="http://blogs.msdn.com/jamescon/default.aspx">James
Conard</a>, who has worked and worked and worked tirelessly on this for the past
few months and has shown great patience with a big group of people pulling into
all sorts of directions as we got this together has flipped the switch to turn
on the new .NET Framework 3.0 community portal family at <a href="http://www.netfx3.com/">netfx3.com</a></p>
        <p>
The new Windows Communication Foundation community home is at <a href="http://wcf.netfx3.com/">http://wcf.netfx3.com</a> and
it's a great improvement over the small, hastily-thown-together site that we used
to have. There'll be a number of news bits and announcements throughout and after
TechEd at the new site, so it might be a good idea to subscribe to <a href="http://wcf.netfx3.com/blogs/news_and_announcements/rss.aspx">the
feed</a> now. 
</p>
        <p>
My official "Welcome!" post over on the new site is <a href="http://wcf.netfx3.com/blogs/news_and_announcements/archive/2006/06/12/Come-on-in_2100_-Welcome-to-our-new-home_2100_.aspx">here</a>,
the James' site-wide welcome message can be found <a href="http://www.netfx3.com/blogs/news_and_announcements/archive/2006/06/11/Welcome-to-NetFx3.com.aspx">here</a>.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=47add500-56af-4611-83f1-b13c8068a6f8" />
      </body>
      <title>A New Home on the Web for the Windows Communication Foundation and the .NET Framework 3.0</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,47add500-56af-4611-83f1-b13c8068a6f8.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/12/A+New+Home+On+The+Web+For+The+Windows+Communication+Foundation+And+The+NET+Framework+30.aspx</link>
      <pubDate>Mon, 12 Jun 2006 12:03:33 GMT</pubDate>
      <description>&lt;p&gt;
Late last night, my colleague &lt;a href="http://blogs.msdn.com/jamescon/default.aspx"&gt;James
Conard&lt;/a&gt;, who has worked and worked&amp;nbsp;and worked tirelessly on this for the&amp;nbsp;past
few months&amp;nbsp;and has shown great patience with a big group of people pulling into
all sorts of directions as we got this together&amp;nbsp;has flipped the switch to turn
on the new .NET Framework 3.0 community portal family at &lt;a href="http://www.netfx3.com/"&gt;netfx3.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The new Windows Communication Foundation community home is at &lt;a href="http://wcf.netfx3.com/"&gt;http://wcf.netfx3.com&lt;/a&gt; and
it's a great improvement over the small, hastily-thown-together site that we used
to have. There'll be a number of news bits and announcements throughout and after
TechEd at the new site, so it might be a good idea to subscribe to &lt;a href="http://wcf.netfx3.com/blogs/news_and_announcements/rss.aspx"&gt;the
feed&lt;/a&gt;&amp;nbsp;now.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
My official "Welcome!" post over on the new site is &lt;a href="http://wcf.netfx3.com/blogs/news_and_announcements/archive/2006/06/12/Come-on-in_2100_-Welcome-to-our-new-home_2100_.aspx"&gt;here&lt;/a&gt;,
the James' site-wide welcome message can be found &lt;a href="http://www.netfx3.com/blogs/news_and_announcements/archive/2006/06/11/Welcome-to-NetFx3.com.aspx"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=47add500-56af-4611-83f1-b13c8068a6f8" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,47add500-56af-4611-83f1-b13c8068a6f8.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=6ce2b8fe-93fd-421c-a685-15fe145963e5</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,6ce2b8fe-93fd-421c-a685-15fe145963e5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,6ce2b8fe-93fd-421c-a685-15fe145963e5.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=6ce2b8fe-93fd-421c-a685-15fe145963e5</wfw:commentRss>
      <title>Doug's Connected Applications Blog Report / June 3</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,6ce2b8fe-93fd-421c-a685-15fe145963e5.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/07/Dougs+Connected+Applications+Blog+Report+June+3.aspx</link>
      <pubDate>Wed, 07 Jun 2006 08:04:37 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.douglasp.com"&gt;Doug Purdy&lt;/a&gt;, our&amp;nbsp;Group Program Manager,&amp;nbsp;runs
a wodge of home-cooked code every&amp;nbsp;now and then&amp;nbsp;to produce the link list
below. I thought that you all out there&amp;nbsp;might find that valuable and&amp;nbsp;therefore
I stole a copy of the list for you.
&lt;/p&gt;
&lt;p&gt;
&lt;a name=_MailEndCompose&gt;&lt;b&gt;&lt;span lang=EN-US style="COLOR: #1f497d; mso-themecolor: dark2"&gt;W&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;orkflow&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/advancedworkflow/archive/2006/05/19/602116.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Passivation
(Dehydration, Unloading) Policy [5/19/2006 4:38:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Advanced Workflow: Enabling Tricky Scenarios&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/pandrew/archive/2006/05/29/610389.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;A
couple of great new workflow articles [5/29/2006 3:28:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Paul Andrew&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/pandrew/archive/2006/05/23/605611.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta 2 is Released [5/23/2006 6:20:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Paul Andrew&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/pandrew/archive/2006/05/17/600216.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Bill
Gates exec email mentions Windows Workflow Foundation [5/17/2006 9:11:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Paul Andrew&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/moustafa/archive/2006/05/21/603415.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Define
and execute WF rules on any target object [5/21/2006 11:50:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Moustafa Khalil Ahmed's Space&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,700e8619-de82-4ecb-8c3f-ad60b001cf47.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Services
and the Business/IT Gap [5/30/2006 8:30:59 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt;&lt;?xml:namespace prefix = st1 /&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:place w:st="on"&gt;
&lt;st1:City w:st="on"&gt;Enterprise&lt;/st1:City&gt;
&lt;/st1:place&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,4cceb7d7-33eb-411d-b5b5-863e0e8058c3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WorkflowDesigner
hosting and Rules [6/1/2006 11:13:15 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Jon Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,ffd586d5-e24c-4a3f-b0d8-6530d5dca507.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WorkflowInstance.GetWorkflowDefinition
[6/1/2006 10:27:50 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- Jon
Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,e81b5616-f9f7-4415-b3a7-84d56baa02a1.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Absolutely
- I am a Quicklearn instructor - this proves it [5/25/2006 10:49:02 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Jon Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,5f4d8c41-73bf-4d7f-93b4-8934130a783b.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WF
and Serialization Part One [5/23/2006 9:42:25 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Jon Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,d928e23e-5b1c-4c92-9aec-7361afd15117.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Dave
Green on using workflow [5/17/2006 9:40:10 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Jon Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/dbox/archive/2006/05/20/24599.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Bracha
and Bray on Continuations [5/20/2006 7:11:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Don Box&lt;/st1:PersonName&gt;
's Spoutlet&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.gazitt.com/Blog/PermaLink,guid,bb8e57a7-8b2a-476f-b4f2-15499baf5d5a.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta2 has officially shipped [5/23/2006 11:03:05 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
OhmBlog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/jeffsch/archive/2006/05/23/24835.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WF
Q &amp;amp; A [5/23/2006 8:18:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Jeffrey Schlimmer&lt;/st1:PersonName&gt;
's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/richardt/archive/2006/05/18/601428.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;VSlive
2006 [5/18/2006 2:14:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Welcome to The Metaverse&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605724.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Biztalk
WSE 3.0 Adapter Ships [5/23/2006 9:21:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/06/03/615621.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006: WCF and WF Chalk Talk Schedule [6/2/2006 9:42:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/05/20/602956.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 - Chalk Talks on Custom Channels [5/20/2006 7:43:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt;&lt;?xml:namespace prefix = o /&gt; --
Kavitak's WebLog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Transactions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/advancedworkflow/archive/2006/05/19/602116.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Passivation
(Dehydration, Unloading) Policy [5/19/2006 4:38:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Advanced Workflow: Enabling Tricky Scenarios&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,5f4d8c41-73bf-4d7f-93b4-8934130a783b.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WF
and Serialization Part One [5/23/2006 9:42:25 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Jon Flanders' Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/30/610519.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Versioning
for Addresses, Envelopes, and Messages [5/30/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/25/606883.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Creating
Custom Bindings [5/25/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/06/01/613317.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;An
alternative "WCF to IBM Mainframe CICS" approach [6/1/2006 10:27:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/05/23/605029.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta 2 is out there [5/23/2006 8:19:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/05/23/604542.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Rev
your transaction engines for WinFX Beta 2 [5/22/2006 9:53:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Indigo&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/pandrew/archive/2006/05/23/605611.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta 2 is Released [5/23/2006 6:20:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Paul Andrew&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/markgabarra/archive/2006/05/26/608328.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;So
What Is A WCF Configuration Extension Anyways? [5/26/2006 10:44:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Mark Gabarra's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/markgabarra/archive/2006/05/16/599428.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Nothing
this week [5/16/2006 12:05:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Mark Gabarra's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,98fc7b70-b854-45b6-96bc-4a3c0305477c.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Look,
look, my blog is on MSDN [5/26/2006 9:19:11 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: Enterprise Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://hyperthink.net/blog/2006/05/18/Lost+Questions.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Lost
questions [5/17/2006 11:23:21 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Brain.Save()&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/ts5540_summary.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TS-5540
Summary by an audience [5/30/2006 6:08:51 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/30/610519.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Versioning
for Addresses, Envelopes, and Messages [5/30/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/24/605655.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Choosing
a Transport [5/24/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/23/605289.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Today's
Real News: Beta 2 Released [5/23/2006 12:00:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/17/599696.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Resources
for Channel Authors [5/17/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/16/598420.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Building
a Custom Message Encoder to Record Throughput, Part 4 [5/16/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/wenlong/archive/2006/05/18/600603.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Impersonation for Hosted Services [5/18/2006 2:19:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Wenlong Dong&lt;/st1:PersonName&gt;
's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.gazitt.com/Blog/PermaLink,guid,bb8e57a7-8b2a-476f-b4f2-15499baf5d5a.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta2 has officially shipped [5/23/2006 11:03:05 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
OhmBlog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.thearchitect.co.uk/weblog/archives/2006/05/000411.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;UnREST
over WS-* and other "enterprisey" things [5/17/2006 8:38:54 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
TheArchitect.co.uk - 
&lt;st1:PersonName w:st="on"&gt;Jorgen Thelin&lt;/st1:PersonName&gt;
's weblog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/mgudgin/archive/2006/05/16/24111.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;httpcfg
Flag Weirdness [5/16/2006 6:18:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Musings from Gudge&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/richardt/archive/2006/05/18/601428.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;VSlive
2006 [5/18/2006 2:14:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Welcome to The Metaverse&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605736.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WSE
3.0 in June 2006 MSDN Magazine [5/23/2006 10:07:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605724.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Biztalk
WSE 3.0 Adapter Ships [5/23/2006 9:21:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/06/03/615621.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006: WCF and WF Chalk Talk Schedule [6/2/2006 9:42:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/05/23/605203.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Beta2
of WinFX Runtime Components v3.0 now available [5/23/2006 1:43:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/05/20/602956.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 - Chalk Talks on Custom Channels [5/20/2006 7:43:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/06/01/613317.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;An
alternative "WCF to IBM Mainframe CICS" approach [6/1/2006 10:27:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/05/23/605029.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WinFX
Beta 2 is out there [5/23/2006 8:19:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/05/23/604542.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Rev
your transaction engines for WinFX Beta 2 [5/22/2006 9:53:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Standards/Protocols&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/moustafa/archive/2006/05/21/603415.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Define
and execute WF rules on any target object [5/21/2006 11:50:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Moustafa Khalil Ahmed's Space&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/markgabarra/archive/2006/05/26/608328.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;So
What Is A WCF Configuration Extension Anyways? [5/26/2006 10:44:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Mark Gabarra's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/aaron/archive/2006/06/01/26214.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Microsoft
Architect Connections (MSAC) [6/1/2006 7:38:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Service Station, by Aaron Skonnard&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,97913270-88a9-49b9-b057-2dcbdc3f9c90.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Autonomy
isn't Autonomy - and a few words about Caching. [6/1/2006 7:18:43 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,700e8619-de82-4ecb-8c3f-ad60b001cf47.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Services
and the Business/IT Gap [5/30/2006 8:30:59 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,98fc7b70-b854-45b6-96bc-4a3c0305477c.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Look,
look, my blog is on MSDN [5/26/2006 9:19:11 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: Enterprise Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://hyperthink.net/blog/2006/05/27/Blogging+From+Office+12.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Blogging
from Office 12 [5/27/2006 6:40:22 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Brain.Save()&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast19.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Hanselminutes
Podcast 19 [5/31/2006 12:15:40 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
ComputerZen.com - Scott Hanselman&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast18.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Hanselminutes
Podcast 18 [5/25/2006 9:26:25 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
ComputerZen.com - Scott Hanselman&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/SubtleBehaviorsInTheXMLSerializerCanKill.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Subtle
Behaviors in the XML Serializer can kill [5/24/2006 11:44:25 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
ComputerZen.com - Scott Hanselman&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/articles_on_sun.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Articles
on Sun/Microsoft interoperability [5/18/2006 1:16:35 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/introducing_wsi.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Introducing
wsit.dev.java.net [5/16/2006 5:23:06 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.seattlepi.nwsource.com/microsoft/archives/103850.asp?source=rss"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Ballmer
makes Microsoft's case to Wall Street [5/31/2006 6:48:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Todd Bishop's Microsoft Blog @ SeattlePI.com&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/01/612672.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Inside
the Standard Bindings: BasicHttp [6/1/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/30/610519.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Versioning
for Addresses, Envelopes, and Messages [5/30/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/24/605655.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Choosing
a Transport [5/24/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/17/599696.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Resources
for Channel Authors [5/17/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/16/598420.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Building
a Custom Message Encoder to Record Throughput, Part 4 [5/16/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/wenlong/archive/2006/05/18/600603.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Impersonation for Hosted Services [5/18/2006 2:19:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Wenlong Dong&lt;/st1:PersonName&gt;
's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://spaces.msn.com/mrgoodner/Blog/cns!3DA4361D5DE5F95C!504.entry"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Developers
fail to care about one sided religious war [5/25/2006 4:56:51 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Marc's space terminal&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://spaces.msn.com/mrgoodner/Blog/cns!3DA4361D5DE5F95C!501.entry"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Don't
be that guy (EPR version) [5/22/2006 3:07:32 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Marc's space terminal&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/dbox/archive/2006/05/18/24167.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;VB9
and Atom [5/17/2006 9:27:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Don Box&lt;/st1:PersonName&gt;
's Spoutlet&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=6c48d685-8ae3-400a-8550-91aaa4ea7562"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;On
the C# 3.0 Preview: Some Thoughts on LINQ [5/17/2006 6:35:13 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Dare Obasanjo&lt;/st1:PersonName&gt;
aka Carnage4Life&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.thearchitect.co.uk/weblog/archives/2006/05/000411.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;UnREST
over WS-* and other "enterprisey" things [5/17/2006 8:38:54 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
TheArchitect.co.uk - 
&lt;st1:PersonName w:st="on"&gt;Jorgen Thelin&lt;/st1:PersonName&gt;
's weblog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/25/607820.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;So
you want to learn WSE 3.0? A short primer on how and where to start. [5/25/2006 8:49:00
PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605724.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Biztalk
WSE 3.0 Adapter Ships [5/23/2006 9:21:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/05/23/605203.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Beta2
of WinFX Runtime Components v3.0 now available [5/23/2006 1:43:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www-03.ibm.com/developerworks/blogs/page/chrisferris?entry=ws_policy_working_group"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WS-Policy
Working Group [6/2/2006 5:50:09 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Chris Ferris&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/tewald/archive/2006/05/19/24507.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Two
articles, one good and one bad... [5/19/2006 7:30:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
XML Nation&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;REST&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/aaron/archive/2006/06/01/26214.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Microsoft
Architect Connections (MSAC) [6/1/2006 7:38:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Service Station, by Aaron Skonnard&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://spaces.msn.com/mrgoodner/Blog/cns!3DA4361D5DE5F95C!504.entry"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Developers
fail to care about one sided religious war [5/25/2006 4:56:51 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Marc's space terminal&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=542c732f-45e7-420d-ae1a-3b0cee04b5b3"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Windows
Live Gadgets SDK Released [5/26/2006 11:09:15 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Dare Obasanjo&lt;/st1:PersonName&gt;
aka Carnage4Life&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=503ffdd5-2161-42fc-81b4-3a703d7a484b"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;New
Version of Windows Live Local Shipped [5/24/2006 10:12:31 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Dare Obasanjo&lt;/st1:PersonName&gt;
aka Carnage4Life&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.thearchitect.co.uk/weblog/archives/2006/05/000412.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;My
Microsoft [5/18/2006 12:33:29 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
TheArchitect.co.uk - 
&lt;st1:PersonName w:st="on"&gt;Jorgen Thelin&lt;/st1:PersonName&gt;
's weblog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;POX&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/aaron/archive/2006/06/01/26214.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Microsoft
Architect Connections (MSAC) [6/1/2006 7:38:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Service Station, by Aaron Skonnard&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/24/605655.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Choosing
a Transport [5/24/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;SOA&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,97913270-88a9-49b9-b057-2dcbdc3f9c90.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Autonomy
isn't Autonomy - and a few words about Caching. [6/1/2006 7:18:43 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,700e8619-de82-4ecb-8c3f-ad60b001cf47.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Services
and the Business/IT Gap [5/30/2006 8:30:59 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/smguest/archive/2006/05/19/602169.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Putting
the User back into SOA - my first ARCast! [5/19/2006 11:36:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
simon.says&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/tewald/archive/2006/05/19/24507.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Two
articles, one good and one bad... [5/19/2006 7:30:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
XML Nation&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.edithere.com/barry/2006/06/01#a3663"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Noted
[6/1/2006 8:51:06 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- Barry
Briggs' Weblog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Web Services&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,97913270-88a9-49b9-b057-2dcbdc3f9c90.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Autonomy
isn't Autonomy - and a few words about Caching. [6/1/2006 7:18:43 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,700e8619-de82-4ecb-8c3f-ad60b001cf47.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Services
and the Business/IT Gap [5/30/2006 8:30:59 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,98fc7b70-b854-45b6-96bc-4a3c0305477c.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Look,
look, my blog is on MSDN [5/26/2006 9:19:11 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: Enterprise Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/ts5540_summary.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TS-5540
Summary by an audience [5/30/2006 6:08:51 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/javaone_2006_ts.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;JavaOne
2006 TS-5540 Slides [5/23/2006 11:31:05 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/javaone_2006_pr.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;JavaOne
2006 - Project Tango Keynote Demo [5/17/2006 1:20:43 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/30/610519.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Versioning
for Addresses, Envelopes, and Messages [5/30/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://spaces.msn.com/mrgoodner/Blog/cns!3DA4361D5DE5F95C!504.entry"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Developers
fail to care about one sided religious war [5/25/2006 4:56:51 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Marc's space terminal&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=542c732f-45e7-420d-ae1a-3b0cee04b5b3"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Windows
Live Gadgets SDK Released [5/26/2006 11:09:15 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Dare Obasanjo&lt;/st1:PersonName&gt;
aka Carnage4Life&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/25/607820.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;So
you want to learn WSE 3.0? A short primer on how and where to start. [5/25/2006 8:49:00
PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605724.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Biztalk
WSE 3.0 Adapter Ships [5/23/2006 9:21:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/distilled/archive/2006/06/01/613317.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;An
alternative "WCF to IBM Mainframe CICS" approach [6/1/2006 10:27:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
distilled&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.cocoondev.org/dims/archives/004630.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;[ANN]
Tungsten 1.0 - Web services platform [5/24/2006 2:06:44 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Davanum Srinivas' weblog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.mnot.net/blog/2006/05/25/web_services"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Web
Services are Dead, Long Live Web Services [5/25/2006 6:43:37 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
mnot’s Web log&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www-03.ibm.com/developerworks/blogs/page/chrisferris?entry=ws_policy_working_group"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WS-Policy
Working Group [6/2/2006 5:50:09 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Chris Ferris&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/tewald/archive/2006/05/19/24507.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Two
articles, one good and one bad... [5/19/2006 7:30:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
XML Nation&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Remoting&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;WSE&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/17/599696.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Resources
for Channel Authors [5/17/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/25/607820.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;So
you want to learn WSE 3.0? A short primer on how and where to start. [5/25/2006 8:49:00
PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605736.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WSE
3.0 in June 2006 MSDN Magazine [5/23/2006 10:07:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/mfussell/archive/2006/05/24/605724.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Biztalk
WSE 3.0 Adapter Ships [5/23/2006 9:21:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Mark Fussell&lt;/st1:PersonName&gt;
's WebLog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;COM/MTS/COM+/EnterpriseService&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;IIS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/24/605655.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Choosing
a Transport [5/24/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/16/598420.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Building
a Custom Message Encoder to Record Throughput, Part 4 [5/16/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/wenlong/archive/2006/05/18/600603.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Impersonation for Hosted Services [5/18/2006 2:19:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Wenlong Dong&lt;/st1:PersonName&gt;
's Blog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;MSMQ/System.Messaging&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://friends.newtelligence.net/clemensv/PermaLink,guid,9d951f38-3a02-4642-bfe8-73dc8883f8e3.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Is
.NET Remoting Dead? [5/26/2006 9:19:17 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Clemens Vasters&lt;/st1:PersonName&gt;
: 
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;Enterprise&lt;/st1:place&gt;
&lt;/st1:City&gt;
Development and Alien Abductions&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Serialization&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/SubtleBehaviorsInTheXMLSerializerCanKill.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Subtle
Behaviors in the XML Serializer can kill [5/24/2006 11:44:25 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
ComputerZen.com - Scott Hanselman&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;Security&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://weblogs.java.net/blog/arungupta/archive/2006/05/introducing_wsi.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;Introducing
wsit.dev.java.net [5/16/2006 5:23:06 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Arun Gupta's Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/02/611213.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 Chalk Talk Schedule [6/2/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.thearchitect.co.uk/weblog/archives/2006/05/000411.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;UnREST
over WS-* and other "enterprisey" things [5/17/2006 8:38:54 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
TheArchitect.co.uk - 
&lt;st1:PersonName w:st="on"&gt;Jorgen Thelin&lt;/st1:PersonName&gt;
's weblog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/richardt/archive/2006/05/18/601428.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;VSlive
2006 [5/18/2006 2:14:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Welcome to The Metaverse&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/kavitak/archive/2006/05/20/602956.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;TechEd
2006 - Chalk Talks on Custom Channels [5/20/2006 7:43:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Kavitak's WebLog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;
&lt;st1:City w:st="on"&gt;
&lt;st1:place w:st="on"&gt;
&lt;b&gt;&lt;span lang=EN-US&gt;AJAX&lt;/span&gt;&lt;/b&gt;
&lt;/st1:place&gt;
&lt;/st1:City&gt;
&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.seattlepi.nwsource.com/microsoft/archives/103866.asp?source=rss"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;CEO
Schmidt on question of Google browser [5/31/2006 11:46:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Todd Bishop's Microsoft Blog @ SeattlePI.com&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/drnick/archive/2006/05/31/611195.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;WCF
Webcasts in June [5/31/2006 2:00:00 AM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Nicholas Allen&lt;/st1:PersonName&gt;
's Indigo Blog&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.cocoondev.org/dims/archives/004630.html"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;[ANN]
Tungsten 1.0 - Web services platform [5/24/2006 2:06:44 PM]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; --
Davanum Srinivas' weblog&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span&gt;&lt;b&gt;&lt;span lang=EN-US&gt;System.Net&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span lang=EN-US&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/span&gt;&lt;a href="http://pluralsight.com/blogs/dbox/archive/2006/05/18/24167.aspx"&gt;&lt;span&gt;&lt;span lang=EN-US&gt;VB9
and Atom [5/17/2006 9:27:00 PM]&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _MailEndCompose"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span lang=EN-US&gt; -- 
&lt;st1:PersonName w:st="on"&gt;Don Box&lt;/st1:PersonName&gt;
's Spoutlet&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=6ce2b8fe-93fd-421c-a685-15fe145963e5" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,6ce2b8fe-93fd-421c-a685-15fe145963e5.aspx</comments>
      <category>Technology/WCF</category>
      <category>Technology/Workflow</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=24a2c6a4-e043-464c-8c60-189ecea3460d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,24a2c6a4-e043-464c-8c60-189ecea3460d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,24a2c6a4-e043-464c-8c60-189ecea3460d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=24a2c6a4-e043-464c-8c60-189ecea3460d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My PM colleague <a href="http://blogs.msdn.com/drnick">Nicholas Allen</a> is certainly
on my list for "best blogging newcomer of 2006".  He started in February, got
hooked, and I am not sure whether he actually did leave the keyboard since then.
</p>
        <p>
Nicholas just started a blog series that explains the system-defined (formely known
as: standard-) bindings that we ship with WCF. He's got three of them explained
now and my guess is that there are more to follow:
</p>
        <ul>
          <li>
            <a href="http://blogs.msdn.com/drnick/archive/2006/06/01/612672.aspx">BasicHttpBinding</a> </li>
          <li>
            <a href="http://blogs.msdn.com/drnick/archive/2006/06/05/617703.aspx">NetTcpBinding</a>
          </li>
          <li>
            <a href="http://blogs.msdn.com/drnick/archive/2006/06/06/618445.aspx">NetNamedPipeBinding</a>
          </li>
        </ul>
        <p>
While you are there, make sure to subscribe to Nicholas' <a href="http://blogs.msdn.com/drnick/rss.aspx">feed</a> and
also take a look around and look at earlier posts. His <a href="http://blogs.msdn.com/drnick/archive/category/12220.aspx">channel
category</a> is a gold mine and the same can be said of the <a href="http://blogs.msdn.com/drnick/archive/category/13324.aspx">transports</a> and
... everything there is fabulous stuff.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=24a2c6a4-e043-464c-8c60-189ecea3460d" />
      </body>
      <title>The System-Defined Bindings in WCF: Nicholas Allen explains it all</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,24a2c6a4-e043-464c-8c60-189ecea3460d.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/06/The+SystemDefined+Bindings+In+WCF+Nicholas+Allen+Explains+It+All.aspx</link>
      <pubDate>Tue, 06 Jun 2006 20:50:22 GMT</pubDate>
      <description>&lt;p&gt;
My PM colleague &lt;a href="http://blogs.msdn.com/drnick"&gt;Nicholas Allen&lt;/a&gt; is certainly
on my list for "best blogging newcomer of 2006". &amp;nbsp;He started in February, got
hooked, and I am not sure whether he actually did&amp;nbsp;leave the keyboard since then.
&lt;/p&gt;
&lt;p&gt;
Nicholas just started a blog series that explains the system-defined (formely known
as: standard-) bindings&amp;nbsp;that we ship with WCF. He's got three of them&amp;nbsp;explained
now and my guess is that there are more to follow:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/01/612672.aspx"&gt;BasicHttpBinding&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/05/617703.aspx"&gt;NetTcpBinding&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://blogs.msdn.com/drnick/archive/2006/06/06/618445.aspx"&gt;NetNamedPipeBinding&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
While you are there, make sure to subscribe to Nicholas' &lt;a href="http://blogs.msdn.com/drnick/rss.aspx"&gt;feed&lt;/a&gt; and
also take a look around and look at earlier posts. His &lt;a href="http://blogs.msdn.com/drnick/archive/category/12220.aspx"&gt;channel
category&lt;/a&gt; is a gold mine and the same can be said of the &lt;a href="http://blogs.msdn.com/drnick/archive/category/13324.aspx"&gt;transports&lt;/a&gt; and
... everything there is fabulous stuff.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=24a2c6a4-e043-464c-8c60-189ecea3460d" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,24a2c6a4-e043-464c-8c60-189ecea3460d.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=069972fe-b2f9-4c6f-83f8-b61e7e310cc7</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,069972fe-b2f9-4c6f-83f8-b61e7e310cc7.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,069972fe-b2f9-4c6f-83f8-b61e7e310cc7.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=069972fe-b2f9-4c6f-83f8-b61e7e310cc7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Christian Weyer stars in a new episode of the </em>
          <a href="http://www.dotnetpro.de/articles/webarticle13.aspx">
            <em>German
dotnetproTV series</em>
          </a>
          <em> and masterfully explains the Windows Communication
Foundation. If you don't understand German, you may still enjoy Christian's flip-chart
skills and overall good looks. ;-)</em>
        </p>
        <p>
          <a href="http://blogs.thinktecture.com/cweyer/">Christian Weyer</a> – Microsoft Regional
Director und allgemein anerkannter und geschätzter Web Services Erklärbar – ist
der  Star der neuesten dotnetproTV Episode zum Thema Windows Communication Foundation.
Ich habe mir die Episode gerade angesehen und … Holla die Waldfee! … das ist einer
der besten Überblicke zu WCF, die ich bisher gesehen habe! Und der Dialog mit <a href="http://weblogs.asp.net/ralfw">Ralf
Westphal</a> ist natürlich kurzweilig und interessant wie immer. Hut ab!
</p>
        <p>
Und weil mir das Thema natürlich am Herzen liegt bin ich sehr froh, daß dotnetpro
für diese Folge nicht nur einen „Teaser“ zur Verfügung stellt, sondern Christians
ganze Show in der ganzen 370MB großen Herrlichkeit (der Link zum Video ist in der
orangefarbenen Kiste <a href="http://www.dotnetpro.de/articles/webarticle13.aspx">hier
auf der Seite</a>). Runterladen! Gucken! 
<br /></p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=069972fe-b2f9-4c6f-83f8-b61e7e310cc7" />
      </body>
      <title>Christian Weyer explains WCF (... in German)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,069972fe-b2f9-4c6f-83f8-b61e7e310cc7.aspx</guid>
      <link>http://vasters.com/clemensv/2006/06/06/Christian+Weyer+Explains+WCF+In+German.aspx</link>
      <pubDate>Tue, 06 Jun 2006 18:12:59 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Christian Weyer stars in a new episode of the &lt;/em&gt;&lt;a href="http://www.dotnetpro.de/articles/webarticle13.aspx"&gt;&lt;em&gt;German
dotnetproTV series&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;and masterfully explains the Windows Communication
Foundation. If you don't understand German, you may still enjoy Christian's flip-chart
skills and overall good looks. ;-)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.thinktecture.com/cweyer/"&gt;Christian Weyer&lt;/a&gt; – Microsoft Regional
Director und allgemein anerkannter&amp;nbsp;und geschätzter Web Services Erklärbar – ist
der&amp;nbsp; Star der neuesten dotnetproTV Episode zum Thema Windows Communication Foundation.
Ich habe mir die Episode gerade angesehen und … Holla die Waldfee! … das ist einer
der besten Überblicke zu WCF, die ich bisher gesehen habe! Und der Dialog mit &lt;a href="http://weblogs.asp.net/ralfw"&gt;Ralf
Westphal&lt;/a&gt; ist natürlich kurzweilig und interessant wie immer. Hut ab!
&lt;/p&gt;
&lt;p&gt;
Und weil mir das Thema natürlich am Herzen liegt bin ich sehr froh, daß dotnetpro
für diese Folge nicht nur einen „Teaser“ zur Verfügung stellt, sondern Christians
ganze Show in der ganzen 370MB großen Herrlichkeit (der Link zum Video ist in der
orangefarbenen Kiste &lt;a href="http://www.dotnetpro.de/articles/webarticle13.aspx"&gt;hier
auf der Seite&lt;/a&gt;). Runterladen! Gucken! 
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=069972fe-b2f9-4c6f-83f8-b61e7e310cc7" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,069972fe-b2f9-4c6f-83f8-b61e7e310cc7.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/WCF</category>
    </item>
  </channel>
</rss>