<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Justin Smith's Blog : BizTalk.NET Services</title><link>http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx</link><description>Tags: BizTalk.NET Services</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>First week at the new job</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/03/22/first-week-at-the-new-job.aspx</link><pubDate>Sat, 22 Mar 2008 20:01:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8331356</guid><dc:creator>justinjsmith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/8331356.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=8331356</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=8331356</wfw:comment><description>&lt;p&gt;This week I started a new job at Microsoft - I've moved from Developer and Platform Evangelism to the Connected Systems Division. I'm now a program manager on the BizTalk Services team (&lt;a href="http://biztalk.net"&gt;http://biztalk.net&lt;/a&gt;). It was hard to leave DPE, but this seems like the right opportunity. For those that haven't seen BizTalk.net, it's an incubation project for messaging, security, and workflow services that run at scale in Microsoft's hosted environment.&lt;/p&gt;  &lt;p&gt;The week was a whirlwind, and I am having a blast. The team is very agile, and it has the atmosphere of a startup. Truly cool. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8331356" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/About+Justin/default.aspx">About Justin</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk+Services/default.aspx">BizTalk Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx">BizTalk.NET Services</category></item><item><title>Robots and BizTalk Services</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/02/28/robots-and-biztalk-services.aspx</link><pubDate>Thu, 28 Feb 2008 21:58:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7936869</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/7936869.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=7936869</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=7936869</wfw:comment><description>&lt;p&gt;I just posted a new screencast on Channel 9: &lt;a title="http://channel9.msdn.com/Showpost.aspx?postid=386824" href="http://channel9.msdn.com/Showpost.aspx?postid=386824"&gt;http://channel9.msdn.com/Showpost.aspx?postid=386824&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It's purpose is to show off the power of claims and claims transformation, especially in a hosted service like BizTalk Services. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7936869" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk+Services/default.aspx">BizTalk Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx">BizTalk.NET Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Robotics/default.aspx">Robotics</category></item><item><title>Claims and the Calculator sample in the BizTalk Services SDK</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/02/27/claims-and-the-calculator-sample-in-the-biztalk-services-sdk.aspx</link><pubDate>Thu, 28 Feb 2008 02:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7924187</guid><dc:creator>justinjsmith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/7924187.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=7924187</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=7924187</wfw:comment><description>&lt;p&gt;The identity provider in BizTalk Services is a way for applications to delegate identity and access control to a hosted service. In other words, an application can use BizTalk Services to answer the all-important question &amp;quot;Who are you and what are you allowed to do?&amp;quot;. If you haven't checked it out, I strongly recommend it (&lt;a href="http://biztalk.net"&gt;http://biztalk.net&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;The identity provider can be used without the connectivity service. The calculator sample in the SDK is an example (as of R10, it installs by default in the C:\Program Files\Microsoft BizTalk Services SDK\Samples\AccessControl directory). This entry examines the calculator sample that uses a certificate, and this blog post is not a substitute for reading the readme...&lt;/p&gt;  &lt;p&gt;As indicated in the readme, running this sample requires you to login to &lt;a href="http://biztalk.net"&gt;http://biztalk.net&lt;/a&gt;, go to &amp;quot;Manage Access Control&amp;quot;, &amp;quot;Rules&amp;quot;, and setup a few claims mappings. After you login, click on the following (right hand side):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="114" alt="image" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The Rules link takes you to a page that lets you map input claims to output claims. In the case of the Calculator sample, you are going to map BizTalk.NET usernames to Resource+Operation claims. These Resource+Operation claims are demanded by the calculator service (running on your machine). WCF shields you from quite a bit of the protocol level goo here. The following is an example of what it looks like in the web UI:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="434" alt="image" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_thumb_1.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There's lots of interesting things going on here. For now, let me just focus on the Output Claim Value field. It's the concatenation of (in this case) the service URL, &amp;quot;#&amp;quot;, the service contract name, &amp;quot;.&amp;quot;, and the action of the operation:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&amp;lt;Value&amp;gt; ::= &amp;lt;Service Url&amp;gt; &amp;quot;#&amp;quot; &amp;lt;Service Contract Name&amp;gt; &amp;quot;.&amp;quot; &amp;lt;Operation Action&amp;gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This may sound very scientific, but the reality is that it's simply a matter of a choice made by the ServiceAuthorizationManager derived type that's included in the Calculator sample (available at C:\Program Files\Microsoft BizTalk Services SDK\Samples\AccessControl\CalculatorServiceWithCertificate\FederatedAccessManager). You can change it to be whatever you want (of &amp;lt;Read&amp;gt; or &amp;lt;Write&amp;gt; could have been substituted for contract name + operation action).&lt;/p&gt;  &lt;p&gt;After you setup the input and output claim mapping for the calculator service, you have a system like the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="system" src="http://blogs.msdn.com/blogfiles/justinjsmith/WindowsLiveWriter/SendandListeninBizTalkServices_A7F4/image_thumb_3.png" width="438" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Step 1: Present identity claims to BizTalk.NET&lt;/p&gt;  &lt;p&gt;Step 2: Receive the claims that are mapped to that identity&lt;/p&gt;  &lt;p&gt;Step 3: Send those claims to the Calculator Service&lt;/p&gt;  &lt;p&gt;Step 4: If the claim (URL+ContractName+Action) is present, the ServiceAuthorizationManager allows the WCF infrastructure to invoke the calculator implementation.&lt;/p&gt;  &lt;h4&gt;In effect, the calculator service delegates identity and access control to BizTalk Services.&lt;/h4&gt;  &lt;p&gt;I think that's way cool.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7924187" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk+Services/default.aspx">BizTalk Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx">BizTalk.NET Services</category></item><item><title>PictureServices and BizTalk Services</title><link>http://blogs.msdn.com/justinjsmith/archive/2008/01/18/pictureservices-and-biztalk-services.aspx</link><pubDate>Sat, 19 Jan 2008 03:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7154978</guid><dc:creator>justinjsmith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/7154978.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=7154978</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=7154978</wfw:comment><description>&lt;P&gt;Previous posts have talked a bit about PictureServices. Now I'd like to run through what it took to bring PictureServices to the BizTalk Services. I've talked a bit in other posts about BizTalk Services, but it has some interesting and very useful messaging features. For starters, BizTalk Services has an endpoint that can do HTTP transforms on messages. It goes like this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;MyApp connects to BizTalk Services&lt;/LI&gt;
&lt;LI&gt;BizTalk Services and MyApp use WS-* security, coupled with the WCF binary message encoding.&lt;/LI&gt;
&lt;LI&gt;Other clients (Java, PHP, Ruby, whatever) can hit an HTTP endpoint hosted in the BizTalk Services "mesh". We will call this endpoint the HTTP Endpoint.&lt;/LI&gt;
&lt;LI&gt;Upon receipt of a message, the HTTP Endpoint tries to dispatch that message (or request) to MyApp.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;If we use this set of steps with PictureServices, then you have a way to serve local pictures over the internet. If you just look at this task, there are lots of other ways to do this. I'm not suggesting that BizTalk Services is the next cool way to share photos. Instead, I think there are lots of cool apps that can take advantage of this kind of feature set.&lt;/P&gt;
&lt;P&gt;Down to nuts and bolts - the service contract. PictureServices defines a service contract with operations for RSS, ATOM, and Simple list extensions. For the sake of time, I opted to have a single feature: get an RSS feed. Here's what the service contract looks like:&lt;/P&gt;&lt;PRE class=csharpcode&gt;[ServiceContract]
&lt;SPAN class=kwrd&gt;interface&lt;/SPAN&gt; IBTSPictureSyndication
{
  [OperationContract(Action=&lt;SPAN class=str&gt;"GET"&lt;/SPAN&gt;, ReplyAction=&lt;SPAN class=str&gt;"GETRESPONSE"&lt;/SPAN&gt;)]
  Message GetFeed();
}&lt;/PRE&gt;
&lt;P&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;
&lt;/P&gt;
&lt;P&gt;The return type is System.ServiceModel.Channels.Message because the BizTalk Services SDK does not have full parity with the .NET Framework 3.5's capabilities. This will happen over time. To be honest, most of the head scratching I went through was due to the disparity between these two APIs.&lt;/P&gt;
&lt;P&gt;Another interesting bit is the implementation of the GetFeed method. The syndication, the images, and all the thumbnail HTTP GETs (remember they are transformed) are going to flow through this one method. As a result, we have to test the requested address to determine which resource is being requested. &lt;/P&gt;
&lt;P&gt;For that we turn to our new best friend: the UriTemplate. This is a new type introduced in .NET 3.5 - it makes URI parsing much easier (among other things).&lt;/P&gt;
&lt;P&gt;There are 3 conditions I test for: &lt;/P&gt;
&lt;P&gt;1) a request for the whole feed&lt;/P&gt;
&lt;P&gt;2) a request for an image&lt;/P&gt;
&lt;P&gt;3) a request for a thumbnail.&lt;/P&gt;
&lt;P&gt;Here's the implementation:&lt;/P&gt;&lt;PRE class=csharpcode&gt;[ServiceBehavior(AddressFilterMode=AddressFilterMode.Prefix)]
&lt;SPAN class=kwrd&gt;sealed&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; BTSPictureSyndication : IBTSPictureSyndication
{
    String feedUri = &lt;SPAN class=str&gt;"/Feed/"&lt;/SPAN&gt;;
    String pictureUri = &lt;SPAN class=str&gt;"/Feed/Picture/{pictureId}"&lt;/SPAN&gt;;
    String thumbnailUri = &lt;SPAN class=str&gt;"/Feed/Picture/t/{pictureId}"&lt;/SPAN&gt;;

    PictureService service = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PictureService();

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Message GetFeed()
    {
        &lt;SPAN class=rem&gt;// get the To address and the base address&lt;/SPAN&gt;
        Uri to = OperationContext.Current.RequestContext.RequestMessage.Headers.To;
        Uri baseAddress = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Uri(ConfigurationManager.AppSettings[&lt;SPAN class=str&gt;"baseAddress"&lt;/SPAN&gt;]);

        &lt;SPAN class=rem&gt;// check to see if it's a request for the main feed&lt;/SPAN&gt;
        UriTemplate feedTemplate = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UriTemplate(feedUri);
        UriTemplateMatch feedMatch = feedTemplate.Match(baseAddress, to);

        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (feedMatch != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
        {
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; GetMainFeed();
        }

        &lt;SPAN class=rem&gt;// check to see if it's a request for a picture&lt;/SPAN&gt;
        UriTemplate pictureTemplate = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UriTemplate(pictureUri);
        UriTemplateMatch pictureMatch = pictureTemplate.Match(baseAddress, to);

        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (pictureMatch != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
        {
            String pictureId = pictureMatch.BoundVariables[&lt;SPAN class=str&gt;"pictureId"&lt;/SPAN&gt;];
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; GetPicture(pictureId);
        }

        &lt;SPAN class=rem&gt;// check to see if it's a request for a thumbnail&lt;/SPAN&gt;
        UriTemplate thumbnailTemplate = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UriTemplate(thumbnailUri);
        UriTemplateMatch thumbnailMatch = thumbnailTemplate.Match(baseAddress, to);

        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (thumbnailMatch != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
        {
            String pictureId = thumbnailMatch.BoundVariables[&lt;SPAN class=str&gt;"pictureId"&lt;/SPAN&gt;];
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; GetPictureThumbnail(pictureId);
        }

        &lt;SPAN class=rem&gt;// we don't know what it is, so throw&lt;/SPAN&gt;
        &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; InvalidOperationException(String.Format(&lt;SPAN class=str&gt;"the address {0} was not matched"&lt;/SPAN&gt;, to.ToString()));

    }

    &lt;SPAN class=rem&gt;// use the service object to get the picture&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Message GetPicture(String pictureId)
    {
        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; StreamMessageHelper.CreateMessage(OperationContext.Current.IncomingMessageVersion, &lt;/PRE&gt;&lt;PRE class=csharpcode&gt;        &lt;SPAN class=str&gt;"GETRESPONSE"&lt;/SPAN&gt;, service.GetPicture(pictureId));
    }

    &lt;SPAN class=rem&gt;// use the service object to get a thumbnail&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Message GetPictureThumbnail(String pictureId)
    {
        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; StreamMessageHelper.CreateMessage(OperationContext.Current.IncomingMessageVersion, &lt;/PRE&gt;&lt;PRE class=csharpcode&gt;        &lt;SPAN class=str&gt;"GETRESPONSE"&lt;/SPAN&gt;, service.GetPictureThumbnail(pictureId));
    }

    &lt;SPAN class=rem&gt;// get the main feed (RSS)&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; Message GetMainFeed()
    {
        Rss20FeedFormatter formatter = service.GetPicturesAsRss();

        MemoryStream stream = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MemoryStream();
        XmlWriter writer = XmlWriter.Create(stream);

        formatter.WriteTo(writer);

        writer.Close();
        stream.Position = 0;

        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; StreamMessageHelper.CreateMessage(OperationContext.Current.IncomingMessageVersion, &lt;SPAN class=str&gt;"GETRESPONSE"&lt;/SPAN&gt;, stream);
    }
}&lt;/PRE&gt;
&lt;P&gt;Another thing that's worth pointing out is the presence of the AddressFilterMode property on the ServiceBehavior attribute annotation. This setting tells the WCF dispatching infrastructure to allow prefix matches to filter through to the method. In practical terms, this means that a request to &lt;A href="http://foo/bar/baz" mce_href="http://foo/bar/baz"&gt;http://foo/bar/baz&lt;/A&gt; would get dispatched to the same method as &lt;A href="http://foo/bar" mce_href="http://foo/bar"&gt;http://foo/bar&lt;/A&gt;. That's how we are returning the full feed, the image, or a thumbnail.&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://netfx3.com/files/folders/wcf_samples/entry15417.aspx" target=_blank mce_href="http://netfx3.com/files/folders/wcf_samples/entry15417.aspx"&gt;Here's a zipped version of the project &lt;/A&gt;(note that you must also have PictureServices).&lt;/P&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7154978" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Syndication/default.aspx">Syndication</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk+Services/default.aspx">BizTalk Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Web+Programming+with+WCF/default.aspx">Web Programming with WCF</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx">BizTalk.NET Services</category></item><item><title>Introduction to BizTalk.NET Services</title><link>http://blogs.msdn.com/justinjsmith/archive/2007/06/10/introduction-to-biztalk-net-services.aspx</link><pubDate>Sun, 10 Jun 2007 20:54:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3209919</guid><dc:creator>justinjsmith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/justinjsmith/comments/3209919.aspx</comments><wfw:commentRss>http://blogs.msdn.com/justinjsmith/commentrss.aspx?PostID=3209919</wfw:commentRss><wfw:comment>http://blogs.msdn.com/justinjsmith/rsscomments.aspx?PostID=3209919</wfw:comment><description>&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;BizTalk.NET Services (&lt;a href="http://labs.biztalk.net"&gt;http://labs.biztalk.net&lt;/a&gt;) is a nascent and experiemental project that is all about generic, secure connectivity. Many WCF customers ask us&amp;nbsp;how to notify client applications that something has happened in a service. If the client is addressable and listening, this is a fairly easy question to address. In fact, there is an SDK sample that addresses (pun intended) that exact scenario. However, when one of the clients is not addressable (behind a firewall or NAT), the problem becomes much harder. After all, how can a client&amp;nbsp;receive incoming&amp;nbsp;messages if it's listening address is virtually invisible outside the firewall or NAT?&lt;/p&gt; &lt;p&gt;This problem is not new. Connected applications like Groove, FolderShare, Skype, and all manner of Instant Messenger have had to solve this problem. Each of these applications has solved this problem in their own way, and with their own resources. Even though each of these business had to solve the problem, the physical characteristics of networks and the commonality of the requirement fostered (perhaps) similar design charachteristics. In the cases I am aware of,&amp;nbsp;instances of&amp;nbsp;these connected applications (i.e. clients)&amp;nbsp;call out from behind a firewall or NAT&amp;nbsp;to&amp;nbsp;one or more servers&amp;nbsp;in the internet. For the duration of that established socket, the server is able to send data back to the client. If, during the&amp;nbsp;lifetime of that socket,&amp;nbsp;another instance of the same connected application calls into the server, then the server is able to pass data from one instance of the connected application to another. &lt;/p&gt; &lt;p&gt;Though I don't have much emprical evidence to prove it across the board, my guess is that the connectivity quest undertaken by these development teams was not cheap or easy. Nonetheless, connected application vendors have all incurred this cost, and, in some form or fashion, solved the connected application problem in a proprietary manner. In some cases (like Live Messenger and Yahoo Messenger), some level or interoperability is possible, but they are generally point solutions.&lt;/p&gt; &lt;p&gt;Where does this leave organizations that don't have the budget, expertise, or time to implement a custom connectivity solution? &lt;em&gt;This is the problem space where BizTalk.NET Services thrives.&lt;/em&gt; An organization can use BizTalk.NET Services to handle the connectivity, and frees up development resources to focus on the functionality of the application. The hope is that alleviating the connectivity burden allows organizations to deliver better applications faster and cheaper.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;State of the Project&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;As of the date of this post, BizTalk.NET Services is in CTP form, and the team has adopted an Agile mindset. They drop code frequently, and alter the trajectory of the project based on feedback (and other things). As I understand it, the team had not committed to a release date, and there are many discussions internally regarding how these services will be made available to the community and customers. &lt;/p&gt; &lt;p&gt;In my discussions with the team, there is no doubt that they are eager to receive feedback about existing and non-existing features. As an example, the latest drop includes support for username / password security. Before this drop, the product had support for CardSpace security only. The inclusion of username / password security was largely driven by community feedback.&lt;/p&gt; &lt;p&gt;I encourage you to download the BizTalk.NET Services SDK and write some code with it. You can find it here (&lt;a href="http://labs.biztalk.net"&gt;http://labs.biztalk.net&lt;/a&gt;). That site also includes links for how to provide feedback to the team.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;How BizTalk.NET Services Surfaces to the Developer&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;In it's current form, BizTalk.NET Services is visible to developers&amp;nbsp;via a new WCF binding (named the RelayBinding). The RelayBinding type utilizes WCF extensibility points and creates a channel stack that knows how to communicate with the BizTalk.NET Services servers in the cloud. More specifically, the RelayBinding creates a channel stack that includes a new transport channel that can connect with the BizTalk.NET Services servers in the cloud. The URI passed to this channel has a new scheme that helps distinguish it from other transports (sb://). The RelayBinding can be used with&amp;nbsp;the existing ServiceHost implementations for listening, as well as the&amp;nbsp;existing ChannelFactory&amp;lt;T&amp;gt; implementations&amp;nbsp;to send messages&amp;nbsp;to other messaging participants.&lt;/p&gt; &lt;p&gt;The transport channels do the heavy lifting of connecting to the&amp;nbsp;servers in the cloud as well as participating in sending and receiving messages. The servers in the cloud do the heavy lifting of connecting applications. The compostion of the URI and the configuration of the RelayBinding object (and the resultant channel stack) dictate&amp;nbsp;which applications are connected and how they are connected to one another.&lt;/p&gt; &lt;p&gt;Several types of connections are possible, and these will be the subject of another post (or several other posts).&lt;/p&gt; &lt;p&gt;One of the takeaways with this model is that user or applicaiton code is not hosted in the cloud. The services in the cloud broker the connections between instances of a client application.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Futures&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;As I understand it, the team's work items include furthering the scalability of this system, the inclusion of workflow into the services, and&amp;nbsp;enhancing the security features of the services. Keep in mind that this project is nascent, and the team is intentionally agile. If you have opinions or feedback about any of these features, I encourage you to contact the team via the address shown earlier.&lt;/p&gt; &lt;p&gt;I fully expect to write much more about this cool new project, so stay tuned.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3209919" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Services+in+the+Cloud/default.aspx">Services in the Cloud</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk+Services/default.aspx">BizTalk Services</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/Web+Programming+with+WCF/default.aspx">Web Programming with WCF</category><category domain="http://blogs.msdn.com/justinjsmith/archive/tags/BizTalk.NET+Services/default.aspx">BizTalk.NET Services</category></item></channel></rss>