<?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>Paolo Salvatori's Blog</title><link>http://blogs.msdn.com/b/paolos/</link><description>Adventures in the magic world of BizTalk Server, WCF and Azure.</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.19431 (Build: 5.6.583.19431)</generator><item><title>Handling Topics, Queues and Relay Services with the Service Bus Explorer Tool</title><link>http://blogs.msdn.com/b/paolos/archive/2011/11/24/handling-topics-queues-and-relay-services-with-the-service-bus-explorer-tool.aspx</link><pubDate>Thu, 24 Nov 2011 16:49:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10241331</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10241331</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/11/24/handling-topics-queues-and-relay-services-with-the-service-bus-explorer-tool.aspx#comments</comments><description>The Windows Azure Service Bus Community Technology Preview (CTP), which was released in May 2011, first introduced queues and topics. At that time, the Windows Azure Management Portal didn’t provide a user interface to administer, create and delete messaging...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/11/24/handling-topics-queues-and-relay-services-with-the-service-bus-explorer-tool.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10241331" width="1" height="1"&gt;</description></item><item><title>How to integrate a BizTalk Server application with Service Bus Queues and Topics</title><link>http://blogs.msdn.com/b/paolos/archive/2011/11/03/how-to-integrate-a-biztalk-server-application-with-service-bus-queues-and-topics.aspx</link><pubDate>Thu, 03 Nov 2011 09:19:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10233510</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10233510</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/11/03/how-to-integrate-a-biztalk-server-application-with-service-bus-queues-and-topics.aspx#comments</comments><description>Microsoft BizTalk Server enables organizations to connect and extend heterogeneous systems across the enterprise and with trading partners. The Service Bus is part of Windows Azure AppFabric and is designed to provide connectivity, queuing, and routing...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/11/03/how-to-integrate-a-biztalk-server-application-with-service-bus-queues-and-topics.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10233510" width="1" height="1"&gt;</description></item><item><title>Microsoft BizTalk 2010: Line of Business Systems Integration</title><link>http://blogs.msdn.com/b/paolos/archive/2011/09/18/microsoft-biztalk-2010-line-of-business-systems-integration.aspx</link><pubDate>Sun, 18 Sep 2011 08:07:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10213078</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10213078</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/09/18/microsoft-biztalk-2010-line-of-business-systems-integration.aspx#comments</comments><description>I want to recommend a book I reviewed this weekend: Microsoft BizTalk 2010: Line of Business Systems Integration . Written by 5 BizTalk Server experts Microsoft BizTalk 2010: Line of Business Systems Integration is a new book from Packt. It is a guide...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/09/18/microsoft-biztalk-2010-line-of-business-systems-integration.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10213078" width="1" height="1"&gt;</description></item><item><title>How to use a WCF custom channel to implement client-side caching in a Windows Azure-hosted application</title><link>http://blogs.msdn.com/b/paolos/archive/2011/09/14/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching-in-a-windows-azure-hosted-application.aspx</link><pubDate>Wed, 14 Sep 2011 05:42:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10210539</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10210539</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/09/14/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching-in-a-windows-azure-hosted-application.aspx#comments</comments><description>Introduction Some months ago I created a custom WCF protocol channel to transparently inject client-side caching capabilities into an existing WCF-enabled application just changing the its configuration file. Since I posted my first post on this subject...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/09/14/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching-in-a-windows-azure-hosted-application.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10210539" width="1" height="1"&gt;</description></item><item><title>Exploring Topics and Queues by Building a Service Bus Explorer Tool–Part 1</title><link>http://blogs.msdn.com/b/paolos/archive/2011/07/08/exploring-topics-and-queues-by-building-a-service-bus-explorer-tool-part-1.aspx</link><pubDate>Fri, 08 Jul 2011 15:06:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10184613</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10184613</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/07/08/exploring-topics-and-queues-by-building-a-service-bus-explorer-tool-part-1.aspx#comments</comments><description>Introduction WARNING Due to the breaking changes introduced by the production version of the Service Bus Messaging API with respect to the CTP version, this version of the Service Bus Explorer tool doesn’t compile against the API contained in the Windows...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/07/08/exploring-topics-and-queues-by-building-a-service-bus-explorer-tool-part-1.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10184613" width="1" height="1"&gt;</description></item><item><title>A Broker Pipeline Component for End-To-End Ordered Delivery</title><link>http://blogs.msdn.com/b/paolos/archive/2011/06/01/a-broker-pipeline-component-for-end-to-end-ordered-delivery.aspx</link><pubDate>Wed, 01 Jun 2011 01:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10169587</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10169587</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/06/01/a-broker-pipeline-component-for-end-to-end-ordered-delivery.aspx#comments</comments><description>Introduction Recently I had chance to work with a health care company that makes an extensive use of the BizTalk Accelerator for HL7 for processing a large amount of messages containing clinical and administrative information. Health care companies need...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/06/01/a-broker-pipeline-component-for-end-to-end-ordered-delivery.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10169587" width="1" height="1"&gt;</description></item><item><title>How to use a WCF custom channel to implement client-side caching</title><link>http://blogs.msdn.com/b/paolos/archive/2011/04/05/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching.aspx</link><pubDate>Tue, 05 Apr 2011 17:05:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10150111</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10150111</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/04/05/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching.aspx#comments</comments><description>Introduction A couple of months ago Yossi Dahan told me that one of his customers in the UK was searching for a solution to transparently cache the response messages resulting from a WCF call. I immediately thought that this design pattern could be implemented...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/04/05/how-to-use-a-wcf-custom-channel-to-implement-client-side-caching.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10150111" width="1" height="1"&gt;</description></item><item><title>Exploring Windows Azure Storage APIs By Building a Storage Explorer Application</title><link>http://blogs.msdn.com/b/paolos/archive/2011/02/21/yet-another-application-to-handle-windows-azure-storage-services.aspx</link><pubDate>Mon, 21 Feb 2011 16:23:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10132251</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10132251</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/02/21/yet-another-application-to-handle-windows-azure-storage-services.aspx#comments</comments><description>Introduction The Windows Azure platform provides storage services for different kinds of persistent and transient data: Unstructured binary and text data Binary and text messages Structured data In order to support these categories of data, Windows Azure...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/02/21/yet-another-application-to-handle-windows-azure-storage-services.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10132251" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Azure/">Azure</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Storage+Account/">Storage Account</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Queue/">Queue</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Blob/">Blob</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Table/">Table</category></item><item><title>Intellisense when editing Service Bus configuration files? Yes please!</title><link>http://blogs.msdn.com/b/paolos/archive/2011/02/07/intellisense-when-editing-service-bus-configuration-files-yes-please.aspx</link><pubDate>Mon, 07 Feb 2011 18:38:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10125813</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10125813</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/02/07/intellisense-when-editing-service-bus-configuration-files-yes-please.aspx#comments</comments><description>The problem The setup of Windows Azure&amp;#160; AppFabric SDK adds the elements reported in the table below to the configuration contained in the the machine.config files under the following folders: %windir%\Microsoft.NET\Framework\v4.0.30319\Config %windir...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/02/07/intellisense-when-editing-service-bus-configuration-files-yes-please.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10125813" width="1" height="1"&gt;</description></item><item><title>How to use Duplex MEP to communicate with BizTalk from a .NET application or a WF workflow running inside AppFabric Part 3</title><link>http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-3.aspx</link><pubDate>Thu, 20 Jan 2011 15:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10117623</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10117623</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-3.aspx#comments</comments><description>Introduction In the first article of the series we discussed how to exchange messages with an orchestration via a two-way WCF Receive Location using the Duplex Message Exchange Pattern . This form of bi-directional communication is characterized by the...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-3.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10117623" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Best+Practices/">Best Practices</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric/">AppFabric</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/-NET4/">.NET4</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Correlation/">Correlation</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Mapper/">Mapper</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric+Connect/">AppFabric Connect</category></item><item><title>How to use Duplex MEP to communicate with BizTalk from a .NET application or a WF workflow running inside AppFabric Part 2</title><link>http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-2.aspx</link><pubDate>Thu, 20 Jan 2011 10:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10118600</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10118600</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-2.aspx#comments</comments><description>Introduction In the first article of the series we discussed how to exchange messages with an orchestration via a two-way WCF Receive Location using the Duplex Message Exchange Pattern . This form of bi-directional communication is characterized by the...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2011/01/20/how-to-use-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-2.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10118600" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Best+Practices/">Best Practices</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric/">AppFabric</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/-NET4/">.NET4</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Correlation/">Correlation</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Mapper/">Mapper</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric+Connect/">AppFabric Connect</category></item><item><title>How to use Duplex MEP to communicate with BizTalk from a .NET application or a WF workflow running inside AppFabric Part 1</title><link>http://blogs.msdn.com/b/paolos/archive/2010/11/23/how-using-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-1.aspx</link><pubDate>Mon, 22 Nov 2010 23:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10105605</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10105605</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/11/23/how-using-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-1.aspx#comments</comments><description>Introduction Some time ago, I was asked by a customer whether or not BizTalk WCF Adapters support the Duplex Message Exchange Pattern. The latter is characterized by the ability of both the service and the client to send messages to each other independently...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/11/23/how-using-duplex-mep-to-communicate-with-biztalk-from-a-net-application-or-a-wf-workflow-running-inside-appfabric-part-1.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10105605" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric/">AppFabric</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/-NET4/">.NET4</category></item><item><title>How to use AppFabric Auto-Start feature to avoid warm-up delays for IIS-hosted WCF Receive Locations</title><link>http://blogs.msdn.com/b/paolos/archive/2010/10/30/how-using-appfabric-auto-start-feature-to-avoid-warm-up-delays-for-iis-hosted-wcf-receive-locations.aspx</link><pubDate>Sat, 30 Oct 2010 06:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10083384</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10083384</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/10/30/how-using-appfabric-auto-start-feature-to-avoid-warm-up-delays-for-iis-hosted-wcf-receive-locations.aspx#comments</comments><description>Scenario 
 During recent years, I had the chance to work with many customers and I realized that one of the most recurring problems they usually experience is due to long start-up times: indeed, this is not a BizTalk specific issue, it&amp;rsquo;s rather...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/10/30/how-using-appfabric-auto-start-feature-to-avoid-warm-up-delays-for-iis-hosted-wcf-receive-locations.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10083384" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/ESB/">ESB</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Best+Practices/">Best Practices</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/AppFabric/">AppFabric</category></item><item><title>How to Boost Performance of the ESB Routing and Transform Services – Part 3</title><link>http://blogs.msdn.com/b/paolos/archive/2010/09/24/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-3.aspx</link><pubDate>Fri, 24 Sep 2010 18:13:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10067473</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10067473</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/09/24/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-3.aspx#comments</comments><description>Introduction &amp;#160; In the first article of the series, we discussed the advantages and disadvantages of using Dynamic Send Ports in a BizTalk application and in particular within a solution that makes an extensive use of the ESB Toolkit. We also talked...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/09/24/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-3.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10067473" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/ESB/">ESB</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Best+Practices/">Best Practices</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/WCF/">WCF</category></item><item><title>Large Message Transfer with WCF-Adapters Part 2</title><link>http://blogs.msdn.com/b/paolos/archive/2010/09/09/large-message-transfer-with-wcf-adapters-part-2.aspx</link><pubDate>Thu, 09 Sep 2010 09:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10059706</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10059706</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/09/09/large-message-transfer-with-wcf-adapters-part-2.aspx#comments</comments><description>Introduction 
 In the first part of the article we have introduced and analyzed the problem regarding the transmission and reception of a large message via a WCF Receive Location. In particular, we discussed the difference between the Buffered and Streamed...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/09/09/large-message-transfer-with-wcf-adapters-part-2.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10059706" width="1" height="1"&gt;</description></item><item><title>How to Boost Performance of the ESB Routing and Transform Services – Part 2</title><link>http://blogs.msdn.com/b/paolos/archive/2010/07/12/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-2.aspx</link><pubDate>Mon, 12 Jul 2010 17:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10037202</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10037202</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/07/12/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-2.aspx#comments</comments><description>Introduction In the first part of the article, we discussed the advantages and disadvantages of Dynamic Send Ports and we introduced two custom components that allow, respectively, to use Static Send Ports instead of Dynamic Send Port with an ESB Itinerary...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/07/12/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-2.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10037202" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/paolos/archive/tags/BizTalk+Server/">BizTalk Server</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/Dynamic+Send+Ports/">Dynamic Send Ports</category><category domain="http://blogs.msdn.com/b/paolos/archive/tags/ESB+Toolkit/">ESB Toolkit</category></item><item><title>How to Boost Performance of the ESB Routing and Transform Services – Part 1</title><link>http://blogs.msdn.com/b/paolos/archive/2010/07/07/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-1.aspx</link><pubDate>Wed, 07 Jul 2010 09:37:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10035308</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10035308</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/07/07/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-1.aspx#comments</comments><description>Introduction Recently I had chance to work with a couple of customers that make extensive use the ESB Toolkit (specifically, V 2.0 in this case) in their BizTalk solutions, and to exchange ideas with some of you regarding the alleged performance problems...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/07/07/how-to-boost-performance-of-the-esb-routing-and-transform-services-part-1.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10035308" width="1" height="1"&gt;</description></item><item><title>Video Recordings from the meeting of the Swedish BizTalk User Group</title><link>http://blogs.msdn.com/b/paolos/archive/2010/06/09/video-recordings-from-the-meeting-of-the-swedish-biztalk-user-group.aspx</link><pubDate>Tue, 08 Jun 2010 22:37:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10021965</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10021965</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/06/09/video-recordings-from-the-meeting-of-the-swedish-biztalk-user-group.aspx#comments</comments><description>Below you can find a link to the video recording of the presentations that Mikael Håkanssons and Ewan Fairweather delivered at the meeting of the Swedish BizTalk User Group. Instrument your BizTalk Server Optimizing and verifying your BizTalk Server installation...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/06/09/video-recordings-from-the-meeting-of-the-swedish-biztalk-user-group.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10021965" width="1" height="1"&gt;</description></item><item><title>Large Message Transfer with WCF-Adapters Part 1</title><link>http://blogs.msdn.com/b/paolos/archive/2010/05/25/large-message-transfer-with-wcf-adapters-part-1.aspx</link><pubDate>Tue, 25 May 2010 08:20:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10014436</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10014436</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/05/25/large-message-transfer-with-wcf-adapters-part-1.aspx#comments</comments><description>Introduction This is the first in a series of articles that will introduce and explore a couple a patterns to transfer and process large messages using WCF-Adapters. Generally speaking, an end to end BizTalk solution adopts the FTP Adapter or one of its...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/05/25/large-message-transfer-with-wcf-adapters-part-1.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10014436" width="1" height="1"&gt;</description></item><item><title>Packt's SOA book Promotion</title><link>http://blogs.msdn.com/b/paolos/archive/2010/04/28/packt-s-soa-book-promotion.aspx</link><pubDate>Wed, 28 Apr 2010 07:11:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10003705</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=10003705</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/04/28/packt-s-soa-book-promotion.aspx#comments</comments><description>I publish the following announcement by Packt Publishing as some of you might be interested in their promotions: Innovative and fast-growing IT publisher, Packt Publishing ( www.PacktPub.com ) has announced a series of giveaways and promotions, including...(&lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/04/28/packt-s-soa-book-promotion.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10003705" width="1" height="1"&gt;</description></item><item><title>Yet on BizTalk Impersonation With WCF Adapters</title><link>http://blogs.msdn.com/b/paolos/archive/2010/04/15/yet-on-biztalk-impersonation-with-wcf-adapters.aspx</link><pubDate>Thu, 15 Apr 2010 14:33:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9996527</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=9996527</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/04/15/yet-on-biztalk-impersonation-with-wcf-adapters.aspx#comments</comments><description>&lt;h1&gt;Scenario&lt;/h1&gt;  &lt;p align="justify"&gt;Last year I wrote a &lt;a href="http://blogs.msdn.com/paolos/archive/2009/01/20/biztalk-server-and-protocol-transition.aspx"&gt;post&lt;/a&gt; on how using BizTalk Server 2006 R2/2009 and&lt;font class="myBold"&gt; Protocol Transition&lt;/font&gt; to impersonate the original caller when invoking a downstream service that uses the Windows Integrated Security. Recently, one customer posed the following question to my colleague, Tim Wieman:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;Can I create a WCF Send Port that is able to impersonate a statically defined domain user, other than then the service account of the host instance process, when calling a downstream WCF service that exposes a BasicHttpBinding/WsHttpBinding endpoint configured to use the Transport security mode ?&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The answer is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Yes, when using the &lt;font class="myBold"&gt;Basic&lt;/font&gt; or the &lt;font class="myBold"&gt;Digest&lt;/font&gt; authentication scheme.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;No, when using the &lt;font class="myBold"&gt;Windows&lt;/font&gt; or &lt;font class="myBold"&gt;NTLM&lt;/font&gt; client credential type.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;To verify this constraint, you can proceed as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Open the &lt;font class="myBold"&gt;BizTalk Administration Console&lt;/font&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Create a new &lt;font class="myBold"&gt;WCF-BasicHttp&lt;/font&gt; or &lt;font class="myBold"&gt;WCF-WsHttp&lt;/font&gt; Static Solicit-Response Send Port&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Click the &lt;font class="myBold"&gt;Configure&lt;/font&gt; button. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Select the &lt;font class="myBold"&gt;Security&lt;/font&gt; tab.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Choose the &lt;font class="myBold"&gt;Transport&lt;/font&gt; security mode.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;At this point, if you select the &lt;font class="myBold"&gt;Basic&lt;/font&gt; or &lt;font class="myBold"&gt;Digest&lt;/font&gt; transport client credential type from the corresponding drop-down list:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;You can click the &lt;font class="myBold"&gt;Edit&lt;/font&gt; button in the &lt;font class="myBold"&gt;User name credentials&lt;/font&gt; section, as highlighted in the picture below. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&amp;#160; &lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/EditButton_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="EditButton" border="0" alt="EditButton" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/EditButton_thumb.jpg" width="422" height="582" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;You can specify the &lt;font class="myBold"&gt;Username&lt;/font&gt; and &lt;font class="myBold"&gt;Password&lt;/font&gt; of the account that the Send Port will impersonate when invoking the target WCF service. As an alternative, you can leverage the Single Sign-On to redeem a ticket and pick a user at runtime from a certain affiliate application.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/ClientCredentials_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ClientCredentials" border="0" alt="ClientCredentials" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/ClientCredentials_thumb.jpg" width="402" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Instead, if you select the &lt;font class="myBold"&gt;Ntlm &lt;/font&gt;or &lt;font class="myBold"&gt;Windows &lt;/font&gt;transport client credential type from the corresponding drop-down list, the &lt;font class="myBold"&gt;Edit&lt;/font&gt; button in the &lt;font class="myBold"&gt;User name credentials&lt;/font&gt; section is greyed out, as shown in the picture below:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/WCF-BasicHtpp_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="WCF-BasicHtpp" border="0" alt="WCF-BasicHtpp" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/WCF-BasicHtpp_thumb.jpg" width="422" height="582" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;So at this point some of you might ask yourselves:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;How can I impersonate a statically-defined user, different from the service account of the host process running my WCF Send Port, when invoking an underlying WCF service that uses the Transport security mode along with the Ntlm or Windows authentication scheme?&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The answer is straightforward, you can achieve this objective using the WCF-Custom adapter and writing a custom WCF channel. Indeed, I didn’t create a new component from scratch, I just used grabbed some code from &lt;a href="http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx"&gt;MSDN&lt;/a&gt;, and extended the component I wrote one year ago for my previous post on BizTalk and Protocol Transition .&amp;#160; In particular, I made the following changes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;I extended the following components:&lt;/div&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;InspectingBindingExtensionElement&lt;/font&gt;&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;InspectingBindingElement&lt;/font&gt;&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;InspectingChannelFactory&lt;/font&gt;&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;InspectingRequestChannel&lt;/font&gt;&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;to expose two additional properties:&lt;/div&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;WindowsUserName&lt;/font&gt;: gets or sets the domain account in the form of DOMAIN\Username that the Send Port will impersonate at runtime.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;WindowsUserPassword&lt;/font&gt;: gets or sets the password of the domain account.&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Then I extended the &lt;font class="myBold"&gt;WindowsUserPositionEnum&lt;/font&gt; type and therefore the &lt;font class="myBold"&gt;WindowsUserPosition&lt;/font&gt; property to include a new mode called &lt;font class="myBold"&gt;Static&lt;/font&gt;. As a consequence, the custom channel at runtime will retrieve the client credentials in a different way depending on the value of the &lt;font class="myBold"&gt;WindowsUserPosition&lt;/font&gt; property exposed by the &lt;font class="myBold"&gt;InspectingBindingExtensionElement&lt;/font&gt; component:&lt;/div&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;Context&lt;/font&gt;: username will be read from the message context property identified by the &lt;font class="myBold"&gt;ContextPropertyName&lt;/font&gt; and &lt;font class="myBold"&gt;ContextPropertyNamespace&lt;/font&gt; properties exposed by the InspectingBindingExtensionElement. In this case, the environment must be properly configured to use Protocol Transition. See my previous &lt;a href="http://blogs.msdn.com/paolos/archive/2009/01/20/biztalk-server-and-protocol-transition.aspx"&gt;post&lt;/a&gt; for more details.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;Message&lt;/font&gt;: username will be read from the message using the XPath expression contained in the &lt;font class="myBold"&gt;WindowsUserXPath&lt;/font&gt; property. Even in this case, the environment must be properly configured to use Protocol Transition. See my previous &lt;a href="http://blogs.msdn.com/paolos/archive/2009/01/20/biztalk-server-and-protocol-transition.aspx"&gt;post&lt;/a&gt; for more details.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;&lt;font class="myBold"&gt;Static&lt;/font&gt;: the custom channel will use the client credentials contained in the &lt;font class="myBold"&gt;WindowsUserName&lt;/font&gt; and &lt;font class="myBold"&gt;WindowsUserPassword&lt;/font&gt; to impersonate the corresponding domain account before invoking the downstream WCF service. &lt;strong&gt;&lt;font class="myBold"&gt;Note&lt;/font&gt;&lt;/strong&gt;: this pattern requires the component to uses the client credentials to invoke the &lt;a href="http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx"&gt;LogonUser&lt;/a&gt; function at runtime, but it does not require to configure the BizTalk environment for Protocol Transition.&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;I finally extended the &lt;font class="myBold"&gt;InspectingRequestChannel&lt;/font&gt; and &lt;font class="myBold"&gt;InspectingHelper&lt;/font&gt; classes to support the new &lt;font class="myBold"&gt;Static&lt;/font&gt; mode. In particular, the custom channel at runtime performs the following steps to impersonate a given domain account declaratively defined in the WCF Send Port configuration:&lt;/div&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;It calls the &lt;font class="myBold"&gt;LogonUser&lt;/font&gt; static method exposed by the &lt;font class="myBold"&gt;InspectingHelper&lt;/font&gt; class which in turn invokes the &lt;a href="http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx"&gt;LogonUser&lt;/a&gt; Windows function which returns a token handle.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;The channel creates a new &lt;a href="http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx"&gt;WindowsIdentity&lt;/a&gt; object using the constructor that accepts the user token returned by the previous call.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Then, it invokes the &lt;a href="http://msdn.microsoft.com/en-us/library/w070t6ka.aspx"&gt;Impersonate&lt;/a&gt; method exposed by the &lt;a href="http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx"&gt;WindowsIdentity&lt;/a&gt; object.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;The channel invokes the underlying channel.&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;In the finally block, when the call is complete, the channel invokes the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.undo.aspx"&gt;Undo&lt;/a&gt; method on the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx"&gt;WindowsImpersonationContext&lt;/a&gt; object returned by the &lt;a href="http://msdn.microsoft.com/en-us/library/w070t6ka.aspx"&gt;Impersonate&lt;/a&gt; method, an then it invokes the &lt;font class="myBold"&gt;CloseHandle&lt;/font&gt; static method exposed by the &lt;font class="myBold"&gt;InspectingHelper&lt;/font&gt; class which in turn invokes the &lt;a href="http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx"&gt;CloseHandle&lt;/a&gt; Windows function.&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;For your convenience, I report below the new code for the &lt;font class="myBold"&gt;InspectingRequestChannel&lt;/font&gt; and &lt;font class="myBold"&gt;InspectingHelper&lt;/font&gt; classes (I purposely omitted parts for ease of reading):&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;font class="myBold"&gt;InspectingHelper class&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="900"&gt;         &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Copyright
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="rem"&gt;// Author:  Paolo Salvatori&lt;/span&gt;
&lt;span class="rem"&gt;// Email:   paolos@microsoft.com&lt;/span&gt;
&lt;span class="rem"&gt;// History: 2008-09-17 Created&lt;/span&gt;
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="preproc"&gt;#region&lt;/span&gt; Using Directives
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Principal;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Permissions;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel.Channels;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.DirectoryServices.ActiveDirectory;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.XPath;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.ProtocolTransition.WCFExtensionLibrary
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// This class exposes the logic to impersonate another user using the Protocol Transition mechanism.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; InspectingHelper
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; DllImport
        [DllImport(&lt;span class="str"&gt;&amp;quot;advapi32.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;, CharSet = CharSet.Unicode)]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
            &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonType, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLogonProvider, &lt;span class="kwrd"&gt;ref&lt;/span&gt; IntPtr phToken);

        [DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto)]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CloseHandle(IntPtr handle);
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Constants
        &lt;span class="kwrd"&gt;...&lt;br /&gt;&lt;/span&gt;        &lt;span class="rem"&gt;// The following constants are used when calling the LogonUser external function&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; LOGON32_PROVIDER_DEFAULT = 0;
        &lt;span class="rem"&gt;//This parameter causes LogonUser to create a primary token.&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; LOGON32_LOGON_INTERACTIVE = 2;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Static Fields
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; domainFQDN = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Static Constructor
        &lt;span class="kwrd"&gt;static&lt;/span&gt; InspectingHelper()
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                Domain domain = Domain.GetComputerDomain();
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (domain != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    domainFQDN = domain.Name;
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                Debug.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(MessageFormat, ex.Message));
            }
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Static Public Methods
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetUserPrincipalName(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Message message, 
                                                  WindowsUserPositionEnum windowsUserPosition,
                                                  &lt;span class="kwrd"&gt;string&lt;/span&gt; contextPropertyName,
                                                  &lt;span class="kwrd"&gt;string&lt;/span&gt; contextPropertyNamespace,
                                                  &lt;span class="kwrd"&gt;string&lt;/span&gt; windowsUserXPath,
                                                  &lt;span class="kwrd"&gt;string&lt;/span&gt; windowsUserName,
                                                  &lt;span class="kwrd"&gt;string&lt;/span&gt; windowsUserPassword,
                                                  &lt;span class="kwrd"&gt;int&lt;/span&gt; maxBufferSize,
                                                  &lt;span class="kwrd"&gt;bool&lt;/span&gt; traceEnabled,
                                                  &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; userName,
                                                  &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; domainName)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; windowsUser = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            domainName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            userName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;switch&lt;/span&gt; (windowsUserPosition)
                {
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WindowsUserPositionEnum.Message:
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (message != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                            !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(windowsUserXPath))
                        {
                            MessageBuffer messageBuffer = message.CreateBufferedCopy(maxBufferSize);
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageBuffer == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(MessageBufferCannotBeNull);
                            }
                            Message clone = messageBuffer.CreateMessage();
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (message == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(CloneCannotBeNull);
                            }
                            message = messageBuffer.CreateMessage();
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (message == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(MessageCannotBeNull);
                            }
                            XmlDictionaryReader xmlDictionaryReader = clone.GetReaderAtBodyContents();
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlDictionaryReader == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(XmlDictionaryReaderCannotBeNull);
                            }
                            XPathCollection xPathCollection = &lt;span class="kwrd"&gt;new&lt;/span&gt; XPathCollection();
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (xPathCollection == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(XPathCollectionCannotBeNull);
                            }
                            XPathReader xPathReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XPathReader(xmlDictionaryReader, xPathCollection);
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (xPathReader == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                            {
                                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(XPathReaderCannotBeNull);
                            }
                            xPathCollection.Add(windowsUserXPath);
                            &lt;span class="kwrd"&gt;bool&lt;/span&gt; ok = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                            &lt;span class="kwrd"&gt;while&lt;/span&gt; (xPathReader.ReadUntilMatch())
                            {
                                &lt;span class="kwrd"&gt;if&lt;/span&gt; (xPathReader.Match(0) &amp;amp;&amp;amp; !ok)
                                {
                                    windowsUser = xPathReader.ReadString();
                                    ok = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                                }
                            }
                        }
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WindowsUserPositionEnum.Context:
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(contextPropertyName))
                        {
                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(ContextPropertyNameCannotBeNull);
                        }
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(contextPropertyNamespace))
                        {
                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(ContextPropertyNamespaceCannotBeNull);
                        }
                        &lt;span class="kwrd"&gt;string&lt;/span&gt; contextPropertyKey = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(ContextPropertyKeyFormat, &lt;br /&gt;                                                                  contextPropertyNamespace, &lt;br /&gt;                                                                  contextPropertyName);
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (message.Properties.ContainsKey(contextPropertyKey))
                        {
                            windowsUser = message.Properties[contextPropertyKey] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;
                        }
                        &lt;span class="kwrd"&gt;else&lt;/span&gt;
                        {
                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(NoContextPropertyFormat, contextPropertyKey));
                        }
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; WindowsUserPositionEnum.Static:
                        windowsUser = windowsUserName;
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;

                }
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(windowsUser))
                {
                    &lt;span class="kwrd"&gt;string&lt;/span&gt;[] parts = windowsUser.Split(&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;char&lt;/span&gt;[] { Path.DirectorySeparatorChar });
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (parts != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                        parts.Length &amp;gt; 1)
                    {
                        domainName = parts[0];
                        userName = parts[1];
                        Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CreatingUPNFormat, windowsUser));
                        &lt;span class="kwrd"&gt;string&lt;/span&gt; upn = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(UserPrincipalNameFormat, parts[1], domainFQDN);
                        Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(UsingUserPrincipalNameFormat, upn));
                        &lt;span class="kwrd"&gt;return&lt;/span&gt; upn;
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(MessageFormat, ex.Message));
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; ex;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; LogonUser(&lt;span class="kwrd"&gt;string&lt;/span&gt; userName, 
                                     &lt;span class="kwrd"&gt;string&lt;/span&gt; domainName, 
                                     &lt;span class="kwrd"&gt;string&lt;/span&gt; windowsUserPassword,
                                     &lt;span class="kwrd"&gt;bool&lt;/span&gt; traceEnabled,
                                     &lt;span class="kwrd"&gt;ref&lt;/span&gt; IntPtr tokenHandle)
        {
            Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(StartLogonUserFormat, &lt;br /&gt;                                                          domainName ?? Unknown, &lt;br /&gt;                                                          userName ?? Unknown));
            &lt;span class="rem"&gt;// Call LogonUser to obtain a handle to an access token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; ok = LogonUser(userName, 
                                domainName, 
                                windowsUserPassword,
                                LOGON32_LOGON_INTERACTIVE, 
                                LOGON32_PROVIDER_DEFAULT,
                                &lt;span class="kwrd"&gt;ref&lt;/span&gt; tokenHandle);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (traceEnabled)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ok)
                {
                    Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(LogonUserSucceededFormat, &lt;br /&gt;                                                                  domainName ?? Unknown, &lt;br /&gt;                                                                  userName ?? Unknown));
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(LogonUserFailedFormat, &lt;br /&gt;                                                                  domainName ?? Unknown, &lt;br /&gt;                                                                  userName ?? Unknown));
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; ok;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CloseHandle(IntPtr tokenHandle,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; userName,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; domainName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; traceEnabled)
        {
            Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(StartCloseTokenFormat, &lt;br /&gt;                                                          domainName ?? Unknown, &lt;br /&gt;                                                          userName ?? Unknown));
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; ok = CloseHandle(tokenHandle);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (traceEnabled)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (ok)
                {
                    Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CloseTokenSucceededFormat, &lt;br /&gt;                                                                  domainName ?? Unknown, &lt;br /&gt;                                                                  userName ?? Unknown));
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CloseTokenFailedFormat, &lt;br /&gt;                                                                  domainName ?? Unknown, &lt;br /&gt;                                                                  userName ?? Unknown));
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; ok;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
    }
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&lt;strong&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;&lt;font class="myBold"&gt;InspectingRequestChannel class&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="900"&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; InspectingRequestChannel : InspectingChannelBase&amp;lt;IRequestChannel&amp;gt;,
                                        IRequestChannel
{
    ...

    &lt;span class="kwrd"&gt;public&lt;/span&gt; Message Request(Message message, TimeSpan timeout)
    {
        Message reply = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        &lt;span class="kwrd"&gt;string&lt;/span&gt; upn = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        WindowsImpersonationContext impersonationContext = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        IntPtr tokenHandle = &lt;span class="kwrd"&gt;new&lt;/span&gt; IntPtr(0);
        &lt;span class="kwrd"&gt;string&lt;/span&gt; userName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        &lt;span class="kwrd"&gt;string&lt;/span&gt; domainName = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (componentEnabled)
            {
                WindowsIdentity identity = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                upn = InspectingHelper.GetUserPrincipalName(&lt;span class="kwrd"&gt;ref&lt;/span&gt; message,
                                                                windowsUserPosition,
                                                                contextPropertyName,
                                                                contextPropertyNamespace,
                                                                windowsUserXPath,
                                                                windowsUserName,
                                                                windowsUserPassword,
                                                                maxBufferSize,
                                                                traceEnabled,
                                                                &lt;span class="kwrd"&gt;out&lt;/span&gt; userName,
                                                                &lt;span class="kwrd"&gt;out&lt;/span&gt; domainName);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (windowsUserPosition == WindowsUserPositionEnum.Static)
                {

                    &lt;span class="rem"&gt;// Call LogonUser to obtain a handle to an access token.&lt;/span&gt;
                    &lt;span class="kwrd"&gt;bool&lt;/span&gt; returnValue = InspectingHelper.LogonUser(userName, 
                                                                  domainName, 
                                                                  windowsUserPassword,
                                                                  traceEnabled,
                                                                  &lt;span class="kwrd"&gt;ref&lt;/span&gt; tokenHandle);
                    &lt;span class="rem"&gt;// Protocol Transition is not necessary in this case&lt;/span&gt;
                    identity = &lt;span class="kwrd"&gt;new&lt;/span&gt; WindowsIdentity(tokenHandle);
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(upn))
                    {
                        &lt;span class="rem"&gt;// Protocol Transition must be properly configured,&lt;/span&gt;
                        &lt;span class="rem"&gt;// otherwise the impersonation will fail&lt;/span&gt;
                        identity = &lt;span class="kwrd"&gt;new&lt;/span&gt; WindowsIdentity(upn);
                    }
                }
                Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(ImpersonatingFormat, upn));
                impersonationContext = identity.Impersonate();
                Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(ImpersonatedFormat, upn));
            }
            Debug.WriteLineIf(traceEnabled, CallingWebService);
            reply = &lt;span class="kwrd"&gt;this&lt;/span&gt;.InnerChannel.Request(message);
            Debug.WriteLineIf(traceEnabled, WebServiceCalled);
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
        {
            Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(MessageFormat, ex.Message));
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; ex;
        }
        &lt;span class="kwrd"&gt;finally&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (impersonationContext != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                impersonationContext.Undo();
                Debug.WriteLineIf(traceEnabled, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(ImpersonationUndoneFormat, upn ?? Unknown));
            }
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (tokenHandle != IntPtr.Zero)
            {
                InspectingHelper.CloseHandle(tokenHandle,
                                             userName,
                                             domainName,
                                             traceEnabled);
            }
        }
        &lt;span class="kwrd"&gt;return&lt;/span&gt; reply;
    }
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Test Case&lt;/h1&gt;

&lt;p&gt;To test my component, I created the following test case:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/7652.UseCase_5F00_66DDA238.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="UseCase" border="0" alt="UseCase" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/4786.UseCase_5F00_thumb_5F00_5FD59D86.jpg" width="920" height="335" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;WinForm driver application submits a new request to a WCF-NetTcp Request-Response Receive Location &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The Message Agent submits the incoming request message to the MessageBox (BizTalkMsgBoxDb). &lt;/li&gt;

  &lt;li&gt;The inbound request is consumed by a Solicit Response WCF-Custom Send Port. This latter uses a Filter Expression to receive all the documents published by the Receive Port hosting the WCF Receive Location. &lt;/li&gt;

  &lt;li&gt;The inbound message is mapped to the request format by the downstream HelloWorldService web service. This latter is hosted by IIS and exposes a single WsHttpBinding endpoint. &lt;/li&gt;

  &lt;li&gt;The WCF-Custom Send Port impersonates the user statically defined in the Port configuration and invokes the underlying HelloWorldService WCF service that in the scenario is hosted by a separate Application Pool (w3wp.exe) on the same IIS instance. &lt;/li&gt;

  &lt;li&gt;The HelloWorldService WCF service returns a response message. &lt;/li&gt;

  &lt;li&gt;The incoming response message is mapped to the format expected by the client application. &lt;/li&gt;

  &lt;li&gt;The transformed response message is published to the MessageBox. &lt;/li&gt;

  &lt;li&gt;The response message is retrieved by the Request-Response WCF Custom Receive Location which originally received the request call. &lt;/li&gt;

  &lt;li&gt;The response message is returned to the client WinForm application. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The following picture shows the binding configuration of the WCF Send Port used to communicate with the HelloWorldService.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/BindingConfig_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="BindingConfig" border="0" alt="BindingConfig" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/BindingConfig_thumb.jpg" width="789" height="582" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Finally, the picture below reports the trace captured during a test run.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/DebugView_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DebugView" border="0" alt="DebugView" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/ReturntoBizTalkserverandProtocolTransiti_D10E/DebugView_thumb.jpg" width="920" height="228" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;&lt;font class="myBold"&gt;&lt;strong&gt;Conclusions&lt;/strong&gt;&lt;/font&gt;&lt;/h1&gt;

&lt;p align="justify"&gt;As I explained in &lt;a href="http://blogs.msdn.com/paolos/archive/2009/11/17/customizing-and-extending-the-biztalk-wcf-adapters.aspx"&gt;one&lt;/a&gt; of my recent posts, using WCF extensibility points allows you customize in-depth the default behavior of BizTalk WCF Adapters. In particular, the WCF-Custom Adapter provides the possibility to specify the customize the composition of the binding and hence of the channel stack that will be created and used at runtime to communicate with external applications. &lt;/p&gt;

&lt;p align="justify"&gt;In this article we have seen how to exploit this characteristic to workaround and bypass a constraint of WCF Adapters. As usual, I had just a few hours to write the code and write the article, so should you find an error or a problem in my component, please send me an email or leave a comment on my blog, thanks!&lt;/p&gt;

&lt;p align="justify"&gt;You can find the new version of the code &lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/ProtocolTransitionBTS2009.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9996527" width="1" height="1"&gt;</description></item><item><title>How To Boost Message Transformations Using the XslCompiledTransform class Extended</title><link>http://blogs.msdn.com/b/paolos/archive/2010/04/08/how-to-boost-message-transformations-using-the-xslcompiledtransform-class-extended.aspx</link><pubDate>Thu, 08 Apr 2010 12:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9992360</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=9992360</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/04/08/how-to-boost-message-transformations-using-the-xslcompiledtransform-class-extended.aspx#comments</comments><description>&lt;h1&gt;&lt;strong&gt;&lt;span class="myBold"&gt;Problem Statement&lt;/span&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;p align="justify"&gt;Some of you posted the following feedback regarding my post &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;How To Boost Message Transformations Using the XslCompiledTransform class&lt;/a&gt;:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;"Very nice post. I just have a question. How would you handle multiple input messages in a map? I have a map that has 2 input source messages that i would like to unit test. The BTS expression shape has transform(outmsg) = map(msg1, msg2), but i have not yet found a way to do it in a C# class."&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;&lt;span class="myBold"&gt;Solution&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p align="justify"&gt;Well, before answering to this question, I'll briefly explain how BizTalk Server handles maps with multiple input messages. BizTalk Server uses a trick to manage this situation. In fact, when you create a transformation map with multiple source document, BizTalk uses an envelope to wrap the individual input messages. For those of you who love to disassemble BizTalk code with Reflector, the envelope is created at runtime by the private class called &lt;span class="myBold"&gt;CompositeStreamReader&lt;/span&gt; that can be found within the assembly &lt;span class="myBold"&gt;Microsoft.XLANGs.Engine&lt;/span&gt;. In particular, the &lt;span class="myBold"&gt;ConstructCompositeOutline&lt;/span&gt; method uses the code reported in the table below&lt;/p&gt;
&lt;table bgcolor="#f4f4f4" cellpadding="5" cellspacing="0" border="0" style="width: 1005px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="900" valign="top"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ConstructCompositeOutline()
{
    ...
    XmlTextWriter writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextWriter(&lt;span class="kwrd"&gt;this&lt;/span&gt;.outlineStream, ...);
    writer.WriteStartElement(&lt;span class="str"&gt;"Root"&lt;/span&gt;, &lt;span class="str"&gt;"http://schemas.microsoft.com/BizTalk/2003/aggschema"&lt;/span&gt;);
    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.readerCount; i++)
    {
        writer.WriteStartElement(&lt;span class="str"&gt;"InputMessagePart_"&lt;/span&gt; + i.ToString(), &lt;span class="str"&gt;""&lt;/span&gt;);
        writer.WriteComment(&lt;span class="str"&gt;"_"&lt;/span&gt;);
        writer.WriteEndElement();
    }
    writer.WriteEndElement();
    writer.Flush();
    ...
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;to create an envelope which targetNamespace is equal to '&lt;a href="http://schemas.microsoft.com/BizTalk/2003/aggschema'"&gt;http://schemas.microsoft.com/BizTalk/2003/aggschema'&lt;/a&gt; and that contains as many &lt;span class="myBold"&gt;InputMessagePart&lt;/span&gt; elements as the incoming documents to the map.&lt;/p&gt;
&lt;table bgcolor="#f4f4f4" cellpadding="5" cellspacing="0" border="0" style="width: 1005px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="900" valign="top"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ns0:Root&lt;/span&gt; &lt;span class="attr"&gt;xmlns:ns0&lt;/span&gt;&lt;span class="kwrd"&gt;='http://schemas.microsoft.com/BizTalk/2003/aggschema'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;InputMessagePart_0&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        -
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;InputMessagePart_0&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;InputMessagePart_1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        -
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;InputMessagePart_1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ns0:Root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Therefore, I decided to extend the code of my classes &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslCompiledTransformHelper&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslTransformHelper&lt;/a&gt; to handle the case of maps with multiple input messages. In particular, I developed a new class called &lt;span class="myBold"&gt;CompositeStream&lt;/span&gt; to wrap an array of &lt;span class="myBold"&gt;Stream &lt;/span&gt;objects, one for each input message to the map, an return the above envelope. The implementation of this custom class is quite smart, because instead of copying the bytes of the input streams within a new buffer or a new stream, the &lt;span class="myBold"&gt;Read&lt;/span&gt; method just makes up the content of the envelope with the data of the inbound streams to return a composite message with the format expected by the map. When the inbound streams are significantly large,&amp;nbsp; this approach allows saving time and memory for copying data from the inbound streams to a new object, regardless if this latter is a buffer or a stream. The code of the &lt;span class="myBold"&gt;CompositeStream&lt;/span&gt; class is shown in the table below:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;CompositeStream Class&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;table bgcolor="#f4f4f4" cellpadding="5" cellspacing="0" border="0" style="width: 1005px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="900" valign="top"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Copyright
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="rem"&gt;// Author:  Paolo Salvatori&lt;/span&gt;
&lt;span class="rem"&gt;// Email:   paolos@microsoft.com&lt;/span&gt;
&lt;span class="rem"&gt;// History: 2010-04-07 Created&lt;/span&gt;
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="preproc"&gt;#region&lt;/span&gt; Using References
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Xsl;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.BaseTypes;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.Core;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.Streaming;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.Properties;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CompositeStream : Stream
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Types
        &lt;span class="kwrd"&gt;enum&lt;/span&gt; State
        {
            Start,
            Overflow,
            Stream,
            End
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Constants
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; DefaultPrefix = &lt;span class="str"&gt;"babo"&lt;/span&gt;;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StartRoot = &lt;span class="str"&gt;"&amp;lt;{0}:Root xmlns:{0}='http://schemas.microsoft.com/BizTalk/2003/aggschema'&amp;gt;"&lt;/span&gt;;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; EndRoot = &lt;span class="str"&gt;"&amp;lt;/{0}:Root&amp;gt;"&lt;/span&gt;;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StartInputMessagePart = &lt;span class="str"&gt;"&amp;lt;InputMessagePart_{0}&amp;gt;"&lt;/span&gt;;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; EndInputMessagePart = &lt;span class="str"&gt;"&amp;lt;/InputMessagePart_{0}&amp;gt;"&lt;/span&gt;;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Fields
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; currentStream = 0;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; currentIndex = 0;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; prefix;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; State state;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] overflowBuffer;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; Stream[] streams;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; endOfDocument = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Constructors
        &lt;span class="kwrd"&gt;public&lt;/span&gt; CompositeStream(Stream[] streams)
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.prefix = DefaultPrefix;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.streams = streams;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.state = State.Start;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; CompositeStream(Stream[] streams, &lt;span class="kwrd"&gt;string&lt;/span&gt; prefix)
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.prefix = prefix;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.streams = streams;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.state = State.Start;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Properties
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanRead
        {
            get 
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanSeek
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanTimeout
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanWrite
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; Length
        {
            get
            {
                &lt;span class="kwrd"&gt;int&lt;/span&gt; prefixLength = prefix.Length;
                &lt;span class="kwrd"&gt;long&lt;/span&gt; length = 76 + 3 * prefixLength;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (streams != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    streams.Length &amp;gt; 0)
                {
                    &lt;span class="kwrd"&gt;string&lt;/span&gt; index;
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; streams.Length; i++)
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (streams[i].CanSeek)
                        {
                            index = i.ToString();
                            length += streams[i].Length + 39 + 2 * index.Length;
                        }
                        &lt;span class="kwrd"&gt;else&lt;/span&gt;
                        {
                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(); 
                        }
                    }
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; length;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; Position
        {
            get 
            { 
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (state == State.Start)
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; 0L;
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(); 
                }
            }
            set
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 0L)
                {
                    ResetStream();
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
                } 
            }
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Methods
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Read(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer, &lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; count)
        {
            &lt;span class="kwrd"&gt;int&lt;/span&gt; bytesWritten = 0;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; bytesRead = 0;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; length = 0;
            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] localBuffer;
            StringBuilder builder;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (state == State.End)
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;
            }
            &lt;span class="kwrd"&gt;while&lt;/span&gt; (bytesWritten &amp;lt; count &amp;amp;&amp;amp;
                   state != State.End)
            {
                &lt;span class="kwrd"&gt;switch&lt;/span&gt; (state)
                {
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; State.Start:
                        builder = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(128);
                        builder.AppendFormat(StartRoot, prefix);
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (streams != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                            streams.Length &amp;gt; 0)
                        {
                            builder.AppendFormat(StartInputMessagePart, currentStream);
                        }
                        localBuffer = Encoding.UTF8.GetBytes(builder.ToString());

                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (localBuffer.Length &amp;lt;= count)
                        {
                            Array.Copy(localBuffer, 0, buffer, offset, localBuffer.Length);
                            bytesWritten += localBuffer.Length;
                            offset += bytesWritten;
                            state = State.Stream;
                        }
                        &lt;span class="kwrd"&gt;else&lt;/span&gt;
                        {
                            Array.Copy(localBuffer, 0, buffer, offset, count);
                            overflowBuffer = localBuffer;
                            currentIndex = count;
                            state = State.Overflow;
                            &lt;span class="kwrd"&gt;return&lt;/span&gt; count;
                        }
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; State.Overflow:
                        length = overflowBuffer.Length - currentIndex;
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (length &amp;lt;= count)
                        {
                            Array.Copy(overflowBuffer, currentIndex, buffer, offset, length);
                            bytesWritten += length;
                            offset += length;
                            overflowBuffer = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                            currentIndex = 0;
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (endOfDocument)
                            {
                                state = State.End;
                            }
                            &lt;span class="kwrd"&gt;else&lt;/span&gt;
                            {
                                state = State.Stream;
                            }
                        }
                        &lt;span class="kwrd"&gt;else&lt;/span&gt;
                        {
                            Array.Copy(overflowBuffer, currentIndex, buffer, offset, count);
                            currentIndex += count;
                            &lt;span class="kwrd"&gt;return&lt;/span&gt; count;
                        }
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                    &lt;span class="kwrd"&gt;case&lt;/span&gt; State.Stream:
                        length = count - bytesWritten;
                        bytesRead = streams[currentStream].Read(buffer, offset, length);
                        bytesWritten += bytesRead;
                        offset += bytesRead;
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (bytesWritten &amp;lt; count)
                        {
                            builder = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(128);
                            builder.AppendFormat(EndInputMessagePart, currentStream);
                            currentStream++;
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentStream &amp;lt; streams.Length)
                            {
                                builder.AppendFormat(StartInputMessagePart, currentStream);
                                localBuffer = Encoding.UTF8.GetBytes(builder.ToString());
                            }
                            &lt;span class="kwrd"&gt;else&lt;/span&gt;
                            {
                                builder.AppendFormat(EndRoot, prefix);
                                localBuffer = Encoding.UTF8.GetBytes(builder.ToString());
                                endOfDocument = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                            }
                            &lt;span class="kwrd"&gt;if&lt;/span&gt; (localBuffer.Length &amp;lt;= count - bytesWritten)
                            {
                                Array.Copy(localBuffer, 0, buffer, offset, localBuffer.Length);
                                bytesWritten += localBuffer.Length;
                                offset += localBuffer.Length;
                                &lt;span class="kwrd"&gt;if&lt;/span&gt; (endOfDocument)
                                {
                                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (bytesWritten &amp;lt;= count)
                                    {
                                        state = State.End;
                                    }
                                    &lt;span class="kwrd"&gt;return&lt;/span&gt; bytesWritten;
                                }
                                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                            }
                            &lt;span class="kwrd"&gt;else&lt;/span&gt;
                            {
                                length = count - bytesWritten;
                                Array.Copy(localBuffer, 0, buffer, offset, length);
                                overflowBuffer = localBuffer;
                                currentIndex = length;
                                state = State.Overflow;
                                &lt;span class="kwrd"&gt;return&lt;/span&gt; count;
                            }
                        }
                        &lt;span class="kwrd"&gt;else&lt;/span&gt;
                        {
                            &lt;span class="kwrd"&gt;return&lt;/span&gt; count;
                        }
                        &lt;span class="kwrd"&gt;break&lt;/span&gt;;                        
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; bytesWritten;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; IAsyncResult BeginRead(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer, &lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; count, AsyncCallback callback, &lt;span class="kwrd"&gt;object&lt;/span&gt; state)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.BeginRead(buffer, offset, count, callback, state);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; IAsyncResult BeginWrite(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer, &lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; count, AsyncCallback callback, &lt;span class="kwrd"&gt;object&lt;/span&gt; state)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.BeginWrite(buffer, offset, count, callback, state);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer, &lt;span class="kwrd"&gt;int&lt;/span&gt; offset, &lt;span class="kwrd"&gt;int&lt;/span&gt; count)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetLength(&lt;span class="kwrd"&gt;long&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; Seek(&lt;span class="kwrd"&gt;long&lt;/span&gt; offset, SeekOrigin origin)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (offset == 0 &amp;amp;&amp;amp;
                origin == SeekOrigin.Begin)
            {
                ResetStream();
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Flush()
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Methods
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ResetStream()
        {
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; streams.Length; i++)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (streams[i].CanSeek)
                {
                    streams[i].Seek(0, SeekOrigin.Begin);
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(); 
                }
            }
            state = State.Start;
            endOfDocument = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            currentStream = 0;
            currentIndex = 0;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
    }
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Then I extended the &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslCompiledTransformHelper&lt;/a&gt; class with a set of new methods that accept as parameter an array of objects of type &lt;span class="myBold"&gt;Stream&lt;/span&gt; or &lt;span class="myBold"&gt;XLANGMessage&lt;/span&gt; and use an instance of the &lt;span class="myBold"&gt;CompositeStream&lt;/span&gt; class to apply a transformation map to these latter.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;XslCompiledTransformHelper Class&lt;/strong&gt;&lt;/p&gt;
&lt;table bgcolor="#f4f4f4" cellpadding="5" cellspacing="0" border="0" style="width: 1005px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="900" valign="top"&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Copyright
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="rem"&gt;// Author:  Paolo Salvatori&lt;/span&gt;
&lt;span class="rem"&gt;// Email:   paolos@microsoft.com&lt;/span&gt;
&lt;span class="rem"&gt;// History: 2010-01-26 Created&lt;/span&gt;
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="preproc"&gt;#region&lt;/span&gt; Using References
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Xsl;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.XPath;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.BaseTypes;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.Core;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.Streaming;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.Properties;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; XslCompiledTransformHelper
    {&lt;br /&gt;        ...
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage[] messageArray,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt;[] partIndexArray,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; partName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    Stream[] streamArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stream[messageArray.Length];
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        streamArray[i] = messageArray[i][partIndexArray[i]].RetrieveAs(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Stream)) &lt;span class="kwrd"&gt;as&lt;/span&gt; Stream;
                    }
                    Stream response = Transform(streamArray, mapFullyQualifiedName, debug, bufferSize, thresholdSize);
                    CustomBTXMessage customBTXMessage = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                    customBTXMessage = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomBTXMessage(messageName, Service.RootService.XlangStore.OwningContext);
                    customBTXMessage.AddPart(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty, partName);
                    customBTXMessage[0].LoadFrom(response);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; customBTXMessage.GetMessageWrapperForUserCode();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            messageArray[i].Dispose();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray, 
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                MapInfo mapInfo = GetMapInfo(mapFullyQualifiedName, debug);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (mapInfo != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    CompositeStream compositeStream = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

                    &lt;span class="kwrd"&gt;try&lt;/span&gt;
                    {
                        VirtualStream virtualStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; VirtualStream(bufferSize, thresholdSize);
                        compositeStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CompositeStream(streamArray);
                        XmlTextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(compositeStream);
                        mapInfo.Xsl.Transform(reader, mapInfo.Arguments, virtualStream);
                        virtualStream.Seek(0, SeekOrigin.Begin);
                        &lt;span class="kwrd"&gt;return&lt;/span&gt; virtualStream;
                    }
                    &lt;span class="kwrd"&gt;finally&lt;/span&gt;
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (compositeStream != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            compositeStream.Close();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
        ...
    }
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In a similar way, I extended the &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslTransformHelper&lt;/a&gt; class to support maps with multiple input documents. For brevity, I omitted the code of this latter, but you can download the new version of both classes &lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;&lt;span class="myBold"&gt;Test&lt;/span&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;To test the new methods exposed by the classes &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslCompiledTransformHelper&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslTransformHelper&lt;/a&gt;, I created three XML schemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Credentials &lt;/li&gt;
&lt;li&gt;Address &lt;/li&gt;
&lt;li&gt;Customer &lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;In particular, the &lt;span class="myBold"&gt;Credentials&lt;/span&gt; and &lt;span class="myBold"&gt;Address&lt;/span&gt; schemas define two complex types used to build the &lt;span class="myBold"&gt;Customer&lt;/span&gt; schema. Then I created a transformation map (see the picture below) called &lt;span class="myBold"&gt;AddressAndCredentialsToCustomer&lt;/span&gt; that accepts 2 input messages, the first of type &lt;span class="myBold"&gt;Credentials &lt;/span&gt;and the second of type &lt;span class="myBold"&gt;Address&lt;/span&gt;, and returns a document of type &lt;span class="myBold"&gt;Customer&lt;/span&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/5165.MultiSourceMap_5F00_2E778978.jpg"&gt;&lt;img height="389" width="836" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/4520.MultiSourceMap_5F00_thumb_5F00_63C09BDD.jpg" alt="MultiSourceMap" border="0" title="MultiSourceMap" style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Finally I created 2 &lt;span class="myBold"&gt;Unit Test&lt;/span&gt; methods called:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TestXslTransformHelperWithMultipleInputs &lt;/li&gt;
&lt;li&gt;TestXslCompiledTransformHelperWithMultipleInputs &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to test the CompositeStream and the new methods exposed by the the classes &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslCompiledTransformHelper&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;XslTransformHelper&lt;/a&gt;. You can change the entries contained in the appSettings section of the App.Config file within the &lt;span class="myBold"&gt;UnitAndLoadTests&lt;/span&gt; project to test the 2 classes against your documents and multi-input-message maps.&lt;/p&gt;
&lt;h1&gt;&lt;span class="myBold"&gt;&lt;strong&gt;Conclusions&lt;/strong&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p align="justify"&gt;I updated the original &lt;a href="http://blogs.msdn.com/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx"&gt;post&lt;/a&gt; to reflect the extensions I made. &lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip"&gt;Here&lt;/a&gt; you can find a new version of my helper classes and the artifacts (schemas, maps, unit tests) I used to test them. &lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;&lt;span class="myBold"&gt;Note&lt;/span&gt;&lt;/strong&gt;: I spent less than one day to write and test the new code. In particular, I conducted a basic code coverage of the &lt;span class="myBold"&gt;CompositeStream&lt;/span&gt; class, but I didn&amp;rsquo;t test it with more than 2 streams or with large messages. If you find any error, please send me a repro and I&amp;rsquo;ll do my best, time permitting, to fix the code as soon as possible. Instead, should you find an error in my code and decide to sort it out by yourselves, please let me have the fixed version. ;-)&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9992360" width="1" height="1"&gt;</description></item><item><title>How to exploit the Text In Row table option to boost BizTalk Server Performance</title><link>http://blogs.msdn.com/b/paolos/archive/2010/03/16/how-to-exploit-the-text-in-row-table-option-to-boost-biztalk-server-performance.aspx</link><pubDate>Tue, 16 Mar 2010 10:32:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9979351</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=9979351</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/03/16/how-to-exploit-the-text-in-row-table-option-to-boost-biztalk-server-performance.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;h1&gt;Text in Row Table Option in SQL Server&lt;/h1&gt;  &lt;p align="justify"&gt;In SQL Server, &lt;b&gt;text&lt;/b&gt;, &lt;b&gt;ntext&lt;/b&gt;, or &lt;b&gt;image&lt;/b&gt; fields are large character or binary strings (up to 2 gigabytes) that by default stored outside a data row. The data row contains only a 16-byte text pointer that points to the root node of a tree built of internal pointers. These pointers map the pages in which the string fragments are stored. &lt;/p&gt;  &lt;p align="justify"&gt;SQL Server provides a table option called &lt;b&gt;text in row&lt;/b&gt; to declare that the contents of the fields of type &lt;b&gt;text&lt;/b&gt;, &lt;b&gt;ntext&lt;/b&gt;, or &lt;b&gt;image&lt;/b&gt; whose dimensions are smaller than those of a data page (8Kb) must be stored in the data row. When a large value type or a large object data type column value is stored in the data row, the Database Engine does not have to access a separate page or set of pages to read or write the character or binary string. This makes reading and writing the in-row strings about as fast as reading or writing limited size varchar, nvarchar, or varbinary strings. Similarly, when the values are stored off-row, the Database Engine incurs an additional page read or write.&lt;/p&gt;  &lt;p align="justify"&gt;For more information on this topic, see the following articles:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;SQL Server 2005&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;“&lt;i&gt;In-Row Data&lt;/i&gt;” topic in the &lt;a href="http://technet.microsoft.com/en-us/library/ms189087(SQL.90).aspx"&gt;SQL Server 2005 Books Online&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;“&lt;i&gt;sp_tableoption (Transact-SQL)&lt;/i&gt;” topic in the &lt;a href="http://msdn.microsoft.com/en-us/library/ms173530(SQL.90).aspx"&gt;SQL Server 2005 Books Online&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;b&gt;SQL Server 2008&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;“&lt;i&gt;In-Row Data&lt;/i&gt;” topic in the &lt;a href="http://technet.microsoft.com/en-us/library/ms189087.aspx"&gt;SQL Server 2008 Books Online&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;“&lt;i&gt;sp_tableoption (Transact-SQL)&lt;/i&gt;” topic in the &lt;a href="http://msdn.microsoft.com/en-us/library/ms173530.aspx"&gt;SQL Server 2008 Books Online&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h5 align="justify"&gt;&lt;font class="myBold"&gt;How to exploit the Text in Row table option in BizTalk Server&lt;/font&gt;&lt;/h5&gt;  &lt;p align="justify"&gt;The following section explains how and when applying the &lt;strong&gt;text in row&lt;/strong&gt; table option to boost BizTalk performance.&lt;/p&gt;  &lt;h1&gt;Parts Table&lt;/h1&gt;  &lt;p align="justify"&gt;When the message size is less than 8k the &lt;b&gt;text in row&lt;/b&gt; table option can be applied to the &lt;b&gt;Parts&lt;/b&gt; table that has 2 fields of type image:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;imgPart&lt;/b&gt;: contains a message Part or message part fragment&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;imgPropBag&lt;/b&gt;: contains the message part property bag.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;This technique can lead to a decrease of CPU usage up to 20-30% on the SQL and BizTalk nodes and to a significant improvement in terms of latency and throughput, when messages are smaller than 8kb.&lt;/p&gt;  &lt;h1&gt;Spool Table&lt;/h1&gt;  &lt;p align="justify"&gt;Similarly, when the average size of the message context is less than 8 kb, this technique can be extended to the &lt;b&gt;Spool&lt;/b&gt; table. This latter contains a column of type image:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;imgContext&lt;/b&gt;: this field contains the message context.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;To successfully apply this technique to the &lt;strong&gt;Spool&lt;/strong&gt; table, you must eliminate unnecessary context properties and distinguished fields to reduce the size of the message context below 8 Kb.&lt;/p&gt;  &lt;h1&gt;DynamicStateInfo Tables&lt;/h1&gt;  &lt;p align="justify"&gt;Finally, the &lt;b&gt;text in row &lt;/b&gt;table option can be applied to the &lt;b&gt;DynamicStateInfo_Host &lt;/b&gt;tables that contain the serialized state of orchestrations when they encounter a persistence point during their execution. These tables, one for each host, contain a field of type image:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;imgData&lt;/b&gt;: contains binary-serialized orchestrations&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;When orchestrations running within a host &lt;b&gt;HostA &lt;/b&gt;are so small that their size once serialized is less than 8 kb, the &lt;b&gt;text in row&lt;/b&gt; technique can successfully be applied to the &lt;b&gt;DynamicStateInfo_HostA &lt;/b&gt;table. Therefore it’s advisable to keep the internal state of orchestrations as small as possible. This technique can significantly reduce the time spent by the XLANG Engine to serialize, persist and restore the internal state of an orchestration in case of persistence point. Moreover, when the size of this latter is smaller than 8 Kb, it allows using the &lt;b&gt;text in row&lt;/b&gt; technique with &lt;b&gt;DynamicStateInfo_Host &lt;/b&gt;tables. The following techniques can be used to reduce the memory footprint of orchestrations:&lt;/p&gt;  &lt;p align="justify"&gt;· Create variables and messages as late as possible and release them as early as possible for example introducing non transactional scopes inside your orchestrations and declaring variables and messages within these inner scopes instead of declaring them at the top-most level.&lt;/p&gt;  &lt;p align="justify"&gt;· Use static variables and components whenever possible. When a persistence point occurs, these latter will not be serialized along with the orchestration.&lt;/p&gt;  &lt;h1&gt;Text In Row in Action&lt;/h1&gt;  &lt;p align="justify"&gt;During a recent Performance and Stability review with a customer, I applied the &lt;b&gt;text in row&lt;/b&gt; technique to the &lt;b&gt;Parts&lt;/b&gt; table (see the picture below) of the &lt;b&gt;BizTalkMsgBoxDb&lt;/b&gt; as the average size of messages processed by the BizTalk application was less than 2 Kb.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="5" width="382" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="380"&gt;         &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_tableoption N&lt;span class="str"&gt;'Parts'&lt;/span&gt;, &lt;span class="str"&gt;'text in row'&lt;/span&gt;, &lt;span class="str"&gt;'4000'&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;This led to a decrease of 22% in &lt;b&gt;% Processor Time &lt;/b&gt;on BizTalk nodes and to a significant reduction of I/O contention on the SQL Server instance hosting the &lt;b&gt;BizTalkMsgBoxDb&lt;/b&gt;.&lt;/p&gt;

&lt;h1&gt;&lt;strong&gt;&lt;font class="myBold"&gt;References&lt;/font&gt;&lt;/strong&gt;&lt;/h1&gt;

&lt;p align="justify"&gt;For more information on this topic, see the following articles:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;“&lt;i&gt;What you can and can't do with the MessageBox Database server&lt;/i&gt;” topic in the &lt;a href="http://blogs.msdn.com/Biztalk_Core_Engine/"&gt;BizTalk Core Engine's Weblog&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;i&gt;&amp;quot;BizTalk Server Database Optimization&amp;quot; article&lt;/i&gt; on &lt;a href="MSDN%20http:/msdn.microsoft.com/en-us/library/bb743398(BTS.10).aspx"&gt;MSDN&lt;/a&gt;.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9979351" width="1" height="1"&gt;</description></item><item><title>How to Throw Typed Fault Exceptions From Orchestrations Published as WCF Services Revisited</title><link>http://blogs.msdn.com/b/paolos/archive/2010/02/26/how-to-throw-typed-fault-exceptions-from-orchestrations-published-as-wcf-services-revisited.aspx</link><pubDate>Fri, 26 Feb 2010 15:18:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9969953</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=9969953</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/02/26/how-to-throw-typed-fault-exceptions-from-orchestrations-published-as-wcf-services-revisited.aspx#comments</comments><description>&lt;p&gt;A couple of you experienced the following error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Digest verification failed for Reference '#_0'”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;when using my component with the following configuration:    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Adapter: WCF-Custom    &lt;br /&gt;Binding: WsHttpBinding or NetTcpBinding     &lt;br /&gt;Security: Message     &lt;br /&gt;ClientCredentialType: Windows &lt;/p&gt;  &lt;p&gt;So I decided to reopen the project and look into this problem. I made some researches on MSDN finally I decided to change approach. Hence I made the following changes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I replaced the custom endpoint behavior with a custom service behavior. &lt;/li&gt;    &lt;li&gt;I substituted the &lt;a href="http://msdn.microsoft.com/en-us/library/aa717047.aspx"&gt;MessageInspector&lt;/a&gt; component with a custom class which implements the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx"&gt;IErrorHandler&lt;/a&gt; interface. This implementation is more appropriate to create a custom typed fault. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I successfully tested the new component using 3 different kinds of WCF Receive Locations: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scenario 1&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adapter: WCF-CustomIsolated &lt;/li&gt;    &lt;li&gt;Binding: WsHttpBinding &lt;/li&gt;    &lt;li&gt;Security Mode: None &lt;/li&gt;    &lt;li&gt;ClientCredentialType: N/A &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Scenario 2&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adapter: WCF-CustomIsolated &lt;/li&gt;    &lt;li&gt;Binding: WsHttpBinding &lt;/li&gt;    &lt;li&gt;Security Mode: Transport &lt;/li&gt;    &lt;li&gt;ClientCredentialType: Windows &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Scenario 3&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adapter: WCF-Custom &lt;/li&gt;    &lt;li&gt;Binding: NetTcpBinding &lt;/li&gt;    &lt;li&gt;Security Mode: Message &lt;/li&gt;    &lt;li&gt;ClientCredentialType: Windows &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Finally, I refreshed the content of the this my &lt;a href="http://blogs.msdn.com/paolos/archive/2009/05/22/how-to-throw-typed-fault-exceptions-from-orchestrations-published-as-wcf-services.aspx"&gt;post&lt;/a&gt; to reflect the new implementation and uploaded the code of the version &lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/PublishTypedFaultsBTS2009.zip?ccr=7573"&gt;here&lt;/a&gt;. In order to use the new component, you need to accomplish the following steps:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;read the article to understand the differences and characteristics of the new implementation. &lt;/li&gt;    &lt;li&gt;properly register the FQDN of the new &lt;font class="myBold"&gt;ErrorHandler&lt;/font&gt; assembly in the machine.config. &lt;/li&gt;    &lt;li&gt;Reconfigure your Receive Location to use the new custom service behavior instead of the previous custom endpoint behavior. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9969953" width="1" height="1"&gt;</description></item><item><title>How To Boost Message Transformations Using the XslCompiledTransform class</title><link>http://blogs.msdn.com/b/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx</link><pubDate>Fri, 29 Jan 2010 12:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9955273</guid><dc:creator>Paolo Salvatori</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/paolos/rsscomments.aspx?WeblogPostID=9955273</wfw:commentRss><comments>http://blogs.msdn.com/b/paolos/archive/2010/01/29/how-to-boost-message-transformations-using-the-xslcompiledtransform-class.aspx#comments</comments><description>&lt;h1&gt;Introduction&lt;/h1&gt;  &lt;p align="justify"&gt;The BizTalk Runtime still makes an extensive use of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;System.Xml.Xsl.XslTransform&lt;/a&gt;.&amp;#160; When you create and build a BizTalk project, a separate .NET class is generated. for each transformation map. Each of these classes inherits from the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xlangs.basetypes.transformbase(BTS.10).aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.xlangs.basetypes.transformbase(BTS.10).aspx"&gt;Microsoft.XLANGs.BaseTypes.TransformBase&lt;/a&gt; class. For convenience, I used &lt;a href="http://www.red-gate.com/products/reflector/" mce_href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/a&gt; to retrieve and report its code in the table below. As you can easily note, the get accessor of the &lt;font class="myBold"&gt;Transform&lt;/font&gt; property returns a &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; object. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;TransformBase class&lt;/strong&gt;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;pre class="csharpcode"&gt;[Serializable]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TransformBase
{
    &lt;span class="rem"&gt;// Methods&lt;/span&gt;
    &lt;span class="kwrd"&gt;protected&lt;/span&gt; TransformBase()
    {
    }

    &lt;span class="rem"&gt;// Properties&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] SourceSchemas
    {
        get
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; BTSXslTransform StreamingTransform
    {
        get
        {
            StringReader input = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(&lt;span class="kwrd"&gt;this&lt;/span&gt;.XmlContent);
            XmlTextReader stylesheet = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(input);
            BTSXslTransform transform = &lt;span class="kwrd"&gt;new&lt;/span&gt; BTSXslTransform();
            transform.Load(stylesheet, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;base&lt;/span&gt;.GetType().Assembly.Evidence);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; transform;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] TargetSchemas
    {
        get
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; XslTransform Transform
    {
        get
        {
            StringReader input = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(&lt;span class="kwrd"&gt;this&lt;/span&gt;.XmlContent);
            XmlTextReader stylesheet = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(input);
            XslTransform transform = &lt;span class="kwrd"&gt;new&lt;/span&gt; XslTransform();
            transform.Load(stylesheet, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;base&lt;/span&gt;.GetType().Assembly.Evidence);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; transform;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; XsltArgumentList TransformArgs
    {
        get
        {
            XmlDocument document = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();
            document.PreserveWhitespace = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            document.LoadXml(&lt;span class="kwrd"&gt;this&lt;/span&gt;.XsltArgumentListContent);
            XsltArgumentList list = &lt;span class="kwrd"&gt;new&lt;/span&gt; XsltArgumentList();
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (XmlNode node &lt;span class="kwrd"&gt;in&lt;/span&gt; document.SelectNodes(&lt;span class="str"&gt;&amp;quot;//ExtensionObjects/ExtensionObject&amp;quot;&lt;/span&gt;))
            {
                XmlAttributeCollection attributes = node.Attributes;
                XmlNode namedItem = attributes.GetNamedItem(&lt;span class="str"&gt;&amp;quot;Namespace&amp;quot;&lt;/span&gt;);
                XmlNode node3 = attributes.GetNamedItem(&lt;span class="str"&gt;&amp;quot;AssemblyName&amp;quot;&lt;/span&gt;);
                XmlNode node4 = attributes.GetNamedItem(&lt;span class="str"&gt;&amp;quot;ClassName&amp;quot;&lt;/span&gt;);
                &lt;span class="kwrd"&gt;object&lt;/span&gt; extension = Assembly.Load(node3.Value).CreateInstance(node4.Value);
                list.AddExtensionObject(namedItem.Value, extension);
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; list;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; XmlContent { get; }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; XsltArgumentListContent { get; }
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;

&lt;p align="justify"&gt;When BizTalk Server 2004 was built, the&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; was the only class provided by the Microsoft .NET Framework 1.1 to apply an XSLT to an inbound XML document. When the Microsoft .NET Framework version 2.0. was released, the&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; was declared obsolete and&amp;#160; thus deprecated. As clearly stated on &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;MSDN&lt;/a&gt;, the &lt;a href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx" mce_href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx"&gt;System.Xml.Xsl.XslCompiledTransform&lt;/a&gt; should be used instead. This class is used to compile and execute XSLT transformations. In most cases, the &lt;a href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx" mce_href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx"&gt;XslCompiledTransform&lt;/a&gt; class significantly outperforms the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class in terms of time need to execute the same XSLT against the same inbound XML document. The article &lt;a href="http://msdn.microsoft.com/en-us/library/66f54faw(VS.80).aspx" mce_href="http://msdn.microsoft.com/en-us/library/66f54faw(VS.80).aspx"&gt;Migrating From the XslTransform Class&lt;/a&gt; on MSDN reports as follows:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p align="justify"&gt;&lt;i&gt;“The XslCompiledTransform class includes many performance improvements. The new XSLT processor compiles the XSLT style sheet down to a common intermediate format, similar to what the common language runtime (CLR) does for other programming languages. Once the style sheet is compiled, it can be cached and reused.”&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;The caveat is that because the XSLT is compiled to MSIL, the first time the transform is run there is a performance hit, but subsequent executions are much faster. To avoid paying the extra cost of initial compilation every time a map is executed, this latter could be cached in a static structure (e.g. Dictionary). I’ll show you how to implement this pattern in the second part of the article. For a detailed look at the performance differences between the&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx" mce_href="http://msdn.microsoft.com/en-us/library/0610k0w4.aspx"&gt;XslCompiledTransform&lt;/a&gt; classes (plus comparisons with other XSLT processors) have a look at following posts.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://blogs.msdn.com/antosha/archive/2006/07/16/xslcompiledtransform-slower-than-xsltransform.aspx" mce_href="http://blogs.msdn.com/antosha/archive/2006/07/16/xslcompiledtransform-slower-than-xsltransform.aspx"&gt;XslCompiledTransform Performance: Beating MSXML 4.0&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://blogs.msdn.com/antosha/archive/2006/07/16/xslcompiledtransform-slower-than-xsltransform.aspx" mce_href="http://blogs.msdn.com/antosha/archive/2006/07/16/xslcompiledtransform-slower-than-xsltransform.aspx"&gt;XslCompiledTransform Slower than XslTransform?&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Although the overall performance of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class is better than the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.load.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.load.aspx"&gt;Load&lt;/a&gt; method of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class might perform more slowly than the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.load.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.load.aspx"&gt;Load&lt;/a&gt; method of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class the first time it is called on a transformation. This is because the XSLT file must be compiled before it is loaded. However, if you cache an &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; object for subsequent calls, its &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.transform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.transform.aspx"&gt;Transform&lt;/a&gt; method is incredibly faster than the equivalent &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.transform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.transform.aspx"&gt;Transform&lt;/a&gt; method of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class. Therefore, from a performance perspective:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p align="justify"&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class is the best choice in a &amp;quot;Load once, Transform once&amp;quot; scenario as it doesn't require the initial map-compilation.&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p align="justify"&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class is the best choice in a &amp;quot;Load once, Cache and Transform many times&amp;quot; scenario as it implies the initial cost for the map-compilation, but then this overhead is highly compensated by the fact that subsequent calls are much faster.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;As BizTalk is a server application (or, if you prefer an application server), the second scenario is more likely than the first.&amp;#160; The only way to take advantage of this class (given that BizTalk does not currently make use of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class) is to write custom components. If this seems a little strange to you, remember that all BizTalk versions since &lt;font class="myBold"&gt;BizTalk Server 2004&lt;/font&gt; have inherited that core engine, based on .NET Framework 1.1.&amp;#160; Since the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class wasn’t added until .NET Framework 2.0, it wasn’t leveraged in that version of BizTalk. While I’m currently working with the product group to see how best to take advantage of this class in the next version of BizTalk, let’s go ahead and walk through creating a helper class to boost the performance of message transformations in your current BizTalk implementation using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class and let’s compare its performance with another helper component that makes use the old &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class.&lt;/p&gt;

&lt;h1&gt;&lt;font class="myBold"&gt;BizTalk Application&lt;/font&gt;&lt;/h1&gt;

&lt;p align="justify"&gt;In order to compare the performance of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; classes I created an easy BizTalk application composed of the following projects:&lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Helpers&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;This library contains 2 helpers classes called, respectively, &lt;font class="myBold"&gt;XslTransformHelper&lt;/font&gt; and &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt;. These components share most of the code and expose the same static methods. I minimized the differences between the 2 classes as the final scope was to compare the performance of the &lt;font class="myBold"&gt;XslTransform&lt;/font&gt; and &lt;font class="myBold"&gt;XslCompiledTransform&lt;/font&gt; classes. As their name suggests, the first helper class uses the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltransform.aspx"&gt;XslTransform&lt;/a&gt; class, while the second makes use of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class.&amp;#160; The &lt;font class="myBold"&gt;Transform&lt;/font&gt; static method of both helper classes provides multiple overloads/variants/signatures. This allows the components to be invoked by any orchestration, pipeline component or .NET class in general. Either classes use a static Dictionary to cache maps in-process for later calls. The fully qualified name (&lt;a href="http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx" mce_href="http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx"&gt;FQDN&lt;/a&gt;) of a BizTalk map is used as key to retrieve the value of the corresponding instance within the Dictionary. The fully qualified name (&lt;a href="http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx" mce_href="http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx"&gt;FQDN&lt;/a&gt;) of a BizTalk map can be easily determined as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;Open the BizTalk Administration Console and navigate to the Maps folder within your BizTalk application.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Double click the map in question.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Copy the content of the Name label (see the picture below) and paste it in a text editor.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Append a comma followed by a space (“, “).&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Copy the content of the Assembly label (see the picture below) and paste it in a text editor.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/Map_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/Map_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Map" border="0" alt="Map" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/Map_thumb.jpg" width="654" height="527" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/Map_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Pretty easy, don’t you think?&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;XslTransformHelper class&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Copyright
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="rem"&gt;// Author:  Paolo Salvatori&lt;/span&gt;
&lt;span class="rem"&gt;// Email:   paolos@microsoft.com&lt;/span&gt;
&lt;span class="rem"&gt;// History: 2010-01-26 Created&lt;/span&gt;
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="preproc"&gt;#region&lt;/span&gt; Using References
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.XPath;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Xsl;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.BaseTypes;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.Core;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.Streaming;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.Properties;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; XslTransformHelper
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Constants
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultBufferSize = 10240; &lt;span class="rem"&gt;//10 KB&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultThresholdSize = 1048576; &lt;span class="rem"&gt;//1 MB&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; DefaultPartName = &lt;span class="str"&gt;&amp;quot;Body&amp;quot;&lt;/span&gt;;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Static Fields
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, TransformBase&amp;gt; mapDictionary;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Static Constructor
        &lt;span class="kwrd"&gt;static&lt;/span&gt; XslTransformHelper()
        {
            mapDictionary = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, TransformBase&amp;gt;();
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Static Methods
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                    &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                    &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(message,
                             0,
                             mapFullyQualifiedName,
                             messageName,
                             DefaultPartName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(message,
                             0,
                             mapFullyQualifiedName,
                             messageName,
                             DefaultPartName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; partIndex,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; partName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;using&lt;/span&gt; (Stream stream = message[partIndex].RetrieveAs(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Stream)) &lt;span class="kwrd"&gt;as&lt;/span&gt; Stream)
                {
                    Stream response = Transform(stream, mapFullyQualifiedName, debug, bufferSize, thresholdSize);
                    CustomBTXMessage customBTXMessage = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                    customBTXMessage = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomBTXMessage(messageName, Service.RootService.XlangStore.OwningContext);
                    customBTXMessage.AddPart(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty, partName);
                    customBTXMessage[0].LoadFrom(response);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; customBTXMessage.GetMessageWrapperForUserCode();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (message != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    message.Dispose();
                }
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage[] messageArray,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt;[] partIndexArray,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; partName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    Stream[] streamArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stream[messageArray.Length];
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        streamArray[i] = messageArray[i][partIndexArray[i]].RetrieveAs(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Stream)) &lt;span class="kwrd"&gt;as&lt;/span&gt; Stream;
                    }
                    Stream response = Transform(streamArray, mapFullyQualifiedName, debug, bufferSize, thresholdSize);
                    CustomBTXMessage customBTXMessage = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                    customBTXMessage = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomBTXMessage(messageName, Service.RootService.XlangStore.OwningContext);
                    customBTXMessage.AddPart(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty, partName);
                    customBTXMessage[0].LoadFrom(response);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; customBTXMessage.GetMessageWrapperForUserCode();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            messageArray[i].Dispose();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(stream,
                             mapFullyQualifiedName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(stream,
                             mapFullyQualifiedName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                TransformBase transformBase = GetTransformBase(mapFullyQualifiedName);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (transformBase != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    VirtualStream virtualStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; VirtualStream(bufferSize, thresholdSize);
                    XPathDocument xpathDocument = &lt;span class="kwrd"&gt;new&lt;/span&gt; XPathDocument(stream);
                    transformBase.Transform.Transform(xpathDocument, transformBase.TransformArgs, virtualStream);
                    virtualStream.Seek(0, SeekOrigin.Begin);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; virtualStream;
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.DynamicTransformsHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray, 
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                TransformBase transformBase = GetTransformBase(mapFullyQualifiedName);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (transformBase != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    CompositeStream compositeStream = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

                    &lt;span class="kwrd"&gt;try&lt;/span&gt;
                    {
                        VirtualStream virtualStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; VirtualStream(bufferSize, thresholdSize);
                        compositeStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CompositeStream(streamArray);
                        XPathDocument xpathDocument = &lt;span class="kwrd"&gt;new&lt;/span&gt; XPathDocument(compositeStream);
                        transformBase.Transform.Transform(xpathDocument, transformBase.TransformArgs, virtualStream);
                        virtualStream.Seek(0, SeekOrigin.Begin);
                        &lt;span class="kwrd"&gt;return&lt;/span&gt; virtualStream;
                    }
                    &lt;span class="kwrd"&gt;finally&lt;/span&gt;
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (compositeStream != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            compositeStream.Close();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.DynamicTransformsHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Static Methods
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; TransformBase GetTransformBase(&lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            TransformBase transformBase = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (mapDictionary)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!mapDictionary.ContainsKey(mapFullyQualifiedName))
                {
                    Type type = Type.GetType(mapFullyQualifiedName);
                    transformBase = Activator.CreateInstance(type) &lt;span class="kwrd"&gt;as&lt;/span&gt; TransformBase;
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (transformBase != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                    {
                        mapDictionary[mapFullyQualifiedName] = transformBase;
                    }
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    transformBase = mapDictionary[mapFullyQualifiedName];
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; transformBase;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
    }
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;XslCompiledTransformHelper class&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Copyright
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="rem"&gt;// Author:  Paolo Salvatori&lt;/span&gt;
&lt;span class="rem"&gt;// Email:   paolos@microsoft.com&lt;/span&gt;
&lt;span class="rem"&gt;// History: 2010-01-26 Created&lt;/span&gt;
&lt;span class="rem"&gt;//-------------------------------------------------&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="preproc"&gt;#region&lt;/span&gt; Using References
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Xsl;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.XPath;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.BaseTypes;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.XLANGs.Core;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.Streaming;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.Properties;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; XslCompiledTransformHelper
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Constants
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultBufferSize = 10240; &lt;span class="rem"&gt;//10 KB&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DefaultThresholdSize = 1048576; &lt;span class="rem"&gt;//1 MB&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; DefaultPartName = &lt;span class="str"&gt;&amp;quot;Body&amp;quot;&lt;/span&gt;;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Static Fields
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, MapInfo&amp;gt; mapDictionary;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Static Constructor
        &lt;span class="kwrd"&gt;static&lt;/span&gt; XslCompiledTransformHelper()
        {
            mapDictionary = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, MapInfo&amp;gt;();
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Static Methods
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                            &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                            &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(message,
                             0,
                             mapFullyQualifiedName,
                             messageName,
                             DefaultPartName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(message,
                             0,
                             mapFullyQualifiedName,
                             messageName,
                             DefaultPartName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage message,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; partIndex,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; partName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;using&lt;/span&gt; (Stream stream = message[partIndex].RetrieveAs(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Stream)) &lt;span class="kwrd"&gt;as&lt;/span&gt; Stream)
                {
                    Stream response = Transform(stream, mapFullyQualifiedName, debug, bufferSize, thresholdSize);
                    CustomBTXMessage customBTXMessage = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                    customBTXMessage = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomBTXMessage(messageName, Service.RootService.XlangStore.OwningContext);
                    customBTXMessage.AddPart(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty, partName);
                    customBTXMessage[0].LoadFrom(response);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; customBTXMessage.GetMessageWrapperForUserCode();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (message != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    message.Dispose();
                }
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XLANGMessage Transform(XLANGMessage[] messageArray,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt;[] partIndexArray,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; messageName,
                                             &lt;span class="kwrd"&gt;string&lt;/span&gt; partName,
                                             &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                             &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    Stream[] streamArray = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stream[messageArray.Length];
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        streamArray[i] = messageArray[i][partIndexArray[i]].RetrieveAs(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Stream)) &lt;span class="kwrd"&gt;as&lt;/span&gt; Stream;
                    }
                    Stream response = Transform(streamArray, mapFullyQualifiedName, debug, bufferSize, thresholdSize);
                    CustomBTXMessage customBTXMessage = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                    customBTXMessage = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomBTXMessage(messageName, Service.RootService.XlangStore.OwningContext);
                    customBTXMessage.AddPart(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty, partName);
                    customBTXMessage[0].LoadFrom(response);
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; customBTXMessage.GetMessageWrapperForUserCode();
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp;
                    messageArray.Length &amp;gt; 0)
                {
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; messageArray.Length; i++)
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageArray[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            messageArray[i].Dispose();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream, 
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(stream, 
                             mapFullyQualifiedName, 
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;, 
                             DefaultBufferSize, 
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(stream, 
                             mapFullyQualifiedName, 
                             debug, 
                             DefaultBufferSize, 
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream stream,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                MapInfo mapInfo = GetMapInfo(mapFullyQualifiedName, debug);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (mapInfo != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    XmlTextReader xmlTextReader = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

                    &lt;span class="kwrd"&gt;try&lt;/span&gt;
                    {
                        VirtualStream virtualStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; VirtualStream(bufferSize, thresholdSize);
                        xmlTextReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(stream);
                        mapInfo.Xsl.Transform(xmlTextReader, mapInfo.Arguments, virtualStream);
                        virtualStream.Seek(0, SeekOrigin.Begin);
                        &lt;span class="kwrd"&gt;return&lt;/span&gt; virtualStream;
                    }
                    &lt;span class="kwrd"&gt;finally&lt;/span&gt;
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlTextReader != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            xmlTextReader.Close();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray, 
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             &lt;span class="kwrd"&gt;false&lt;/span&gt;,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Transform(streamArray,
                             mapFullyQualifiedName,
                             debug,
                             DefaultBufferSize,
                             DefaultThresholdSize);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Stream Transform(Stream[] streamArray,
                                       &lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                       &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize,
                                       &lt;span class="kwrd"&gt;int&lt;/span&gt; thresholdSize)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                MapInfo mapInfo = GetMapInfo(mapFullyQualifiedName, debug);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (mapInfo != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    CompositeStream compositeStream = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

                    &lt;span class="kwrd"&gt;try&lt;/span&gt;
                    {
                        VirtualStream virtualStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; VirtualStream(bufferSize, thresholdSize);
                        compositeStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CompositeStream(streamArray);
                        XmlTextReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(compositeStream);
                        mapInfo.Xsl.Transform(reader, mapInfo.Arguments, virtualStream);
                        virtualStream.Seek(0, SeekOrigin.Begin);
                        &lt;span class="kwrd"&gt;return&lt;/span&gt; virtualStream;
                    }
                    &lt;span class="kwrd"&gt;finally&lt;/span&gt;
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (compositeStream != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                        {
                            compositeStream.Close();
                        }
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                ExceptionHelper.HandleException(Resources.XslCompiledTransformHelper, ex);
                TraceHelper.WriteLineIf(debug,
                                        &lt;span class="kwrd"&gt;null&lt;/span&gt;,
                                        ex.Message,
                                        EventLogEntryType.Error);
                &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Static Methods
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; MapInfo GetMapInfo(&lt;span class="kwrd"&gt;string&lt;/span&gt; mapFullyQualifiedName,
                                          &lt;span class="kwrd"&gt;bool&lt;/span&gt; debug)
        {
            MapInfo mapInfo = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (mapDictionary)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!mapDictionary.ContainsKey(mapFullyQualifiedName))
                {
                    Type type = Type.GetType(mapFullyQualifiedName);
                    TransformBase transformBase = Activator.CreateInstance(type) &lt;span class="kwrd"&gt;as&lt;/span&gt; TransformBase;
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (transformBase != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                    {
                        XslCompiledTransform map = &lt;span class="kwrd"&gt;new&lt;/span&gt; XslCompiledTransform(debug);
                        &lt;span class="kwrd"&gt;using&lt;/span&gt; (StringReader stringReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(transformBase.XmlContent))
                        {
                            XmlTextReader xmlTextReader = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

                            &lt;span class="kwrd"&gt;try&lt;/span&gt;
                            {
                                xmlTextReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(stringReader);
                                XsltSettings settings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XsltSettings(&lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);
                                map.Load(xmlTextReader, settings, &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlUrlResolver());
                                mapInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; MapInfo(map, transformBase.TransformArgs);
                                mapDictionary[mapFullyQualifiedName] = mapInfo;
                            }
                            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
                            {
                                &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlTextReader != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                                {
                                    xmlTextReader.Close();
                                }
                            }
                        }
                    }
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    mapInfo = mapDictionary[mapFullyQualifiedName];
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; mapInfo;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MapInfo
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Fields
        &lt;span class="kwrd"&gt;private&lt;/span&gt; XslCompiledTransform xsl;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; XsltArgumentList arguments;
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Constructors
        &lt;span class="kwrd"&gt;public&lt;/span&gt; MapInfo()
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.xsl = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.arguments = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; MapInfo(XslCompiledTransform xsl,
                       XsltArgumentList arguments)
        {
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.xsl = xsl;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.arguments = arguments;
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Properties
        &lt;span class="kwrd"&gt;public&lt;/span&gt; XslCompiledTransform Xsl
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.xsl;
            }
            set
            {
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.xsl = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; XsltArgumentList Arguments
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.arguments;
            }
            set
            {
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.arguments = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
            }
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
    }
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;Note&lt;/strong&gt;: Support for embedded scripts is an optional XSLT setting on the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/a&gt; class. Script support is disabled by default. Therefore, to enable script support, it’s necessary to create an &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltsettings.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltsettings.aspx"&gt;XsltSettings&lt;/a&gt; object with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltsettings.enablescript.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltsettings.enablescript.aspx"&gt;EnableScript&lt;/a&gt; property set to true and pass the object to the &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.load.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.load.aspx"&gt;Load&lt;/a&gt; method. That’s what I did in my code above.&lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Schemas&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;This project contains 2 Xml Schemas, &lt;font class="myBold"&gt;CalculatorRequest &lt;/font&gt;and &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;, which define, respectively, the request and response message and a &lt;font class="myBold"&gt;PropertySchema&lt;/font&gt; that defines the &lt;font class="myBold"&gt;Method&lt;/font&gt; promoted property. A &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message can contain zero or multiple &lt;font class="myBold"&gt;Operation&lt;/font&gt; elements, as shown in the following picture:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;CalculatorRequest message&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CalculatorRequest&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://microsoft.biztalk.cat/10/dynamictransforms/calculatorrequest&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Method&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;UnitTest&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Method&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operations&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;+&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;82&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;18&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;30&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;12&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;*&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;25&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;8&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;\&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operator&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;100&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;25&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operand2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operation&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Operations&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CalculatorRequest&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;

&lt;p align="justify"&gt;A &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; message contains a &lt;font class="myBold"&gt;Result&lt;/font&gt; element for each &lt;font class="myBold"&gt;Operation&lt;/font&gt; element within the corresponding &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message, as shown in the following picture:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;CalculatorResponse message&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CalculatorResponse&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://microsoft.biztalk.cat/10/dynamictransforms/calculatorresponse&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Status&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ok&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Status&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Results&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;100&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;None&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;18&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;None&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;200&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;None&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;4&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;None&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Error&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Result&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Results&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CalculatorResponse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Maps&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;This project contains the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; map (see the picture below) that transforms an inbound request message into the corresponding response message.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/CalculatorRequestToCalculatorResponse_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/CalculatorRequestToCalculatorResponse_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="CalculatorRequestToCalculatorResponse" border="0" alt="CalculatorRequestToCalculatorResponse" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/CalculatorRequestToCalculatorResponse_thumb.jpg" width="800" height="233" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/CalculatorRequestToCalculatorResponse_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Orchestrations&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;This project contains the 4 orchestrations.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;SingleDynamicTransform Test Case&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;This flow had been created just to test the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class within an orchestration.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/SingleDynamicTransform_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/SingleDynamicTransform_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SingleDynamicTransform" border="0" alt="SingleDynamicTransform" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/SingleDynamicTransform_thumb.jpg" width="492" height="533" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/SingleDynamicTransform_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;SingleDynamicTransform &lt;/font&gt;test case.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/3465.UseCase_5F00_1A707114.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase" border="0" alt="UseCase" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/2705.UseCase_5F00_thumb_5F00_17E73F56.jpg" width="920" height="320" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;A One-Way FILE Receive Location receives a new &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document from the IN folder. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The XML disassembler component within the &lt;font class="myBold"&gt;XMLTransmit&lt;/font&gt; pipeline promotes the &lt;font class="myBold"&gt;Method&lt;/font&gt; element inside the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document. The Message Agent submits the incoming message to the MessageBox (BizTalkMsgBoxDb). &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The inbound request starts a new instance of the &lt;font class="myBold"&gt;SingleDynamicTransform&lt;/font&gt;. This latter uses a Direct Bound Port and a Filter to receive only the CalculatorRequest messages with the Method promoted property = “SingleDynamicTransform”. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;SingleDynamicTransform &lt;/font&gt;invokes the &lt;font class="myBold"&gt;Transform&lt;/font&gt; static method exposed by the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class to apply the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map to the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt;&amp;#160; message and generate the corresponding &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; document. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; publishes the &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; message to the MessageBox (BizTalkMsgBoxDb). &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The response message is retrieved by a One-Way FILE Send Port. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The response message is written to an OUT folder by the One-Way FILE Send Port. &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;&amp;#160;&lt;/h4&gt;

&lt;h4&gt;DefaultStaticLoop Test Case&lt;/h4&gt;

&lt;p align="justify"&gt;As shown in the picture below, this orchestration receives a &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document (80KB)&amp;#160; and executes a loop (1000 iterations) in which it uses a &lt;font class="myBold"&gt;Transform&lt;/font&gt; Shape to apply the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map to the inbound message. The orchestration does not produce any response message. The code within the &lt;font class="myBold"&gt;StartStepTrace&lt;/font&gt; and &lt;font class="myBold"&gt;EndStepTrace&lt;/font&gt; Expression Shapes keeps track of the time spent to execute the map at each iteration, while the code contained in the final &lt;font class="myBold"&gt;Trace&lt;/font&gt; Expression Shape writes the total elapsed time on the standard output. The objective of this test case is to measure the time spent by the orchestration to apply the map to the inbound document 1000 times using the &lt;font class="myBold"&gt;Transform&lt;/font&gt; Shape. &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultStaticLoop_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultStaticLoop_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DefaultStaticLoop" border="0" alt="DefaultStaticLoop" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultStaticLoop_thumb.jpg" width="476" height="827" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultStaticLoop_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;DefaultStaticLoop &lt;/font&gt;test case. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/5531.UseCase2_5F00_499236DE.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase2" border="0" alt="UseCase2" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/4786.UseCase2_5F00_thumb_5F00_796CD89F.jpg" width="920" height="201" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt; &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;A One-Way FILE Receive Location receives a new &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document from the IN folder. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The XML disassembler component within the &lt;font class="myBold"&gt;XMLTransmit&lt;/font&gt; pipeline promotes the &lt;font class="myBold"&gt;Method&lt;/font&gt; element inside the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document. The Message Agent submits the incoming message to the MessageBox (BizTalkMsgBoxDb). &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The inbound request starts a new instance of the &lt;font class="myBold"&gt;DefaultStaticLoop &lt;/font&gt;. This latter uses a Direct Bound Port and a Filter to receive only the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; messages with the Method promoted property = “DefaultStaticLoop”. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;DefaultStaticLoop &lt;/font&gt;executes a loop (1000 iterations) in which it uses a &lt;font class="myBold"&gt;Transform&lt;/font&gt; Shape to apply the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map to the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message (80KB). &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;&amp;#160;&lt;/h4&gt;

&lt;h4&gt;DefaultDynamicLoop Test Case&lt;/h4&gt;

&lt;p align="justify"&gt;This component is a variation of the &lt;font class="myBold"&gt;DefaultStaticLoop &lt;/font&gt;orchestration. As this latter, it receives a &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document (80KB)&amp;#160; and executes a loop (1000 iterations), but it doesn’t use a &lt;font class="myBold"&gt;Transform&lt;/font&gt; shape to execute the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map against the inbound message, it rather uses a &lt;font class="myBold"&gt;Message Assignment&lt;/font&gt; Shape that contain the following code. See &lt;a href="http://msdn.microsoft.com/en-us/library/aa950573(BTS.10).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa950573(BTS.10).aspx"&gt;How to Use Expressions to Dynamic Transform Messages&lt;/a&gt; for more information on this topic. The objective of this test case is to measure the time spent by the orchestration to apply the map to the inbound document 1000 times using the &lt;font class="myBold"&gt;transform&lt;/font&gt; statement provided by the XLANG Runtime. &lt;/p&gt;

&lt;p align="justify" mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;startTime = System.DateTime.Now;
type = System.Type.GetType(&lt;span class="str"&gt;&amp;quot;&amp;lt;Map FQDN&amp;gt;&amp;quot;&lt;/span&gt;);
transform(CalculatorResponse) = type(CalculatorRequest);
stopTime = System.DateTime.Now;
elapsedTime = stopTime.Subtract(startTime);
total = total + elapsedTime.TotalMilliseconds;
i = i + 1;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;As the &lt;font class="myBold"&gt;DefaultStaticLoop&lt;/font&gt;, the orchestration does not produce any response. The code within the &lt;font class="myBold"&gt;CreateResponse &lt;/font&gt;Shape keeps track of the time spent to execute the map at each iteration, while the code contained in the final &lt;font class="myBold"&gt;Trace&lt;/font&gt; Expression Shape writes the total elapsed time on the standard output.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DefaultDynamicLoop" border="0" alt="DefaultDynamicLoop" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_thumb.jpg" width="476" height="675" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;DefaultDynamicLoop &lt;/font&gt;test case. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/8270.UseCase3_5F00_6B4DE9A2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase3" border="0" alt="UseCase3" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/0272.UseCase3_5F00_thumb_5F00_4915DE1C.jpg" width="920" height="201" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt; &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;A One-Way FILE Receive Location receives a new &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document from the IN folder. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The XML disassembler component within the &lt;font class="myBold"&gt;XMLTransmit&lt;/font&gt; pipeline promotes the &lt;font class="myBold"&gt;Method&lt;/font&gt; element inside the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document. The Message Agent submits the incoming message to the MessageBox (BizTalkMsgBoxDb). &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The inbound request starts a new instance of the &lt;font class="myBold"&gt;DefaultDynamicLoop &lt;/font&gt;. This latter uses a Direct Bound Port and a Filter to receive only the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; messages with the Method promoted property = “DefaultDynamicLoop”. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;DefaultDynamicLoop &lt;/font&gt;executes a loop (1000 iterations) in which it uses a &lt;font class="myBold"&gt;Message Assignment &lt;/font&gt;Shape to execute the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map against the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message (80KB). &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;strong&gt;CustomDynamicLoop Test Case&lt;/strong&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;As the previous orchestrations, the &lt;font class="myBold"&gt;CustomDynamicLoop&lt;/font&gt; receives a &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document (80KB)&amp;#160; and executes a loop (1000 iterations). However, instead of using a &lt;font class="myBold"&gt;Transform&lt;/font&gt; shape or the Dynamic Transformation mechanism provided by BizTalk to apply the map to the inbound document, it uses an Expression Shape (see the code below) to invoke the &lt;font class="myBold"&gt;Transform&lt;/font&gt; method exposed by my &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; component. The objective of this test case is to measure the time spent by the orchestration to apply the map to the inbound document 1000 times using the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class. &lt;/p&gt;

&lt;p align="justify" mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;startTime = System.DateTime.Now;
CalculatorResponse = Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Helpers.XslCompiledTransformHelper.Transform(CalculatorRequest, &lt;span class="str"&gt;&amp;quot;&amp;lt;Map FQDN&amp;gt;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&lt;/span&gt;);
stopTime = System.DateTime.Now;
elapsedTime = stopTime.Subtract(startTime);
total = total + elapsedTime.TotalMilliseconds;
i = i + 1;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;As the previous orchestrations, the &lt;font class="myBold"&gt;CustomDynamicLoop &lt;/font&gt;does not produce any response. The code within the final &lt;font class="myBold"&gt;Trace&lt;/font&gt; Expression Shape writes the total elapsed time on the standard output.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DefaultDynamicLoop" border="0" alt="DefaultDynamicLoop" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_thumb.jpg" width="476" height="675" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DefaultDynamicLoop_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;CustomDynamicLoop &lt;/font&gt;test case. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/6052.UseCase4_5F00_26056CAC.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase4" border="0" alt="UseCase4" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/5700.UseCase4_5F00_thumb_5F00_6EDBDEB2.jpg" width="920" height="201" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt; &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;A One-Way FILE Receive Location receives a new &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document from the IN folder. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The XML disassembler component within the &lt;font class="myBold"&gt;XMLTransmit&lt;/font&gt; pipeline promotes the &lt;font class="myBold"&gt;Method&lt;/font&gt; element inside the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document. The Message Agent submits the incoming message to the MessageBox (BizTalkMsgBoxDb). &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The inbound request starts a new instance of the &lt;font class="myBold"&gt;CustomDynamicLoop&lt;/font&gt;. This latter uses a Direct Bound Port and a Filter to receive only the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; messages with the Method promoted property = “CustomDynamicLoop”. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;CustomDynamicLoop &lt;/font&gt;executes a loop (1000 iterations) in which it uses a &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class to execute the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map against the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message (80KB). &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Pipeline Components&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;This project contains 2 custom pipeline components called, respectively, &lt;font class="myBold"&gt;TransformPipelineComponent&lt;/font&gt; and &lt;font class="myBold"&gt;LoopbackPipelineComponent&lt;/font&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;TransformPipelineComponent&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;This component can be used within a Receive or a Send custom pipeline to transform the inbound message using the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class. For the sake of brevity, we just report the code of the&amp;#160; &lt;font class="myBold"&gt;Execute&lt;/font&gt; method of in the picture below. Note that the if the loopback property exposed by the component equals true, this latter promotes the &lt;font class="myBold"&gt;RouteDirectToTp &lt;/font&gt;context property to true. This way, when the &lt;font class="myBold"&gt;TransformPipelineComponent&lt;/font&gt; is used by a Receive Pipeline within a Request-Response Receive Location, when the Message Agent posts the transformed message to the MessageBox, this latter is immediately returned as a response to the Receive Location (&lt;font class="myBold"&gt;Loopback&lt;/font&gt; pattern). &lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;Execute method&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IBaseMessage Execute(IPipelineContext context, IBaseMessage message)
{
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (componentEnabled)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (context == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;&amp;quot;The pipeline context parameter cannot be null.&amp;quot;&lt;/span&gt;);
            }
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (message != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                IBaseMessagePart bodyPart = message.BodyPart;
                Stream inboundStream = bodyPart.GetOriginalDataStream();
                Stream outboundStream = XslCompiledTransformHelper.Transform(inboundStream, mapFQDN, traceEnabled, bufferSize, thresholdSize);
                bodyPart.Data = outboundStream;
                context.ResourceTracker.AddResource(inboundStream);
                context.ResourceTracker.AddResource(outboundStream);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (loopback)
                {
                    message.Context.Promote(&lt;span class="str"&gt;&amp;quot;RouteDirectToTP&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;http://schemas.microsoft.com/BizTalk/2003/system-properties&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);
                }
            }
        }
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        ExceptionHelper.HandleException(&lt;span class="str"&gt;&amp;quot;TransformPipelineComponent&amp;quot;&lt;/span&gt;, ex);
        TraceHelper.WriteLineIf(traceEnabled,
                                context,
                                ex.Message,
                                EventLogEntryType.Error);
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; message;
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;LoopbackPipelineComponent&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;This component can be used to set the &lt;font class="myBold"&gt;RouteDirectToTp &lt;/font&gt;context property to true to implement the &lt;font class="myBold"&gt;Loopback&lt;/font&gt; pattern. When used within a Receive Pipeline, the component allows to promote the &lt;font class="myBold"&gt;MessageType&lt;/font&gt; property without the need to use an Xml Disassembler. At runtime, the MessageType is mandatory to determine the map to apply to a given message on a Request or Send Port.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;Execute method&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IBaseMessage Execute(IPipelineContext context, IBaseMessage message)
{
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (loopback)
        {
            message.Context.Promote(&lt;span class="str"&gt;&amp;quot;RouteDirectToTP&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;http://schemas.microsoft.com/BizTalk/2003/system-properties&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (messageType != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                message.Context.Promote(&lt;span class="str"&gt;&amp;quot;MessageType&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;http://schemas.microsoft.com/BizTalk/2003/system-properties&amp;quot;&lt;/span&gt;, messageType);
            }
        }
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        ExceptionHelper.HandleException(&lt;span class="str"&gt;&amp;quot;LoopbackPipelineComponent&amp;quot;&lt;/span&gt;, ex);
        TraceHelper.WriteLineIf(traceEnabled,
                                context,
                                ex.Message,
                                EventLogEntryType.Error);
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; message;
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;Pipelines&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;This project contains 2 custom pipelines:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;TransformReceivePipeline&lt;/font&gt;:this pipeline contains only an instance of the &lt;font class="myBold"&gt;TransformPipelineComponent&lt;/font&gt;.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;LoopbackReceivePipeline&lt;/font&gt;: this pipeline contains only an instance of the &lt;font class="myBold"&gt;LoopbackPipelineComponent&lt;/font&gt;.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Then, I created 2 use cases to compare the performance of the default message transformation provided by BizTalk Messaging Engine and the message transformation accomplished using my &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;TransformStaticallyDefined Test Case&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;TransformStaticallyDefined &lt;/font&gt;test case. &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/8032.UseCase5_5F00_3982A680.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase5" border="0" alt="UseCase5" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/6560.UseCase5_5F00_thumb_5F00_24B0AE00.jpg" width="754" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt; &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL&lt;/font&gt; WCF-NetTcp Request-Response Receive Location receives a &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document submitted running the &lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt; Unit Test within Visual Studio. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;LoopbackReceivePipeline &lt;/font&gt;promotes the &lt;font class="myBold"&gt;RouteDirectToTp &lt;/font&gt;property to true and the &lt;font class="myBold"&gt;MessageType&lt;/font&gt; property. I could have used the Xml Disassembler component within the Receive Pipeline to find and promote the MessageType, but I preferred to specify the MessageType of the inbound message as part of the configuration of the Receive Location (see the picture below). This way I can avoid the overhead introduced by the Xml Disassembler component and measure just the time spent by the Messaging Engine to apply the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map statically defined on the Receive Port. Once transformed the &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message into a &lt;font class="myBold"&gt;CalculatorResponse &lt;/font&gt;document, the Message Agent posts this latter to the MessageBox.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The transformed message is immediately returned to the Receive Location. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The response message is returned to the &lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt; Unit Test. &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;DT.TransformStaticallyDefined.RP Configuration&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;The screen below shows that the use of the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map has been statically configured on the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.RP &lt;/font&gt;Receive Port.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformStaticallyDefinedPort_6.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformStaticallyDefinedPort_6.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="TransformStaticallyDefinedPort" border="0" alt="TransformStaticallyDefinedPort" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformStaticallyDefinedPort_thumb_2.jpg" width="654" height="527" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformStaticallyDefinedPort_thumb_2.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL Configuration&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;The following picture shows the configuration of the &lt;font class="myBold"&gt;LoopbackReceivePipeline&lt;/font&gt; on the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL&lt;/font&gt; Receive Location.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/LoopbackReceivePipelineConfig_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/LoopbackReceivePipelineConfig_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="LoopbackReceivePipelineConfig" border="0" alt="LoopbackReceivePipelineConfig" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/LoopbackReceivePipelineConfig_thumb.jpg" width="643" height="430" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/LoopbackReceivePipelineConfig_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;&lt;font class="myBold"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;&lt;strong&gt;TransformReceivePipeline Test Case&lt;/strong&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;The following picture depicts the architecture of the &lt;font class="myBold"&gt;TransformReceivePipeline &lt;/font&gt;test case. &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/3362.UseCase6_5F00_5346B6E2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="UseCase6" border="0" alt="UseCase6" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-08-22-metablogapi/5824.UseCase6_5F00_thumb_5F00_3E088B6D.jpg" width="754" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;Message Flow:&lt;/font&gt; &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;DT.TransformReceivePipeline.WCF-NetTcp.RL&lt;/font&gt; WCF-NetTcp Request-Response Receive Location receives a &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document submitted running the &lt;font class="myBold"&gt;InvokeDynamicMap&lt;/font&gt; Unit Test within Visual Studio. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;TransformPipelineComponent &lt;/font&gt;(the following picture shows its configuration) promotes the &lt;font class="myBold"&gt;RouteDirectToTp &lt;/font&gt;property to true and transforms the inbound message using the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class and the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map. Then the Message Agent posts the transformed message to the MessageBox.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The transformed message is immediately returned to the Receive Location. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The response message is returned to the &lt;font class="myBold"&gt;InvokeDynamicMap&lt;/font&gt; Unit Test. &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p mce_keep="true"&gt;&amp;#160;&lt;font class="myBold"&gt;DT.TransformReceivePipeline.WCF-NetTcp.RL Configuration&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;The following picture shows the configuration of the &lt;font class="myBold"&gt;TransformReceivePipeline&lt;/font&gt; on the &lt;font class="myBold"&gt;DT.TransformReceivePipeline.WCF-NetTcp.RL&lt;/font&gt; Receive Location.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformReceivePipelineConfig_4.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformReceivePipelineConfig_4.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="TransformReceivePipelineConfig" border="0" alt="TransformReceivePipelineConfig" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformReceivePipelineConfig_thumb_1.jpg" width="648" height="430" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TransformReceivePipelineConfig_thumb_1.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;UnitAndLoadTests&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;Finally, I created a Test Project called &lt;font class="myBold"&gt;UnitAndLoadTests&lt;/font&gt; that contains a small set of unit and load tests described below: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font class="myBold"&gt;TestXslTransformHelper: &lt;/font&gt;this unit test can be used to measure the time spent to execute &lt;font class="myBold"&gt;loops &lt;/font&gt;transformations using the &lt;font class="myBold"&gt;XslTransformHelper&lt;/font&gt; class, where &lt;font class="myBold"&gt;loops &lt;/font&gt;is defined in the configuration file. The following picture reports the code of the &lt;font class="myBold"&gt;TestXslTransformHelper&lt;/font&gt; unit test. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TestXslTransformHelper method&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="csharpcode"&gt;[TestMethod]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestXslTransformHelper()
{
    Assert.AreNotEqual&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;, 
                               inputFile, 
                               &lt;span class="str"&gt;&amp;quot;The inpuFile key in the configuration file cannot be null.&amp;quot;&lt;/span&gt;);
    Assert.AreNotEqual&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(String.Empty, 
                               inputFile, 
                               &lt;span class="str"&gt;&amp;quot;The inpuFile key in the configuration file cannot be empty.&amp;quot;&lt;/span&gt;);
    Assert.AreEqual&amp;lt;&lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
                          File.Exists(inputFile), 
                          &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CultureInfo.CurrentCulture, &lt;span class="str"&gt;&amp;quot;The {0} file does not exist.&amp;quot;&lt;/span&gt;, inputFile));
    Assert.AreNotEqual&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;, 
                               mapFullyQualifiedName, 
                               &lt;span class="str"&gt;&amp;quot;The mapFullyQualifiedName key in the configuration file cannot be null.&amp;quot;&lt;/span&gt;);
    Assert.AreNotEqual&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(String.Empty, 
                               mapFullyQualifiedName, 
                               &lt;span class="str"&gt;&amp;quot;The mapFullyQualifiedName key in the configuration file cannot be empty.&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (traceResponses)
    {
        Assert.AreEqual&amp;lt;&lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
                              Directory.Exists(outputFolder), 
                              &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CultureInfo.CurrentCulture, &lt;span class="str"&gt;&amp;quot;The {0} folder does not exist.&amp;quot;&lt;/span&gt;, outputFolder));
    }
    Type type = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        type = Type.GetType(mapFullyQualifiedName);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        Assert.Fail(ex.Message);
    }
    MemoryStream stream = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; message;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (StreamReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)))
    {
        message = reader.ReadToEnd();
    }
    &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = Encoding.UTF8.GetBytes(message);
    Stopwatch stopwatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();
    Stream output = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    TestContext.BeginTimer(&lt;span class="str"&gt;&amp;quot;TestXslTransformHelper&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; loops; i++)
    {
        stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(buffer);
        stopwatch.Start();
        output = XslTransformHelper.Transform(stream, mapFullyQualifiedName);
        stopwatch.Stop();
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (output != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; traceResponses)
        {
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (StreamReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(output))
            {
                message = reader.ReadToEnd();
            }
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (StreamWriter writer = 
                    &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamWriter(File.OpenWrite(
                        Path.Combine(outputFolder, 
                                     &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(CultureInfo.CurrentCulture, &lt;span class="str"&gt;&amp;quot;{{{0}}}.xml&amp;quot;&lt;/span&gt;, Guid.NewGuid().ToString())))))
            {
                writer.Write(message);
                writer.Flush();
            }
        }
    }
    TestContext.EndTimer(&lt;span class="str"&gt;&amp;quot;TestXslTransformHelper&amp;quot;&lt;/span&gt;);
    Trace.WriteLine(String.Format(CultureInfo.CurrentCulture, 
                                  &lt;span class="str"&gt;&amp;quot;[TestXslTransformHelper] Loops: {0} Elapsed Time (milliseconds): {1}&amp;quot;&lt;/span&gt;, loops, stopwatch.ElapsedMilliseconds));
}&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font class="myBold"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt;: this unit test can be used to measure the time spent to execute &lt;font class="myBold"&gt;loops &lt;/font&gt;transformations using the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class, where &lt;font class="myBold"&gt;loops &lt;/font&gt;is defined in the configuration file. For the sake of brevity, I omitted to include the code of the &lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt; unit test as this latter is very similar to one of the previous unit test. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt;: this unit test can be used to send a single &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document to the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL&lt;/font&gt;&amp;#160; Receive Location used by the &lt;font class="myBold"&gt;TransformStaticallyDefined&lt;/font&gt; Test case. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;InvokeDynamicMap&lt;/font&gt;: this unit test can be used to send a single &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; xml document to the &lt;font class="myBold"&gt;DT.TransformReceivePipeline.WCF-NetTcp.RL&lt;/font&gt; Receive Location used by the &lt;font class="myBold"&gt;TransformReceivePipeline &lt;/font&gt;Test case. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;StaticMapLoadTest&lt;/font&gt;: this load test is based on the &lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt; unit test and can be used to generate traffic against the &lt;font class="myBold"&gt;TransformStaticallyDefined&lt;/font&gt; Use Case. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;DynamicMapLoadTest&lt;/font&gt;: this load test is based on the &lt;font class="myBold"&gt;InvokeDynamicMap &lt;/font&gt;unit test and can be used to generate traffic against the &lt;font class="myBold"&gt;TransformReceivePipeline &lt;/font&gt;Use Case. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these tests share the same configuration contained in the &lt;font class="myBold"&gt;App.config&lt;/font&gt; configuration file. In particular this latter contains the following information:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;The WCF Endpoint used to invoke the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL&lt;/font&gt; and &lt;font class="myBold"&gt;DT.TransformReceivePipeline.WCF-NetTcp.RL&lt;/font&gt; Receive Locations.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;The &lt;font class="myBold"&gt;appSettings&lt;/font&gt; section defines multiple keys that allows to control the runtime behavior of unit and load tests:&lt;/div&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;div align="justify"&gt;&lt;font class="myBold"&gt;mapFullyQualifiedName&lt;/font&gt;: contains the name of the map used by &lt;font class="myBold"&gt;TestXslTransformHelper&lt;/font&gt;&amp;#160; and &lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt; unit tests.&lt;/div&gt;
      &lt;/li&gt;

      &lt;li&gt;
        &lt;div align="justify"&gt;&lt;font class="myBold"&gt;inputFile&lt;/font&gt;: defines the path of the inbound document used by all unit tests (&lt;font class="myBold"&gt;TestXslTransformHelper&lt;/font&gt; , &lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt;, &lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt;, &lt;font class="myBold"&gt;InvokeDynamicMap&lt;/font&gt;).&lt;/div&gt;
      &lt;/li&gt;

      &lt;li&gt;
        &lt;div align="justify"&gt;&lt;font class="myBold"&gt;outputFolder&lt;/font&gt;: indicates the path where to save response messages.&lt;/div&gt;
      &lt;/li&gt;

      &lt;li&gt;
        &lt;div align="justify"&gt;&lt;font class="myBold"&gt;traceResponses&lt;/font&gt;: indicates whether to save response messages. &lt;/div&gt;
      &lt;/li&gt;

      &lt;li&gt;
        &lt;div align="justify"&gt;&lt;font class="myBold"&gt;loops&lt;/font&gt;: allows to control the number of loop iterations performed by the &lt;font class="myBold"&gt;TestXslTransformHelper&lt;/font&gt;&amp;#160; and &lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt; unit tests.&lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;For the sake of completeness, I include below the App.config I used for my tests.&lt;/p&gt;

&lt;p align="justify"&gt;&lt;strong&gt;App.config file&lt;/strong&gt;&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;font color="#000000" size="2" face="Consolas"&gt;&lt;/font&gt;

        &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;lt;!-- Bindings used by client endpoints --&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;netTcpBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;closeTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;01:10:00&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;openTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;01:10:00&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;receiveTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;01:10:00&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;sendTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;01:10:00&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;transactionFlow&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;transferMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Buffered&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;transactionProtocol&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OleTransactions&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;hostNameComparisonMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;StrongWildcard&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;listenBacklog&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;maxBufferPoolSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1048576&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;maxBufferSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10485760&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;maxConnections&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10485760&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;readerQuotas&lt;/span&gt; &lt;span class="attr"&gt;maxDepth&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;32&amp;quot;&lt;/span&gt;
                                  &lt;span class="attr"&gt;maxStringContentLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;8192&amp;quot;&lt;/span&gt;
                                  &lt;span class="attr"&gt;maxArrayLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt;
                                  &lt;span class="attr"&gt;maxBytesPerRead&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4096&amp;quot;&lt;/span&gt;
                                  &lt;span class="attr"&gt;maxNameTableCharCount&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;reliableSession&lt;/span&gt; &lt;span class="attr"&gt;ordered&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;
                                     &lt;span class="attr"&gt;inactivityTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;00:10:00&amp;quot;&lt;/span&gt;
                                     &lt;span class="attr"&gt;enabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt; &lt;span class="attr"&gt;mode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;None&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;transport&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Windows&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;protectionLevel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EncryptAndSign&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;message&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Windows&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;netTcpBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="rem"&gt;&amp;lt;!-- Client endpoints used by client excahnge messages with the WCF Receive Locations --&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;net.tcp://localhost:3816/dynamictransforms&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.ServiceModel.Channels.IRequestChannel&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;StaticMapEndpoint&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;net.tcp://localhost:3817/dynamictransforms&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.ServiceModel.Channels.IRequestChannel&amp;quot;&lt;/span&gt;
                      &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DynamicMapEndpoint&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mapFullyQualifiedName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Maps.CalculatorRequestToCalculatorResponse,&lt;br /&gt;              &lt;/span&gt;&lt;span class="kwrd"&gt;Microsoft.BizTalk.CAT.Samples.DynamicTransforms.Maps, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8c83cae5bc47edb0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;inputFile&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;C:\Projects\DynamicTransforms\Test\UnitTest.xml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;outputFolder&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;C:\Projects\DynamicTransforms\Test\Out&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;traceResponses&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;loops&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1000&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h1&gt;&amp;#160;&lt;/h1&gt;

&lt;h1&gt;&lt;font class="myBold"&gt;Results&lt;/font&gt;&lt;/h1&gt;

&lt;p&gt;Let’s start running some of the test cases and unit tests I created. Take into account that the unit tests and that you can find in the code attached to the article are parametric and they can be executed using any xml message and map. Therefore, I strongly encourage you to repeat my tests using your own messages and maps.&lt;/p&gt;

&lt;h4&gt;&lt;font class="myBold"&gt;TestXslTransformHelper vs&lt;/font&gt;&amp;#160;&lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;I configured both the unit tests to execute the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map against the the &lt;font class="myBold"&gt;UnitTest.xml&lt;/font&gt; file (80KB) 1000 times. Each test method uses an instance of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx"&gt;Stopwatch&lt;/a&gt; class to measure the time spent to executing all calls and finally traces a message containing the total elapsed time. The screens below were taken within Visual Studio at the end of the 2 tests.&lt;/p&gt;

&lt;p align="center"&gt;&lt;font class="myBold"&gt;TestXslTransformHelper &lt;/font&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslTransformHelper_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslTransformHelper_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TestXslTransformHelper" border="0" alt="TestXslTransformHelper" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslTransformHelper_thumb.jpg" width="560" height="233" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslTransformHelper_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="center"&gt;&lt;font class="myBold"&gt;TestXslCompiledTransformHelper&lt;/font&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslCompiledTransform_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslCompiledTransform_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TestXslCompiledTransform" border="0" alt="TestXslCompiledTransform" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslCompiledTransform_thumb.jpg" width="564" height="237" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/TestXslCompiledTransform_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The difference in terms of performance between the 2 unit tests is simply astonishing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font class="myBold"&gt;TestXslTransformHelper &lt;/font&gt;Unit Test: Total Elapsed Time = ~144 seconds, Average Elapsed Time/Transformation = ~144 milliseconds &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;TestXslCompiledTransformHelper &lt;/font&gt;Unit Test: Total Elapsed Time = ~3.5 seconds, Average Elapsed Time/Transformation = ~3.5 milliseconds &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously, I conducted several test runs and they all confirmed that the &lt;font class="myBold"&gt;XslCompiledTransformHelper &lt;/font&gt;is class incredibly faster than the &lt;font class="myBold"&gt;XslTransformHelper &lt;/font&gt;class and this clearly demonstrates that the &lt;font class="myBold"&gt;XslCompiledTransform&lt;/font&gt; class is absolutely much better than the &lt;font class="myBold"&gt;XslTransform&lt;/font&gt; class in a Load once, Cache and Transform many times” scenario. &lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;&lt;font class="myBold"&gt;DefaultStaticLoop Test Case vs DefaultDynamicLoop Test Case vs CustomDynamicLoop Test Case&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;

&lt;p align="justify"&gt;All the orchestrations used in the 3 test cases share the same structure and implement the same behavior using a different technique: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font class="myBold"&gt;DefaultStaticLoop&lt;/font&gt; orchestration: uses a &lt;font class="myBold"&gt;Transform&lt;/font&gt; shape to execute the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; against the inbound document. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;DefaultDynamicLoop&lt;/font&gt; orchestration: uses the &lt;a href="http://msdn.microsoft.com/en-us/library/aa950573(BTS.10).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa950573(BTS.10).aspx"&gt;transform&lt;/a&gt; method within a &lt;font class="myBold"&gt;Message Assignment&lt;/font&gt; Shape to accomplish the same task. &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;CustomDynamicLoop&lt;/font&gt; orchestration: uses the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt;.&lt;font class="myBold"&gt;Transform&lt;/font&gt; method to invoke the map against against the request message. &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Each orchestration contains a loop that executes the message transformation exactly 1000 times and finally reports the total elapsed time. For the test I created 3 separate xml files (they can be found in the Test folder), one for each orchestration. As I explained in the first part of the article, each orchestration receives the request message through a Direct Bound Port. In particular, the&amp;#160; following Filter Expression has been defined on the Activate Receive Shape of each orchestration:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;http://microsoft.biztalk.cat/10/dynamictransforms/propertyschema.Method == &amp;lt;OrchestrationName&amp;gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Therefore, the following files are identical:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;DefaultStaticLoop.xml&lt;/font&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;DefaultDynamicLoop.xml&lt;/font&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;CustomDynamicLoop.xml&lt;/font&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;with the exception of the &lt;font class="myBold"&gt;Method&lt;/font&gt; element that contains the name of the related orchestration. To execute each test case is sufficient to copy the corresponding file to the Test\IN folder: the &lt;font class="myBold"&gt;DT.FILE.RL&lt;/font&gt; FILE Receive Location will than receive the message and activate the intended test case. I used &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx" mce_href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx"&gt;DebugView&lt;/a&gt; to keep track of the elapsed time reported by each of the test cases:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DebugViewPerformanceResults_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DebugViewPerformanceResults_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DebugViewPerformanceResults" border="0" alt="DebugViewPerformanceResults" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DebugViewPerformanceResults_thumb.jpg" width="757" height="288" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DebugViewPerformanceResults_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Results are quite eloquent and don’t give room to doubts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font class="myBold"&gt;DefaultStaticLoop&lt;/font&gt; Test Case: Total Elapsed Time = ~57.3 seconds, Average Elapsed Time/Transformation = ~57 milliseconds &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;DefaultDynamicLoop &lt;/font&gt;Test Case: Total Elapsed Time = ~56.2 seconds, Average Elapsed Time/Transformation = ~56 milliseconds &lt;/li&gt;

  &lt;li&gt;&lt;font class="myBold"&gt;CustomDynamicLoop &lt;/font&gt;Test Case: Total Elapsed Time = ~3.6 seconds, Average Elapsed Time/Transformation = ~3.6 milliseconds &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once again, I conducted several test runs to confirm the results obtained and reported above. These latter clearly demonstrated that the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt; class is an order of magnitude faster than the default mechanisms provided by BizTalk for transforming messages.&lt;/p&gt;

&lt;h4&gt;TransformStaticallyDefined vs TransformReceivePipeline&lt;/h4&gt;

&lt;p&gt;The objective of this test is to compare the performance of the following test cases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;TransformStaticallyDefined&lt;/font&gt; Test Case: as explained in the first part of the article, the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message is transformed using the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt;&amp;#160; map declaratively configured on the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.RP &lt;/font&gt;Request Port. Once posted to the MessageBox, the &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; transformed message is immediately returned to the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL &lt;/font&gt;Receive Location (Loopback pattern).&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;TransformReceivePipeline&lt;/font&gt; Test Case: the inbound &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt; message is transformed by the &lt;font class="myBold"&gt;TransformReceivePipeline&lt;/font&gt;&amp;#160; hosted by the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL &lt;/font&gt;Receive Location. In particular, the &lt;font class="myBold"&gt;TransformPipelineComponent &lt;/font&gt;invokes the &lt;font class="myBold"&gt;XslCompiledTransformHelper.Transform&lt;/font&gt; static method to apply the &lt;font class="myBold"&gt;CalculatorRequestTo&lt;/font&gt;&lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; map to the inbound xml document. The FQDN of the map is declaratively specified in the pipeline configuration. Once posted to the MessageBox, the &lt;font class="myBold"&gt;CalculatorResponse&lt;/font&gt; transformed message is immediately returned to the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL &lt;/font&gt;Receive Location (Loopback pattern).&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;To generate traffic against the 2 test cases and measure performance I used the following Load Tests defined in the &lt;font class="myBold"&gt;UnitAndLoadTests&lt;/font&gt; Test Project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;StaticMapLoadTest&lt;/font&gt;: this load test is based on the &lt;font class="myBold"&gt;InvokeStaticMap&lt;/font&gt; unit test and can be used to generate traffic against the &lt;font class="myBold"&gt;TransformStaticallyDefined&lt;/font&gt; Use Case. The test is configured to send 1000 &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt;&amp;#160; messages to the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL&lt;/font&gt;&amp;#160; Receive Location using 25 different worker threads.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;font class="myBold"&gt;DynamicMapLoadTest&lt;/font&gt;: this load test is based on the &lt;font class="myBold"&gt;InvokeDynamicMap &lt;/font&gt;unit test and can be used to generate traffic against the &lt;font class="myBold"&gt;TransformReceivePipeline &lt;/font&gt;Use Case. The test is configured to send 1000 &lt;font class="myBold"&gt;CalculatorRequest&lt;/font&gt;&amp;#160; messages to the &lt;font class="myBold"&gt;DT.TransformStaticallyDefined.WCF-NetTcp.RL &lt;/font&gt;Receive Location using 25 different worker threads.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;In particular, as shown in the picture below, I created a custom Counter Set called BizTalk composed of the following performance counters:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx"&gt;Inbound Latency (sec)&lt;/a&gt;: measures the average latency in milliseconds from when the Messaging Engine receives a document from the adapter until the time it is published to Message Box.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx"&gt;Request-Response Latency (sec)&lt;/a&gt;: measures the average latency in milliseconds from when the Messaging Engine receives a request document from the adapter until the time a response document is given back to the adapter.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicLoadTestConfig_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicLoadTestConfig_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DynamicLoadTestConfig" border="0" alt="DynamicLoadTestConfig" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicLoadTestConfig_thumb.jpg" width="399" height="603" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicLoadTestConfig_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Specifically, the average latency measured by the &lt;a href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa558731(BTS.20).aspx"&gt;Inbound Latency (sec)&lt;/a&gt; counter includes the time spent for transforming the message in both use cases. Obviously it counts also the time spent running other activities like posting the message to the MessageBox, but still it represents a good mechanism to measure to compare the time spent by the 2 test cases for transforming the inbound message.&lt;/p&gt;

&lt;p align="justify"&gt;I conducted several test runs to confirm results obtained. The screens below were taken, respectively, at the end of &lt;font class="myBold"&gt;StaticMapLoadTest&lt;/font&gt; and &lt;font class="myBold"&gt;DynamicMapLoadTest&lt;/font&gt;:&lt;/p&gt;

&lt;h4&gt;StaticMapLoadTest Graphs &amp;amp; Summary&lt;/h4&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults01_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults01_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="StaticMapLoadTestResults01" border="0" alt="StaticMapLoadTestResults01" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults01_thumb.jpg" width="920" height="544" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults01_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults02_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults02_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="StaticMapLoadTestResults02" border="0" alt="StaticMapLoadTestResults02" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults02_thumb.jpg" width="920" height="544" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/StaticMapLoadTestResults02_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;DynamicMapLoadTest Graphs &amp;amp; Summary&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults01_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults01_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DynamicMapLoadTestResults01" border="0" alt="DynamicMapLoadTestResults01" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults01_thumb.jpg" width="920" height="544" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults01_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults02_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults02_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DynamicMapLoadTestResults02" border="0" alt="DynamicMapLoadTestResults02" src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults02_thumb.jpg" width="920" height="544" mce_src="http://blogs.msdn.com/blogfiles/paolos/WindowsLiveWriter/BoostMessageTransformationswiththeXslCom_AED0/DynamicMapLoadTestResults02_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following table reports for convenience the results highlighted in the screens above:&lt;/p&gt;

&lt;table border="1" cellspacing="0" bordercolor="#f4f4f4" cellpadding="5" width="910" bgcolor="#f4f4f4"&gt;&lt;tbody&gt;
    &lt;tr bgcolor="#333333"&gt;
      &lt;td valign="top" width="123"&gt;&lt;font color="#ffffff"&gt;Test Case&lt;/font&gt; &lt;/td&gt;

      &lt;td valign="top" width="141"&gt;&lt;font color="#ffffff"&gt;Inbound Latency (sec)&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="189"&gt;&lt;font color="#ffffff"&gt;Request Response Latency (sec)&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="127"&gt;&lt;font color="#ffffff"&gt;Avg Test Time (sec)&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="145"&gt;&lt;font color="#ffffff"&gt;Tests/sec (Throughput)&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="89"&gt;&lt;font color="#ffffff"&gt;Duration (sec)&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="94"&gt;&lt;font color="#ffffff"&gt;% CPU Time&lt;/font&gt;&lt;/td&gt;
&lt;/td&gt;&lt;/tr&gt;

    &lt;tr bgcolor="#ffffff"&gt;
      &lt;td valign="top" width="123"&gt;&lt;font color="#000000"&gt;StaticMapLoadTest &lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="141"&gt;&lt;font color="#000000"&gt;0.41&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="189"&gt;&lt;font color="#000000"&gt;0.90&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="127"&gt;&lt;font color="#000000"&gt;2.55&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="145"&gt;&lt;font color="#000000"&gt;8.77&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="89"&gt;&lt;font color="#000000"&gt;114&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="94"&gt;&lt;font color="#000000"&gt;65.2&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr bgcolor="#f4f4f4"&gt;
      &lt;td valign="top" width="123"&gt;&lt;font color="#000000"&gt;DynamicMapLoadTest&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="141"&gt;&lt;font color="#000000"&gt;0.11&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="189"&gt;&lt;font color="#000000"&gt;0.49&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="127"&gt;&lt;font color="#000000"&gt;1.29&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="145"&gt;&lt;font color="#000000"&gt;17.6&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="89"&gt;&lt;font color="#000000"&gt;56&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="94"&gt;&lt;font color="#000000"&gt;43&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;

&lt;p align="justify"&gt;The difference in terms of latency and throughput between the 2 test cases is quite dramatic and this clearly confirms once again that the &lt;font class="myBold"&gt;XslCompiledTransform&lt;/font&gt;&amp;#160; class is much faster than the &lt;font class="myBold"&gt;XslTransform&lt;/font&gt;&amp;#160; class natively used by BizTalk. In our case, the adoption of the custom &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt;&amp;#160; class&amp;#160; allowed to double the throughput and halve the latency. Obviously, the performance gain can vary from case to case as it depends on many factors (inbound message size, map complexity, etc.), but it’s quite evident that the overall performance of a BizTalk application that makes an extensive use of message transformations can greatly be improved using a helper component like the &lt;font class="myBold"&gt;XslCompiledTransformHelper&lt;/font&gt;&amp;#160; class&amp;#160; that exploits the &lt;font class="myBold"&gt;XslCompiledTransform&lt;/font&gt;&amp;#160; class to compile, invoke and cache maps for later calls.&lt;/p&gt;

&lt;h1&gt;&lt;font class="myBold"&gt;Conclusions&lt;/font&gt;&lt;/h1&gt;

&lt;p align="justify"&gt;As I said in the first part of the article, I started to work with the product group to see how best to take advantage of the &lt;font class="myBold"&gt;XslCompiledTransform&lt;/font&gt;&amp;#160; class in the next version of BizTalk. Nevertheless, you can immediately exploits this class in your custom components to boost the execution of you message transformations. Therefore, I encourage you to download my &lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip" mce_href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip"&gt;code&lt;/a&gt; here and repeat the tests described in this article using your own messages and maps. &lt;/p&gt;

&lt;h1&gt;Follow-Up&lt;/h1&gt;

&lt;p align="justify"&gt;I wrote another article on this subject and extended my code to support multi-source-document-maps. You can find my post &lt;a href="http://blogs.msdn.com/b/paolos/archive/2010/04/08/how-to-boost-message-transformations-using-the-xslcompiledtransform-class-extended.aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h1&gt;&lt;font class="myBold"&gt;Code&lt;/font&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip" mce_href="http://cid-09dba4a06b360a65.skydrive.live.com/self.aspx/Pubblica/DynamicTransforms.zip"&gt;Here&lt;/a&gt; you can download the code. Any feedback is highly appreciated. ;-)&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9955273" width="1" height="1"&gt;</description></item></channel></rss>
