<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-35125468</id><updated>2011-11-02T09:20:45.505-05:00</updated><category term='web reference'/><category term='bottleneck'/><category term='Mapping'/><category term='Team Foundation Server'/><category term='DB2 Adapater'/><category term='news'/><category term='Dublin'/><category term='sql agent'/><category term='Iteration Functoid'/><category term='BizTalk'/><category term='Ports'/><category term='IPropertyAnnotation'/><category term='Schema'/><category term='Evan Aussenberg'/><category term='X12'/><category term='BizTalk Server 2006 R3'/><category term='External Assembly'/><category term='BRE'/><category term='Configuration'/><category term='sql server 2008'/><category term='Xml'/><category term='Business Rules Engine'/><category term='Esso'/><category term='xpath'/><category term='performance'/><category term='Documentation'/><category term='Routing'/><category term='Custom Extension Xml'/><category term='Pipeline component'/><category term='training'/><category term='BizTalk 2009'/><category term='Covast'/><category term='whitepapers'/><category term='Virtual Machine'/><category term='Property promotion'/><category term='GetPropertyAnnotationEnumerator'/><category term='Naming conventions'/><category term='TFS'/><category term='XsdDistinguishedFieldDefinition'/><category term='BAM'/><category term='MSBuild'/><category term='Complex Type'/><category term='Tracking'/><category term='BizTalk Server 2006 R2'/><category term='Web Service'/><category term='EDI'/><category term='Oslo'/><category term='GetDistinguishedPropertyAnnotationEnumerator'/><category term='RFID'/><category term='IDocumentSpec'/><category term='Installation'/><title type='text'>RDA Corporation EAI Blog</title><subtitle type='html'>Discussing BizTalk Server, Enterprise Application Integration and SOA</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35125468.post-5689889884161224945</id><published>2010-05-25T08:33:00.001-05:00</published><updated>2010-05-25T08:33:31.528-05:00</updated><title type='text'>Carolina Code Camp</title><content type='html'>&lt;p&gt;Recently I gave a presentation on BizTalk Server 2009 at the Carolina Code Camp. The presentation covered the basics of BizTalk as well as the new features of BizTalk Server 2009.&lt;/p&gt;  &lt;p&gt;I showed a short demonstration of a sample Purchase Order process. The components used were the Schema Designer, the Mapper, the Orchestration Designer, and the Consume WCF Service Wizard. &lt;/p&gt;  &lt;p&gt;PowerPoint slides and demo code are available upon request.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5689889884161224945?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5689889884161224945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5689889884161224945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5689889884161224945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5689889884161224945'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2010/05/carolina-code-camp.html' title='Carolina Code Camp'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6490824859806269779</id><published>2010-05-12T13:46:00.001-05:00</published><updated>2010-05-12T13:46:15.486-05:00</updated><title type='text'>REST Services in BizTalk</title><content type='html'>&lt;p&gt;After many hours of research and blog reading, I came to the conclusion that there is no out-of-the-box or additional download (from an Adapter Pack or similar) support for REST services in BizTalk 2009. My recommendation is to have a C# helper class make the call for you. This is not what I was hoping to discover, although it does make sense. &lt;/p&gt;  &lt;p&gt;REST services do not employ formal contracts, while BizTalk relies heavily on strong-typing of messages, these two philosophies contradict. &lt;/p&gt;  &lt;p&gt;The other issue is that BizTalk needs two pieces of data for message delivery, destination URI and the Message. REST embeds the message as part of the URI. Again, this is a contradiction in philosophies. &lt;/p&gt;  &lt;p&gt;We can create a Dynamic Send port with the correct URI (message embedding included), however BizTalk must send a message along with the URI and REST services reject this additional payload. Also, Dynamic Send ports do not support two-way communication so there is no way to correlate the response message, even if we were to actually be able to get one from the REST Service. &lt;/p&gt;  &lt;p&gt;Until Microsoft adds support for REST in BizTalk, the workaround is to use a .NET Helper Method to make the REST call for us.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6490824859806269779?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6490824859806269779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6490824859806269779' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6490824859806269779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6490824859806269779'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2010/05/rest-services-in-biztalk.html' title='REST Services in BizTalk'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-5524915995423867241</id><published>2010-02-22T07:30:00.004-05:00</published><updated>2010-02-22T07:38:29.663-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>BizTalk Benchmark Wizard Released</title><content type='html'>One of the most common questions I get asked when looking at a BizTalk server project is what type of hardware is required and how many servers are needed.&lt;br /&gt;&lt;br /&gt;This is often a black art.&lt;br /&gt;&lt;br /&gt;Microsoft has stepped in to help with the release of a BizTalk Benchmark Wizard:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/biztalk/ee946766.aspx"&gt;http://msdn.microsoft.com/en-us/biztalk/ee946766.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically this tool is intended to work along side the BizTalk Server 2009 Scale-Out Testing Study:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee377068(BTS.10).aspx"&gt;http://msdn.microsoft.com/en-us/library/ee377068(BTS.10).aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Comparing the results of the study to your own running production environment can provide valuable insight into the performance of a BizTalk server farm and point to places where optimization is needed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5524915995423867241?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5524915995423867241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5524915995423867241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5524915995423867241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5524915995423867241'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2010/02/biztalk-benchmark-wizard-released.html' title='BizTalk Benchmark Wizard Released'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-645397905601397075</id><published>2010-01-28T11:31:00.002-05:00</published><updated>2010-01-28T11:34:48.073-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='sql agent'/><title type='text'>BizTalk 2009 and SQL 2008 - Simple recovery mode breaks agent</title><content type='html'>I learned something today about SQL 2008 and BizTalk's SQL agent jobs.  You must leave all BizTalk databases recovery model to "Full".  I encounted a database set with the recovery model that was changed to "Simple" and it caused the agent's jobs to fail.&lt;br /&gt;&lt;br /&gt;The reason for this is that "TRUNCATE_ONLY" has been deprecated for SQL Server 2008.  This flag forces you to keep the recovery model as full.  When I changed it back everything began funtioning normally again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-645397905601397075?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/645397905601397075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=645397905601397075' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/645397905601397075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/645397905601397075'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2010/01/biztalk-2009-and-sql-2008-simple.html' title='BizTalk 2009 and SQL 2008 - Simple recovery mode breaks agent'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-3839302547746827608</id><published>2010-01-26T18:46:00.001-05:00</published><updated>2010-01-26T18:49:58.364-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='sql agent'/><title type='text'>How to solve "Unable to determine if the owner has server access" error</title><content type='html'>This error message popped up all of a sudden during a load test with heavy volume.&lt;br /&gt;&lt;br /&gt;Turns out to be a well known culprit to lots of BizTalk errors: the SQL Agent jobs were not running.  Since we had just deployed to a test environment, and it was a new server, I didn't check to the Agent to see if it was running.&lt;br /&gt;&lt;br /&gt;When I teach the class, I always mention this check, so I didn't follow my own advice.  Anyway, the database server logs grew wildly and caused a shutdown.&lt;br /&gt;&lt;br /&gt;When I configured and ran the jobs everything was fine, but it took a while for everything to complete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-3839302547746827608?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/3839302547746827608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=3839302547746827608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3839302547746827608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3839302547746827608'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2010/01/how-to-solve-unable-to-determine-if.html' title='How to solve &quot;Unable to determine if the owner has server access&quot; error'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2668085459461577510</id><published>2009-11-16T08:54:00.001-05:00</published><updated>2009-11-16T08:54:10.362-05:00</updated><title type='text'>Using a Flat File Schema to Consume Non-Xml Messages With No Type</title><content type='html'>&lt;p&gt;Recently, a client was updating their message processing system from a collection of old VB6 applications to a BizTalk Server 2009 solution. One of the processes that they struggled with was updating their “special case” partners. I call these partners “special case” because they could not or would not adhere to the standardized schema for acknowledgment messages that was provided.&lt;/p&gt;  &lt;p&gt;Each “special case” partner had their own message type, which changed without notice. The only thing that each had in common was that they agreed to put an acknowledgment bit somewhere within their return message. The placement of this acknowledgment bit was establish many years ago when the VB6 applications where written. The problem of extracting the bit was solved within the VB6 applications and the code was simply updated to C# to leverage the existing solution. &lt;/p&gt;  &lt;p&gt;The other issue that was occurring is that each acknowledgment message had a different format, and non of them were valid XML. Most of the acknowledgments were actually screen scrapes from HTML pages with multiple root nodes and the message stuffed in at various places. BizTalk does not like to consume messages that have no schema/message type. To solve this issue, I had the client run the Flat File Schema Wizard to generate a Flat File Message with a single node and the entire contents of the message as its value (contained within CDATA markup to prevent corruption). The trick with this approach is the delimiter used to define the records. Since we only ever want one record, we need to choose a delimiter that has a very, very low probability of showing up in the incoming message. The delimiter I chose to use was “|abcdefghijklmnopqrstuvwxyz|”. &lt;/p&gt;  &lt;p&gt;Now that the message was being consumed, it was a simple matter to use xpath to extract the string payload of the message and send it over to the existing C# helpers that know how to process it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2668085459461577510?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2668085459461577510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2668085459461577510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2668085459461577510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2668085459461577510'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/11/using-flat-file-schema-to-consume-non.html' title='Using a Flat File Schema to Consume Non-Xml Messages With No Type'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6214309873387305803</id><published>2009-10-20T14:58:00.003-05:00</published><updated>2009-10-20T15:09:19.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web reference'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>Where Do I Create a Web Reference in BizTalk 2009?</title><content type='html'>If you are reading this, most likely you were just as stumped as I was when I tried to create my first web reference in BizTalk 2009. &lt;br /&gt;&lt;br /&gt;I assumed "Web Reference" was renamed to "Service Reference" but I quickly realized that something was wrong when I tried to create a message within an orchestration and had nothing listed within the "Web Message Types" section.&lt;br /&gt;&lt;br /&gt;Well, to create a traditional Web Reference in BizTalk 2009 you have to take an extra step:&lt;br /&gt;&lt;br /&gt;Right click on the project, and select "Add Service Reference" just as you did before, but this time, at the bottom click "Advanced".  At the bottom of that screen click "Add Web Reference" which will take you to the web reference screen we recognize from previous BizTalk versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6214309873387305803?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6214309873387305803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6214309873387305803' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6214309873387305803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6214309873387305803'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/10/where-do-i-create-web-reference-in.html' title='Where Do I Create a Web Reference in BizTalk 2009?'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8982080264118329080</id><published>2009-09-28T09:42:00.003-05:00</published><updated>2009-09-28T09:49:25.312-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='X12'/><category scheme='http://www.blogger.com/atom/ns#' term='EDI'/><title type='text'>How to get to the packaged EDI schemas</title><content type='html'>I needed to validate a clients test message against the standard EDI schema for an X12 810 message but did an extensive search and was not able to find the schema for the message.&lt;br /&gt;&lt;br /&gt;I found the EDI base DLL that contains the schemas (Microsft.BizTalk.EDI.BaseArtifacts.dll) but this didn't give me the ability to validate against the schema.&lt;br /&gt;&lt;br /&gt;Turns out that all of the EDI XSD schemas are packaged in an exe located in: \Program Files\Microsoft BizTalk Server 2006\XSD_Schema\EDI.  Just unpack the file named MicrosoftEdiXSDTemplates.exe and you will have extractions for all of the EDI schemas for EANCOM, EDIFACT, HIPPA and X12.&lt;br /&gt;&lt;br /&gt;Be careful because this is a huge number of files.  I opened the exe in win rar and just extracted the X12 files.&lt;br /&gt;&lt;br /&gt;From there you can just add the schema to your project and validate your message&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8982080264118329080?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8982080264118329080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8982080264118329080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8982080264118329080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8982080264118329080'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/09/how-to-get-to-packaged-edi-schemas.html' title='How to get to the packaged EDI schemas'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7306437101208162273</id><published>2009-07-23T02:50:00.001-05:00</published><updated>2009-07-23T02:50:46.535-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Iteration Functoid'/><category scheme='http://www.blogger.com/atom/ns#' term='Mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='Evan Aussenberg'/><title type='text'>Mapping Unrelated Records</title><content type='html'>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I was recently asked to create a map to combine parent records with children records. The challenge was that the children records in the source document where not grouped with their parent record.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mapping Unrelated Records&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The message was similar to the following Xml where StatusItem is related by its ordinal position to DetailStatus/DetailItem. Look carefully at the message; the StatusItem parent node is SummaryStatus, which is at the same level in the Xml as DetailStatus. There is only one SummaryStatus node, and there are multiple DetailStatus nodes – all at the same level in the Xml.&lt;/p&gt;  &lt;blockquote&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;root&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #a31515; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;SummaryStatus&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;SummaryCode&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;102&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SummaryCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow; mso-highlight: yellow"&gt;item_0&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: lime; mso-highlight: lime"&gt;item_1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #c6d9f1"&gt;item_2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SummaryStatus&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #a31515; font-family: &amp;quot;Lucida Console&amp;quot;"&gt;DetailStatus&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow; mso-highlight: yellow"&gt;detail_0&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailStatus&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #a31515; font-family: &amp;quot;Lucida Console&amp;quot;"&gt;DetailStatus&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;/&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: lime; mso-highlight: lime"&gt;detail_1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;statusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailStatus&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;        &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #a31515; font-family: &amp;quot;Lucida Console&amp;quot;"&gt;DetailStatus&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;/&amp;gt;        &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/blockquote&gt;  &lt;p&gt;In reality a message similar to the above is being provided by an outside source and we cannot modify it. By convention we are given the assumption that there is a DetailStatus record for each StatusItem, however there is not always a DetailItem. Our job is to map the output and combine the StatusItem code with its each DetailItem code.&lt;/p&gt;  &lt;p&gt;The output goal is similar to the following Xml:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style="font-size: 9pt; color: blue; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;root&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;SummaryCode&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: &amp;quot;Lucida Console&amp;quot;; mso-fareast-font-family: &amp;#39;Trebuchet MS&amp;#39;; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;102&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SummaryCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;          &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow; mso-highlight: yellow"&gt;item_0&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow; mso-highlight: yellow"&gt;detail_0&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;          &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: lime; mso-highlight: lime"&gt;item_1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: lime; mso-highlight: lime"&gt;detail_1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DetailItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;          &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: #c6d9f1"&gt;item_2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusCode&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StatusItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The BizTalk map below works by using the &lt;a href="http://msdn.microsoft.com/en-us/library/aa559232%28BTS.10%29.aspx" target="_blank"&gt;Iteration Functoid&lt;/a&gt; comparing the position of the current SummaryStatus parent record to the position of the DetailStatus record. Additionally the &lt;a href="http://msdn.microsoft.com/en-us/library/aa559386%28BTS.10%29.aspx" target="_blank"&gt;Logical Existence Functoid&lt;/a&gt; is used so that if a DetailItem does not appear in the source message, then it won’t appear in the Target message.&lt;/p&gt;  &lt;p&gt;&lt;img title="MapParentToChild" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin: 0px auto; border-right-width: 0px" height="306" alt="MapParentToChild" src="http://lh3.ggpht.com/_-MTm07-azhE/SmgWVSjRkfI/AAAAAAAAAN4/xbQeMnXeueM/MapParentToChild%5B3%5D.png?imgmax=800" width="639" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa546768%28BTS.10%29.aspx" target="_blank"&gt;BizTalk Functoid Categories&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa559232%28BTS.10%29.aspx" target="_blank"&gt;Iteration Functoid&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa559386%28BTS.10%29.aspx" target="_blank"&gt;Logical Existence Functoid&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Previous Articles&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-1.html"&gt;Mapping With External Assemblies Part 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-2.html"&gt;Mapping With External Assemblies Part 2&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://eaiteamblog.blogspot.com/2008/11/bts-mapping-with-external-assemblies.html"&gt;Mapping With External Assemblies Part 3&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7306437101208162273?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7306437101208162273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7306437101208162273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7306437101208162273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7306437101208162273'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/07/mapping-unrelated-records.html' title='Mapping Unrelated Records'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_-MTm07-azhE/SmgWVSjRkfI/AAAAAAAAAN4/xbQeMnXeueM/s72-c/MapParentToChild%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7638692922263720139</id><published>2009-04-22T07:35:00.000-05:00</published><updated>2009-04-22T07:56:52.691-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BAM'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><title type='text'>Fix for BAM error "Views or Activites may be missing because one or more database(s) could not be contacted"</title><content type='html'>I had to migrate a BAM implementation into production from a development environment where everything in localized to a clustered database back end.&lt;br /&gt;&lt;br /&gt;The deployment went fine, including the BAM part, but I couldn't access the views in the BAM portal.  I verified that data was being written into the BAM database, but when I went to the portal to view the data I saw the following message:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;em&gt;Views or Activites may be missing because one or more database(s) could not be contacted. No view to display&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;There was also an error in the event log which read:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;Referenced database 'BAMPrimaryImport' on server &lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;'xxxx' &lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;is not accessible. The error is:&lt;br /&gt;System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values.&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;After some investigation I learned that the owner of the BAMPrimaryImport database needed to be a domain account.  I tried to change the account role:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;strong&gt;sp_addrolemember 'dbowner' 'domain\user'&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This failed with an error.&lt;br /&gt;&lt;br /&gt;So I ran instead (which does not remove the user, just ‘resets’ the users access rights):&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;strong&gt;sp_revokedbaccess 'domain\user'&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Which threw an error, but the account was holding the db owner schema, so I changed that to dbo and it worked.&lt;br /&gt;&lt;br /&gt;Then, I could run the original call (which now worked):&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#3333ff;"&gt;sp_changedbowner 'domain\user'&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The views are now visible in the portal, so if you see this error above, this may be the cause.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7638692922263720139?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7638692922263720139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7638692922263720139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7638692922263720139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7638692922263720139'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/04/fix-for-bam-error-views-or-activites.html' title='Fix for BAM error &quot;Views or Activites may be missing because one or more database(s) could not be contacted&quot;'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-3296398734604190038</id><published>2009-03-26T10:52:00.001-05:00</published><updated>2009-03-26T10:52:43.383-05:00</updated><title type='text'>ESB 2.0 Custom Resolver: Part 2</title><content type='html'>&lt;p&gt;In part one, we discussed what code was required for a custom resolver. In part two, we will be talking about what steps need to be undertaken in order to have the ESB recognize the new resolver as well as the topic of caching and making the resolver configurable.&lt;/p&gt;  &lt;h5&gt;Caching&lt;/h5&gt;  &lt;p&gt; Resolution caching is accomplished using the Microsoft.Practices.ESB.Cache.Cache&amp;lt;T&amp;gt; object. Each resolver maintains its own unique cache. Some resolvers, such as BRE, do not maintain a cache at all, as they are expected to update in real-time when the repository changes. &lt;/p&gt;  &lt;p&gt;Adding a resolution to the cache is as simple as calling the Add method of the Cache&amp;lt;T&amp;gt; object with a key and the resolution. A resolution should be unique to its configuration, with that assumption in mind the standard key for a resolution in the cache is its config string. Resolutions are defined as type Dictionary&amp;lt;string, string&amp;gt; the resolution Dictionary should be the second argument in the call to the Add method. Note, that some verification should be done to ensure that the resolution is not empty/corrupted, as it will come back each time the provided config is resolved until the cache expires. The last argument for the Add method is the optional expiration interval. In this implementation a configurable value cacheTimeoutValue was crated that is used to define how long a cache value should persist. A value of 0 denotes that the cache has been disabled.&lt;/p&gt;  &lt;p&gt;Retrieving a resolution from the cache requires a call to the Get method of the Cache&amp;lt;T&amp;gt; object. The Get method requires the key (the config string) in order to retrieve the resolution from the cache. The benefit of caching is that it enhances performance when under higher volumes. The database is only queried once per cache expiration interval for a unique configuration. The drawback is that the repository could take one entire expiration interval to update when it is changed. With this balancing act in mind, the expiration interval was made configurable.&lt;/p&gt;  &lt;h5&gt;Configuration&lt;/h5&gt;  &lt;p&gt;Configuration includes wiring up the resolver to the ESB and configurable resolution values. The wire-up portion is required for all implementations, so we will start the discussion with that.&lt;/p&gt;  &lt;p&gt;Contained in the ESB install is a configuration file called esb.config. This configuration is referenced from both the machine.config and the btsntsvc.exe.config files. The resolution configuration settings are contained in the esb.config file. To wire-up the custom adapter following node needs to be added to the configuration/esb/resolvers node: &lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;lt;resolver name=&amp;quot;SQL&amp;quot; type=&amp;quot;ESB.Resolver.SQL.ResolveProvider, ESB.Resolver.SQL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=42bcd53db1111111&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The name attribute denotes the Moniker name (see part one for a discussion of Monikers). The type attribute is the fully qualified assembly name for the custom resolver that was created in part one.&lt;/p&gt;  &lt;p&gt;To add configurable values for a resolver a resolverConfig node can be added to the aforementioned resolver node:&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;lt;resolver name=&amp;quot;SQL&amp;quot; type=&amp;quot;ESB.Resolver.SQL.ResolveProvider, ESB.Resolver.SQL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=42bcd53db1111111&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;resolverConfig&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;cacheTimeoutValue&amp;quot; value=&amp;quot;120&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;cacheName&amp;quot; value=&amp;quot;SQL Cache Manager&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/resolverConfig&amp;gt;      &lt;br /&gt;&amp;lt;/resolver&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The configuration can be parsed in the custom resolver class with the following code:&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;string cacheName = ResolverConfigHelper.ReadResolverConfigByKey(resolverConfig, &amp;quot;cacheName&amp;quot;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To make use of the SQL Cache Manager, it must be configured in the esb.config. Add the following node to the configuration/cachingConfiguration/cacheManagers node:&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;lt;add name=&amp;quot;SQL Cache Manager&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; expirationPollFrequencyInSeconds=&amp;quot;2&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; maximumElementsInCacheBeforeScavenging=&amp;quot;1000&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; numberToRemoveWhenScavenging=&amp;quot;10&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; backingStoreName=&amp;quot;inMemory&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;Future Plans&lt;/h5&gt;  &lt;p&gt;Future plans for the SQL resolver is to make it more configurable. There are plans to be able to query services by other fields such as Author, Version, etc.&lt;/p&gt;  &lt;p&gt;This concludes my two part discussion of custom resolvers in ESB 2.0. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-3296398734604190038?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/3296398734604190038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=3296398734604190038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3296398734604190038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3296398734604190038'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/esb-20-custom-resolver-part-2.html' title='ESB 2.0 Custom Resolver: Part 2'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2031940472683588162</id><published>2009-03-26T09:36:00.001-05:00</published><updated>2009-03-26T09:36:11.879-05:00</updated><title type='text'>ESB 2.0 Custom Resolver: Part 1</title><content type='html'>&lt;p&gt;Recently I encountered a situation where we wanted to leverage SQL server as and repository for endpoints. The resolver consists of two parts: the repository (SQL Table in this example) and the custom resolver assembly. I will be focused on the custom resolver for this&amp;#160; discussion. &lt;/p&gt;  &lt;p&gt;The custom resolver consists of an assembly and configuration entries. In part one we will discuss the code that goes into the assembly. In part two we will talk about wiring up the assembly so that the ESB will use the new assembly, as well as how to make the resolver configurable.&lt;/p&gt;  &lt;p&gt;Per the pattern set up by the ESB Guidance team, each resolver should be in its own assembly. This assembly will need to include references to the following assemblies:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft.Practices.ESB.Cache &lt;/li&gt;    &lt;li&gt;Microsoft.Practices.ESB.Common &lt;/li&gt;    &lt;li&gt;Microsoft.Practices.ESB.Configuration &lt;/li&gt;    &lt;li&gt;Microsoft.Practices.ESB.Exception.Management &lt;/li&gt;    &lt;li&gt;Microsoft.Practices.ESB.Resolver &lt;/li&gt;    &lt;li&gt;Microsoft.XLANGs.BaseTypes &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The naming convention for the assembly is ESB.Resolver.&lt;em&gt;MyResolver&lt;/em&gt;. In our example the assembly is ESB.Resolver.SQL. A class that implements IResolverProvider is required for the custom resolver. The naming convention for this class is ResolveProvider. &lt;/p&gt;  &lt;p&gt;The IResolverProvider interface implements three overloaded variations of the Resolve method. Each of these need to be implemented to ensure that the resolver works in all traditional contexts. All three methods should be executing the same logic. With that in mind, the ESB Guidance team created a Resolve&lt;em&gt;MyResolver&lt;/em&gt;(string config, string resolver, Dictionary&amp;lt;string, string&amp;gt; resolutionOrig) method that each Resolve method calls. I have included my sample below.&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;private Dictionary&amp;lt;string, string&amp;gt; ResolveSql(string config, string resolver, Dictionary&amp;lt;string, string&amp;gt; resolutionOrig)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // fix the resolver if it needs it       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!resolver.Contains(ResolutionHelper.MonikerSeparator))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolver = resolver + ResolutionHelper.MonikerSeparator; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // check for cache...return data structure       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;string, string&amp;gt; sqlValues = RetrieveFromCache(config); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //No Resolution cached      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (sqlValues == null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sqlValues = new Dictionary&amp;lt;string, string&amp;gt;(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Extract Parameters      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dictionary&amp;lt;string, string&amp;gt; queryParams = ResolutionHelper.GetFacts(config, resolver);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string serverName = &lt;/font&gt;&lt;font face="System" size="1"&gt;ResolutionHelper.GetConfigValue(queryParams, false, &amp;quot;serverName&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string dbName = ResolutionHelper.GetConfigValue(queryParams, false, &amp;quot;dbName&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string serviceName = ResolutionHelper.GetConfigValue(queryParams, false, &amp;quot;serviceName&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Build connection String       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string connectionString = String.Format(&amp;quot;Data Source={0}; Initial Catalog={1}; Integrated Security=SSPI;&amp;quot;, serverName, dbName);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Execute SQL query to retrieve EndPoint       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SqlDataReader sqlReader = null; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sqlReader = ResolveSqlEndpoint(serviceName, connectionString, sqlReader);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (sqlReader.HasRows)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sqlReader.Read(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Transfer result to Resolution      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Resolution resolution = new Resolution();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.EndpointConfig = sqlReader[&amp;quot;EndPointConfig&amp;quot;].ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.TransportLocation = sqlReader[&amp;quot;TransportLocation&amp;quot;].ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.FixJaxRpc = Convert.ToBoolean(sqlReader[&amp;quot;JaxRPC&amp;quot;]);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.MessageExchangePattern = sqlReader[&amp;quot;MessageExchangePattern&amp;quot;].ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.TransportType = sqlReader[&amp;quot;TransportType&amp;quot;].ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.TransportNamespace = sqlReader[&amp;quot;TransportNamespace&amp;quot;].ToString();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolution.Action = sqlReader[&amp;quot;Action&amp;quot;].ToString(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Transfer results to the Dictionary      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ResolverMgr.SetResolverDictionary(resolution, sqlValues); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (null != sqlValues)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resolutionOrig = sqlValues;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sqlReader.Close(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception ex)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EventLogger.Write(MethodInfo.GetCurrentMethod(), ex);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //add result to cache      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SetCache(sqlValues, config);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch (Exception ex)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EventLogger.Write(MethodInfo.GetCurrentMethod(), ex);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return resolutionOrig;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="System" size="1"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Stepping through the code, the first step is to repair the resolver string, if needed. The resolver string is also referred to as the Moniker. A Moniker is formatted as follows &lt;em&gt;Resolver&lt;/em&gt;:\\. For example the UDDI Moniker is UDDI:\\. In our example, our Moniker is SQL:\\. This first code snippet simply applies the :\\ if it missing.&lt;/p&gt;  &lt;p&gt;The next step retrieves the resolution from the cache, if it exists. We will dive into this more in depth in part two.&lt;/p&gt;  &lt;p&gt;Next, the parameters are extracted from the config string. The config string is the list of key/values that are included with the Moniker to create the EndPoint string. Our config string contains three key/values: Server Name, DB Name, and Service Name. These values are required to query our SQL repository. The ResolutionHelper.GetConfigValue method is used to extract the parameters from the config string.&lt;/p&gt;  &lt;p&gt;Next, the SQL connection string is created and the SqlDataReader is initialized. A stored procedure that takes the Service Name and returns the resolution data for that Service is executed to populate the SqlDataReader. A Resolution object is instantiated and the values from the SqlDataReader are used to populate values in the Resolution class. The Resolution object is then used to create the output of the method using the ResolverMgr.SetResolverDictionary method.&lt;/p&gt;  &lt;p&gt;The final step before returning the Dictionary result is to add the resolution to the cache. Caching will be described in more depth in part two.&lt;/p&gt;  &lt;p&gt;In part two we will discuss caching, configuration, and wiring up the custom resolver to the ESB.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2031940472683588162?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2031940472683588162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2031940472683588162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2031940472683588162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2031940472683588162'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/esb-20-custom-resolver-part-1.html' title='ESB 2.0 Custom Resolver: Part 1'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-5650639473444671213</id><published>2009-03-12T08:40:00.005-05:00</published><updated>2009-03-12T08:42:25.210-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>BizTalk 2009 Beta Documentation Now Available</title><content type='html'>Beta documentation for BizTalk 2009 is now available to download from the Microsoft.com website:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=38923F29-167F-497D-80A5-899602FEF8D7&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=38923F29-167F-497D-80A5-899602FEF8D7&amp;amp;displaylang=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5650639473444671213?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5650639473444671213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5650639473444671213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5650639473444671213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5650639473444671213'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/biztalk-2009-beta-documentation-now.html' title='BizTalk 2009 Beta Documentation Now Available'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7150547250641103522</id><published>2009-03-11T16:08:00.003-05:00</published><updated>2009-03-11T16:15:25.658-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Naming conventions'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><title type='text'>BizTalkCop For Naming Convention Enforcement in BizTalk 2006 and R2</title><content type='html'>Elton Stoneman has put together an extension to FxCop to assist with the enforcement of naming conventions around BizTalk applications.&lt;br /&gt;&lt;br /&gt;The 1.0 release contains a set of FxCop rules for analysis against BizTalk assemblies and BizTalk applications.  The rules in the package are configurable, by default they are based on the naming conventions Scott Colestock put out a few years ago.&lt;br /&gt;&lt;br /&gt;A detailed usage guide is published here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geekswithblogs.net/EltonStoneman/archive/2008/11/14/introducing-biztalkcop.aspx"&gt;http://geekswithblogs.net/EltonStoneman/archive/2008/11/14/introducing-biztalkcop.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An extensive demo of the tool is published here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geekswithblogs.net/benny/archive/2009/03/01/biztalkcop.aspx"&gt;http://geekswithblogs.net/benny/archive/2009/03/01/biztalkcop.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can download the package from CodePlex here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/BizTalkCop"&gt;http://www.codeplex.com/BizTalkCop&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7150547250641103522?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7150547250641103522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7150547250641103522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7150547250641103522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7150547250641103522'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/biztalkcop-for-naming-convention.html' title='BizTalkCop For Naming Convention Enforcement in BizTalk 2006 and R2'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6120490901891015153</id><published>2009-03-11T11:19:00.017-05:00</published><updated>2009-03-11T12:04:45.009-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Rules Engine'/><title type='text'>Empty Node Gotcha with the Business Rules Engine</title><content type='html'>I've been on a BizTalk 2006 R2 project where we are using the business rules engine to enrich some data coming from a call center.&lt;br /&gt;&lt;br /&gt;The data comes in using the vendor's format and is mapped on the inbound port into a cannonical format to be used internally for processing. Because of the complexity of the vendor's schema, we used some inline XPATH statements in the map to transform the data.&lt;br /&gt;&lt;br /&gt;When testing against the endpoint DB2 database, we discovered the database was failing to process the messages, even though everything appeared fine on the surface. After some investigation we discovered some hexidecimal characters in what were supposed to be empty nodes. The characters we saw were representative of a line break and a tab: &lt;span style="color:#ff0000;"&gt;#xD;&lt;/span&gt; and &lt;span style="color:#ff0000;"&gt;#xA;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tracing the steps back, we discovered this was appearing after the Business Rules Engine processed the document.&lt;br /&gt;&lt;br /&gt;In a normal map, empty nodes are created as &lt;span style="color:#ff0000;"&gt;&amp;lt;empty&amp;gt;&lt;/span&gt;, but using XPATH we were deriving empty nodes that looked like &lt;span style="color:#ff0000;"&gt;&amp;lt;empty&amp;gt;&amp;lt;/empty&amp;gt;&lt;/span&gt;, and when this type of node went to the rules engine, it created line breaks.&lt;br /&gt;&lt;br /&gt;We needed the empty nodes because the endpoint demanded all the nodes be present, so we had to make an adjustment to the XPATH statements to use something similar to:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;    &amp;lt;xsl:when test="@@XPATH HERE@@"&amp;gt;&lt;br /&gt;        &amp;lt;xsl:element name="Empty"&amp;gt;&lt;br /&gt;            &amp;lt;xsl:value-of select="@@XPATH HERE@@"/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;    &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:element name="Empty"&amp;gt;&amp;lt;/xsl:element&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;lt;/xsl:choose&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where the choose/otherwise allowed us to create the type of empty node we were looking for.&lt;br /&gt;&lt;br /&gt;So, if you find yourself extracting data from the rules engine and these unwanted characters appear, this is one way to solve it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6120490901891015153?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6120490901891015153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6120490901891015153' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6120490901891015153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6120490901891015153'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/empty-node-gotcha-with-business-rules.html' title='Empty Node Gotcha with the Business Rules Engine'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8877246389190677165</id><published>2009-03-11T09:12:00.001-05:00</published><updated>2009-03-11T09:12:08.279-05:00</updated><title type='text'>Dundas Chart Removed from Sample Management Portal in ESB 2.0</title><content type='html'>&lt;p&gt;Patterns and Practices has made a major change to the sample Management Portal that ships with the ESB Guidance 2.0 CTP2. The Dundas charting dependency has been removed. This is big news as it allows the sample portal to be used as a low-cost ESB Management Portal&amp;#160; without incurring the cost of Dundas Chart. Dundas Chart has been replaced by the MSChart control.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8877246389190677165?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8877246389190677165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8877246389190677165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8877246389190677165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8877246389190677165'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/03/dundas-chart-removed-from-sample.html' title='Dundas Chart Removed from Sample Management Portal in ESB 2.0'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-4219082292486010234</id><published>2009-01-12T14:54:00.001-05:00</published><updated>2009-01-12T14:54:18.754-05:00</updated><title type='text'>UDDI and Windows Server 2008 Upgrade</title><content type='html'>&lt;p&gt;I was upgrading a server recently from Windows Server 2003 to Windows Server 2008. The Windows Server 2003 installation did not include UDDI service. UDDI services are installed by default in Windows Server 2008. Everything looks correct as long as you don’t attempt to use the UDDI services on the upgraded machine. The services look to be running correctly and no errors are sent to the Event Log, however UDDI will not function.&lt;/p&gt;  &lt;p&gt;To resolve this issue it is necessary to reinstall UDDI services on the Windows Server 2008 installation. This only occurs when doing an upgrade from Windows Server 2003 and below that does not have UDDI services installed prior to the upgrade.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-4219082292486010234?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/4219082292486010234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=4219082292486010234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4219082292486010234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4219082292486010234'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2009/01/uddi-and-windows-server-2008-upgrade.html' title='UDDI and Windows Server 2008 Upgrade'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8585972334636720205</id><published>2008-12-29T08:43:00.004-05:00</published><updated>2008-12-29T09:12:06.464-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>BizTalk 2009 Database Diagram Now Available</title><content type='html'>The BizTalk 2009 product development team has released a pdf diagram of the structure of the BizTalk 2009 databases.  You can download yourself a copy at the link below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rdacorp.com/PDF/DatabasesAndEvents_v2.pdf"&gt;BizTalk 2009 Database Diagram PDF&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8585972334636720205?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8585972334636720205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8585972334636720205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8585972334636720205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8585972334636720205'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/12/biztalk-2009-database-diagram-now.html' title='BizTalk 2009 Database Diagram Now Available'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6050163771487514986</id><published>2008-12-09T09:45:00.001-05:00</published><updated>2008-12-09T09:47:54.529-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BAM'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><title type='text'>How to Recover the XML for an Acivity</title><content type='html'>Recently I created an activity, then saved off the XML from Excel to a folder (let’s call it v1) to deploy using the command like tool BM.exe.&lt;br /&gt;&lt;br /&gt;I needed to make significant changes to the activity, so significant in fact, that I needed to re-create the activity entirely, so I made a new activity (call it v2) and made the mistake of overwriting the v1 XML file. When I wanted to remove the previous (v1) activity, I realized that I had no way to remove it because BM.exe requires the use of the saved off XML file.&lt;br /&gt;&lt;br /&gt;Being fairly new to BAM, I wondered, how do I remove the v1 activity?&lt;br /&gt;&lt;br /&gt;Well, there is a way to recover the XML from the v1 activity.&lt;br /&gt;&lt;br /&gt;From the command line, execute:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bm.exe get-defxml -FileName:BAMDefinition.xml&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;That command recovers the configuration from the BAM DB which can then be leveraged to delete the v1 version of the activity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;Note: You must edit the XML to maintain the activities you want, if you exec the remove without editing the XML first you remove ALL your activities in the DB.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Then you can then execute:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bm.exe remove-all -DefinitionFile: BAMDefinition.xml&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;You should never delete anything surrounding BAM by hand, this will cause major problem if you do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6050163771487514986?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6050163771487514986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6050163771487514986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6050163771487514986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6050163771487514986'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/12/how-to-recover-xml-for-acivity.html' title='How to Recover the XML for an Acivity'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7620152390185510050</id><published>2008-12-02T09:46:00.000-05:00</published><updated>2008-12-02T09:47:16.584-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><title type='text'>Using MSBuild Extension Pack with BizTalk 2006</title><content type='html'>As many of you already know MSBuild is not compatible with BizTalk projects out-of-the-box. This fact can be a hurdle to overcome if Team Foundation Server (TFS) is being used to automate builds. The problem is TFS uses MSBuild exclusively in its build process. The workaround was to use an MSBuild task that called a NANT build to execute the BizTalk implementation. This was clumsy and not intuitive.&lt;br /&gt;&lt;br /&gt;To solve this issue a group of developers got together and created the &lt;a href="http://www.codeplex.com/MSBuildExtensionPack"&gt;MSBuild Extension Pack Project&lt;/a&gt;. The Extension Pack provides MSBuild Tasks for BizTalk 2006, SQL 2005, SQL 2008, among others. Tasks for BizTalk include tasks for checking the existence of an Application, adding/removing References, starting/stopping Applications, and creating/deleting Applications. The Extension Pack includes a help file and samples for all this functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7620152390185510050?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7620152390185510050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7620152390185510050' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7620152390185510050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7620152390185510050'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/12/using-msbuild-extension-pack-with.html' title='Using MSBuild Extension Pack with BizTalk 2006'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-841875797231281174</id><published>2008-12-02T09:32:00.000-05:00</published><updated>2008-12-02T09:33:33.785-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BAM'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><title type='text'>BAM: The Case of the Missing Pivot Table Data</title><content type='html'>&lt;p&gt;I had a recent problem getting a pivot table to display its data on the BAM portal.  I went thru a series of steps to get it working, so in case you have a similar problem here are some things to check to get the data displaying.&lt;/p&gt;&lt;p&gt;To frame things: I had a BAM activity with a series of data points to be tracked.  I needed to extract a very simple count/sum cube from the data.&lt;br /&gt;&lt;br /&gt;I set up the activity and went thru the view setup in Excel.  I had a dimension which tracks a calling system and a then I wanted to get a count/sum of another field which was setup as an integer.&lt;br /&gt;&lt;br /&gt;I couldn’t get it working; the view in the portal wouldn’t show any data at all.  The calling system wouldn’t appear and neither would the count.  I tried to set up the view as both a count (like a rowcount) and a sum and neither one showed the data.&lt;br /&gt;&lt;br /&gt;I was pretty sure that I set the activity up correctly so I began to look at different things that could be wrong.&lt;br /&gt;&lt;br /&gt;One of the first was to check if the SQL job "TrackedMessages_Copy_BizTalkMsgBoxDb" was running, it was.&lt;br /&gt;&lt;br /&gt;Next, I used the SQL Management Studio to connect to Analysis Services on the server that BAM was configured on. I located the cube I was interested in, right clicked on it and select "Process...", data should have appeared.  It didn’t.  Something else was wrong.&lt;br /&gt;I checked the associated SSIS package which is called BAM_AN_&lt;view&gt; which is responsible for populating the cube.  I ran the package and was finally able to see the data in the BAM Portal.  &lt;/p&gt;&lt;p&gt;Documentation for this can be seen here: &lt;a href="http://msdn.microsoft.com/en-us/library/aa560072.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/aa560072.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;So, to get things working right, I scheduled the SSIS package to the correct time interval and things were on track.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-841875797231281174?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/841875797231281174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=841875797231281174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/841875797231281174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/841875797231281174'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/12/bam-case-of-missing-pivot-table-data.html' title='BAM: The Case of the Missing Pivot Table Data'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-3534125843242825275</id><published>2008-11-25T09:20:00.000-05:00</published><updated>2008-11-25T10:36:43.021-05:00</updated><title type='text'>BizTalk Training Scenario</title><content type='html'>I believe there is a significant gap between what is learned by reading through BizTalk books and doing the Microsoft supplied labs, and what you learn by doing an implementation from the ground up. This has often been referred to as getting “real BizTalk project experience”. Unfortunately, getting real project experience is somewhat of a catch 22…you often need to have a reasonable set of skills to be placed on a BizTalk project in the first place. Not everyone is able to find someone who’s willing to turn you loose on a real business problem as a learning experience.&lt;br /&gt;&lt;br /&gt;To help bridge the gap I’ve put together a draft training scenario that when fully implemented will hopefully give someone skills with a good cross section of BizTalk features and functionality that they can work on while waiting to get the opportunity to work on a BizTalk project. There is no supplied code to get the developer started, and no detailed steps to follow to build it. There is some high level guidance on what sub-systems to create, and what each sub-system should do. The idea is that figuring this out on your own and building it from scratch will better prepare someone for real project work than just doing labs and reading.&lt;br /&gt;&lt;br /&gt;I’m sure this scenario can use some room for improvement, but if you’ve already read up on BizTalk, and you’ve run through labs available in either training courses or Microsoft virtual labs, you might find this a useful way to become more proficient.&lt;br /&gt;&lt;br /&gt;The scenario is broken into an intermediate section that focuses on giving the developer experience with the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Separation of implementation features into a set of separate applications or services that are decoupled from each other &lt;/li&gt;&lt;li&gt;Parsing flat files using both positional and delimited formats &lt;/li&gt;&lt;li&gt;Creating orchestrations that output data through both direct binding and “specify later” ports &lt;/li&gt;&lt;li&gt;Using various transport mechanisms (file, SQL, WCF Web service, SharePoint, Email) &lt;/li&gt;&lt;li&gt;Using correlation sets &lt;/li&gt;&lt;li&gt;Creation of canonical and vendor specific message types &lt;/li&gt;&lt;li&gt;Creation of Deployment MSI's, binding files, etc. to support an install that doesn’t require Visual Studio. &lt;/li&gt;&lt;/ul&gt;There are also suggestions on “Further Areas to Research” which makes recommendations on deeper areas to drill into, building on what’s been done in the intermediate piece:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Business Rule Engine&lt;/li&gt;&lt;li&gt;Business Activity Monitoring&lt;/li&gt;&lt;li&gt;The Microsoft ESB Toolkit&lt;/li&gt;&lt;li&gt;Messaging / orchestration / mapping topics - failed message routing, dynamic ports, other messaging formats (EDI X12, Excel spreadsheets, etc.), use of xslt functoids.&lt;/li&gt;&lt;li&gt;Tuning and testing &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The following link contains a zip file with the following materials:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Training Scenario Overview.doc – Document describing the training scenario &lt;/li&gt;&lt;li&gt;Message Specifications.xls – Excel file detailing the fields in each message (also captured in the overview document)&lt;/li&gt;&lt;li&gt;VendorPurchaseOrder.txt – Sample Vendor Purchase Order&lt;/li&gt;&lt;li&gt;VendorShippingNotice.txt – Sample Vendor Shipping Notice&lt;/li&gt;&lt;li&gt;VendorInvoice.txt – Sample Vendor Invoice&lt;/li&gt;&lt;li&gt;CreateCrmDB.sql – SQL Script which creates the CRM database&lt;/li&gt;&lt;li&gt;CreateCrmTable.sql – SQL Script which creates the CRM Accounts table within the CRM database&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.rdacorp.com/blogs/eai/RDA_Training_Scenario.zip"&gt;http://www.rdacorp.com/blogs/eai/RDA_Training_Scenario.zip&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-3534125843242825275?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/3534125843242825275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=3534125843242825275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3534125843242825275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3534125843242825275'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/11/biztalk-training-scenario.html' title='BizTalk Training Scenario'/><author><name>Rob Diaz</name><uri>http://www.blogger.com/profile/15910276392001964531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2165475557726355529</id><published>2008-11-24T14:57:00.000-05:00</published><updated>2008-11-24T15:06:06.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BAM'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><title type='text'>Activity Missing from your BAM Portal?  This May be Why...</title><content type='html'>Recently I worked on a BAM implementation and found myself stumped as to why, after creating a new activity, it was not visible in the portal.&lt;br /&gt;&lt;br /&gt;I thought it might have been a mistake in my configuration, deployment, or a rights issue.  After a series of experiments I couldn't determine anything wrong with either my configuration or deployment so I turned to investigating if it was a rights issue or not.&lt;br /&gt;&lt;br /&gt;It turned out to be.  The following lines saved as a .bat file did the trick.  Just replace the bracketed [ ] items with the names from your environment and it will work.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;em&gt;"C:\Program Files\Microsoft BizTalk Server 2006\Tracking\BM"&lt;br /&gt;add-account -AccountName:[DOMAIN\user] -View:[ViewName]&lt;br /&gt;-Server:[ServerName] -Database:BAMPrimaryImport&lt;/em&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2165475557726355529?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2165475557726355529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2165475557726355529' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2165475557726355529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2165475557726355529'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/11/activity-missing-from-your-bam-portal.html' title='Activity Missing from your BAM Portal?  This May be Why...'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2362234281410187749</id><published>2008-11-13T13:36:00.002-05:00</published><updated>2008-11-13T13:39:51.680-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB2 Adapater'/><category scheme='http://www.blogger.com/atom/ns#' term='Evan Aussenberg'/><title type='text'>BizTalk Adapter for DB2</title><content type='html'>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;I recently used the BizTalk Adapter for DB2 on a project for a large Insurance company. A few interesting topics worth mentioning about this effort; connection parameters, error codes, and client side trace.     &lt;br /&gt;    &lt;br /&gt;My experience involved calling DB2 stored procedures but they did not themselves use transactions. The stored procedures had been developed by the client using a COBOL CASE tool. So, this was basically a mechanism to call external COBOL routines that handled the business actual functions.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;BizTalk Adapter for DB2&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;From MSDN (links at end):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;The BizTalk Adapter for DB2 is a send and receive adapter that enables BizTalk orchestrations to interact with host systems. Specifically, the adapter enables send and receive operations over TCP/IP and APPC connections to DB2 databases running on mainframe, AS/400, and UDB platforms. Based on Host Integration Server technology, the adapter uses the Data Access Library to configure DB2 connections, and the Managed Provider for DB2 to issue SQL commands and stored procedures.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Connection Parameters&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;Some of the nomenclature when running the DB2 connection wizard can be a little confusing. Here is how it worked for this last project. The first two steps of the wizard are shown below. The third step is for the Username/Password and is not displayed.     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;Step One&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Address or alias&lt;/strong&gt;: The AS400 server name. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: Left as default 446. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="385" alt="image" src="http://lh4.ggpht.com/_-MTm07-azhE/SRxzxc7iMHI/AAAAAAAAAM4/HOYnGTh9ov8/image%5B5%5D.png?imgmax=800" width="484" border="0" /&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;Step Two&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Initial Catalog&lt;/strong&gt;: Same as Address, as shown above &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Package collection&lt;/strong&gt;: Client's default collection &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Default schema&lt;/strong&gt;: Same as package collection &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Default qualifier&lt;/strong&gt;: [blank] &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="389" alt="image" src="http://lh6.ggpht.com/_-MTm07-azhE/SRxzx-Xa1KI/AAAAAAAAAM8/lB3mOXVFtlc/image%5B11%5D.png?imgmax=800" width="488" border="0" /&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;     &lt;br /&gt;Error Codes&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;The major key to understanding error codes returned from the DB2 adapter is that some errors are DB2 server generated, while some errors are provider specific; in this case Microsoft's DB2 managed provider. The SQL SATE codes are available in the exception for the stored procedure call. Depending on your implementation, an event log my also be found.    &lt;br /&gt;    &lt;br /&gt;For example SQL STATE code &amp;quot;22001&amp;quot; represents a data truncation error. This can happen if the data passed to a stored procedure parameter is too wide. See the link at the end of the article for other codes.    &lt;br /&gt;    &lt;br /&gt;A SQL STATE value of &amp;quot;HY000&amp;quot; represents the provider specific error. One example would be a connectivity problem.    &lt;br /&gt;    &lt;br /&gt;Please see the links at the end of the article for further reading.    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Tracing BizTalk DB2 Calls&lt;/strong&gt;    &lt;br /&gt;    &lt;br /&gt;A utility called &lt;strong&gt;SNATrace&lt;/strong&gt; is installed with the host adapters on the BizTalk server. It provides ad-hoc logging of the connectivity with the AS/400.&amp;#160; &lt;br /&gt;    &lt;br /&gt;A brief blog from an actual team member of the DB2 Adapter product about using &amp;#8220;snatrace&amp;#8221; is provided below for further reading.    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa705612.aspx" target="_blank"&gt;BizTalk Adapter for DB2&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa771012.aspx" target="_blank"&gt;Troubleshooting the OLE DB Provider for DB2&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/microsoft.hostintegration.msdb2client.msdb2connectionstringbuilder_members.aspx" href="http://msdn.microsoft.com/en-us/library/microsoft.hostintegration.msdb2client.msdb2connectionstringbuilder_members.aspx" target="_blank"&gt;DB2 Connection String Parameters&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/ricardom/archive/2006/12/07/tracing-a-db2-connection-using-his-2006-trace-tool.aspx" target="_blank"&gt;Tracing a DB2 call&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/ricardom/archive/2007/11/01/biztalk-adapter-for-db2-and-the-sqlcamessage-db2-procedure.aspx" target="_blank"&gt;Understanding a failure trace&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/ricardom/archive/2007/12/07/getting-sqlcode-805-when-using-db2oledb-or-msdb2client.aspx" target="_blank"&gt;Package collections described&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Other External Links&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls520.htm" href="http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls520.htm" target="_blank"&gt;IBM SQL STATE Error Status Code examples&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2362234281410187749?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2362234281410187749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2362234281410187749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2362234281410187749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2362234281410187749'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/11/biztalk-adapter-for-db2.html' title='BizTalk Adapter for DB2'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_-MTm07-azhE/SRxzxc7iMHI/AAAAAAAAAM4/HOYnGTh9ov8/s72-c/image%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-266708359230438987</id><published>2008-11-12T13:21:00.002-05:00</published><updated>2008-11-12T13:23:39.951-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='External Assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Extension Xml'/><category scheme='http://www.blogger.com/atom/ns#' term='Mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='Evan Aussenberg'/><title type='text'>BTS Mapping With External Assemblies Part 3</title><content type='html'>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;Part 1 - Inline scripting and external assemblies     &lt;br /&gt;Part 2 - XSLT Call Templates and custom extensions     &lt;br /&gt;&lt;strong&gt;Part 3 - Cascading Functoids&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;This is the third of three articles about BizTalk mapping with external assemblies. External assemblies or helper classes are used by BizTalk's mapping engine (XSLT) automatically, and they can also be used explicitly by the developer. Just as in an orchestration, a developer may find a requirement that the built in mapping tools (&amp;quot;functoids&amp;quot;) do not address and in this case judicious use of a helper class can be very... helpful.     &lt;br /&gt;    &lt;br /&gt;While these articles are not an introduction to mapping if you have a little experience with the BizTalk mapper and a little experience with XSLT you should be able to follow along.     &lt;br /&gt;    &lt;br /&gt;Part 1, introduces inline C# scripting, its limitations, and also introduces the scenario of using an external assembly (helper class) automatically. Part 2, demonstrates using a map's custom extension property, which allows us to explicitly access external assemblies. Part 3, this article, will build on this discussion and highlight potential caveats about using cascading functoids; when the output of one functoid&amp;#160; is the input to another functoid(s).     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Validating Maps that use Cascading Functoids      &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;Whether a transformation is simple or complex, I often find validating a BizTalk map and viewing the XSLT output is beneficial. Below is an example of a simple map containing a cascading functoid; a function that calls another function. If we review the resulting XSL file the output is as expected. Yet, the output from maps containing cascading functoids that output to multiple targets (be it other functoids or other nodes) does not generate as I would expect.     &lt;br /&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="179" alt="image" src="http://lh6.ggpht.com/_-MTm07-azhE/SRsekneUBeI/AAAAAAAAAMo/ZSV4bqWNtfE/image8.png?imgmax=800" width="355" border="0" /&gt;     &lt;br /&gt;    &lt;br /&gt;The XSLT output from this map is as expected. The variable &lt;strong&gt;v1&lt;/strong&gt; contains the right trimmed string and serves as input to the UpperCase functoid, the output of which is assigned to &lt;strong&gt;v2&lt;/strong&gt;. The value of &lt;strong&gt;v2 &lt;/strong&gt;is then contained in the LastName node.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #2b91af; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt; &lt;/span&gt;&lt;span style="font-size: 9pt; color: red; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt;match&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: " en-us;="EN-US;" ar-sa?="AR-SA?" lucida="lucida" console?;="console?;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt;="10.0pt;" mso-bidi-font-family:="mso-bidi-font-family:" ?Courier="?Courier" New?;="New?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:"&gt;&lt;font face="Lucida Console"&gt;&amp;quot;&lt;span style="color: blue"&gt;/s0:AMsg&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v1&lt;/span&gt;&amp;quot;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp&lt;/strong&gt;:StringTrimRight(string(Customer/LastName/text()))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:&lt;strong&gt;v2&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;font color="#0000ff"&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp&lt;/strong&gt;:StringUpperCase(string($var:v1))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ns0:BMsg&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Customer&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:&lt;strong&gt;v2&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Customer&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ns0:BMsg&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Lucida Console"&gt;&amp;gt;&lt;/font&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;Note&lt;/strong&gt;: The built in functoids imbed inline C# code. We can use the &amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp:&lt;/strong&gt;&lt;/span&gt;&amp;quot; XSL namespace ourselves when constructing XSLT functoids. We will see an example below.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Functoids with Multiple Outputs&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;The XSLT story changes when we examine output from the BizTalk mapper when using a functoid that is connect to more than one node (or cascading functoid). It turns out that in the example below, you will see that the entire functoid chain is executed &lt;u&gt;twice&lt;/u&gt;. Once for the SortKey node, and once for the LastName node.     &lt;br /&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="180" alt="image" src="http://lh6.ggpht.com/_-MTm07-azhE/SRselCr-aLI/AAAAAAAAAMs/WOS6XIUM1ZM/image16.png?imgmax=800" width="357" border="0" /&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;Typically a functoid with multiple outputs will be executed once for each output. In this example, the &lt;em&gt;entire functoid chain&lt;/em&gt; is executed once for each connection. Imagine using a helper class to get a database value, if one is not careful the same database helper method might be executed more than one time! The XSLT code below is what the BizTalk mapper generated for the map above.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #2b91af; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt; &lt;/span&gt;&lt;span style="font-size: 9pt; color: red; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;match&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;&lt;font face="Lucida Console"&gt;&amp;quot;&lt;span style="color: blue"&gt;/s0:AMsg&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #00b050"&gt;&lt;strong&gt;SortKey functoid chain&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; --&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v1&lt;/span&gt;&amp;quot;           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:&lt;b style="mso-bidi-font-weight: normal"&gt;StringTrimRight&lt;/b&gt;(&lt;b style="mso-bidi-font-weight: normal"&gt;string(Customer/LastName/text())&lt;/b&gt;)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:&lt;strong&gt;v2&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:&lt;b style="mso-bidi-font-weight: normal"&gt;StringUpperCase&lt;/b&gt;(string($var:v1))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Lucida Console"&gt; /&amp;gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;span style="mso-spacerun: yes"&gt;           &lt;br /&gt;&lt;font face="Lucida Console"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font face="Lucida Console"&gt;&amp;lt;!-- &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #00b050"&gt;&lt;strong&gt;&lt;font face="Lucida Console"&gt;LastName functoid chain&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; --&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v3&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;string(&lt;b style="mso-bidi-font-weight: normal"&gt;Customer/LastName/text()&lt;/b&gt;)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v4&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;/font&gt;&lt;/p&gt;   &lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:" ?Lucida="?Lucida" AR-SA?="AR-SA?" EN-US;="EN-US;" Console?;="console?;"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Lucida Console"&gt;&lt;span style="font-size: 9pt; color: red; line-height: 115%; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:" ?Lucida="?Lucida" AR-SA?="AR-SA?" EN-US;="EN-US;" Console?;="console?;"&gt;select&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; line-height: 115%; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:" ?Lucida="?Lucida" AR-SA?="AR-SA?" EN-US;="EN-US;" Console?;="console?;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; line-height: 115%; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" New="New" Roman?;="Roman?;" mso-fareast-theme-font:="mso-fareast-theme-font:" minor-fareast;="minor-fareast;" mso-ansi-language:="mso-ansi-language:" mso-fareast-language:="mso-fareast-language:" mso-bidi-language:="mso-bidi-language:" ?Lucida="?Lucida" AR-SA?="AR-SA?" EN-US;="EN-US;" Console?;="console?;"&gt;&lt;font face="Lucida Console"&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:&lt;b style="mso-bidi-font-weight: normal"&gt;StringTrimRight&lt;/b&gt;($var:v3)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;var:&lt;strong&gt;v5&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:&lt;b style="mso-bidi-font-weight: normal"&gt;StringUpperCase&lt;/b&gt;(string($var:v4))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ns0:BMsg&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Customer&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:&lt;strong&gt;v2&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:&lt;strong&gt;v5&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Customer&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ns0:BMsg&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Lucida Console"&gt; &lt;/font&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;BizTalk Transformations with Value Caching&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;Let's expand on the example above. In the map below we have two functoid chains, each go to their respective output element and also to a string concatenation function, which is in turn connected to the SortKey field. Because we want our imagined map to be as efficient as possible we won't be able to completely use BizTalk's drag and drop mapping. We will need to eliminate the multiple connections that go to both the concatenation functoid and to the target fields. One way to do this is by implementing value caching combined with an XSLT call template to eliminate the multiple executions of the same methods. After describing the approach, there will be a short review of the benefits and caveats.     &lt;br /&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="178" alt="image" src="http://lh6.ggpht.com/_-MTm07-azhE/SRsellZQWiI/AAAAAAAAAMw/Vq52fqt1Hss/image22.png?imgmax=800" width="401" border="0" /&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Value Caching with XSLT Call Templates and Inline C#&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;By looking at the first cut of our hypothetical map above, we can see that the LastName, FirstName, and SortKey target fields are all interconnected. Thus we are going to eliminate all the functoid chains and replace them with a single XSLT call template. In addition we'll add our own standalone C# code.     &lt;br /&gt;    &lt;br /&gt;By adding an inline C# scripting functoid (#1) we can add methods to be called by the XSLT (#2) in the map.     &lt;br /&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="179" alt="image" src="http://lh6.ggpht.com/_-MTm07-azhE/SRselzITbxI/AAAAAAAAAM0/8DAgoXeoYD8/image28.png?imgmax=800" width="393" border="0" /&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;Even though functoid #1 is &amp;quot;floating&amp;quot; the C# code is still included in the map. This is a simple example of some accessor and related functions. They mainly will serve to cache the First and Last Name values so that we don't have to process them twice (Trim + Uppercase). The actual process of processing the string is for example only, the process could equally have been a database call to a helper function via an External Assembly object.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-pagination: none; mso-layout-grid-align: none"&gt;&lt;font face="Lucida Console"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;// SortKey: Return LastName + comma + FirstName          &lt;br /&gt;//           &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;public&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;&lt;font face="Lucida Console"&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetSortKey()           &lt;br /&gt;{           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; System.String.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0},{1}&amp;quot;&lt;/span&gt;, GetLastName(), GetFirstName());           &lt;br /&gt;}           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: green"&gt;// LastName: Trim + Uppercase            &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _lastName = &lt;span style="color: blue"&gt;null&lt;/span&gt;;           &lt;br /&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SetLastName(&lt;span style="color: blue"&gt;string&lt;/span&gt; LastName)           &lt;br /&gt;{           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_lastName = LastName.Trim();           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_lastName = LastName.ToUpper();           &lt;br /&gt;}           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: green"&gt;// LastName: Return value            &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetLastName()           &lt;br /&gt;{           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; _lastName;           &lt;br /&gt;}           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: green"&gt;// FirstName: Trim + Uppercase            &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _firstName = &lt;span style="color: blue"&gt;null&lt;/span&gt;;           &lt;br /&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SetFirstName(&lt;span style="color: blue"&gt;string&lt;/span&gt; FirstName)           &lt;br /&gt;{           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_firstName = FirstName.Trim();           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_firstName = FirstName.ToUpper();           &lt;br /&gt;}           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: green"&gt;// FirstName: Return value            &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetFirstName()           &lt;br /&gt;{           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; _firstName;           &lt;br /&gt;}&lt;/font&gt;         &lt;br style="mso-special-character: line-break" /&gt;        &lt;br style="mso-special-character: line-break" /&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Functoid #2 is an XSLT template, and it will call the C# methods and emit the SortKey, LastName, and FirstName fields. Here is what the XSLT call template looks like, it is quite similar to what we've already seen in the prior articles. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Lucida Console"&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;xsl:template&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt; &lt;/span&gt;&lt;span style="font-size: 9pt; color: red; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;name&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " lucida="lucida" console?;="console?;" mso-bidi-font-family:="mso-bidi-font-family:" Console??="Console??" ?Lucida="?Lucida"&gt;&lt;font face="Lucida Console"&gt;&amp;quot;&lt;span style="color: blue"&gt;CustomerAndSortKeyTemplate&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt;Customer &amp;amp; SortKey Input &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:param&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;LastName&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:param&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;FirstName&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Lucida Console"&gt; /&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: green"&gt;&lt;font face="Lucida Console"&gt; Cache and process the last/first name values:            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Call C# using the &amp;quot;userCSharp&amp;quot; namespace alias             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;that the BizTalk mapper itself generated.             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Note: These calls return &amp;quot;void&amp;quot; thus, no output! &lt;/font&gt;&lt;/span&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:SetLastName($LastName)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:SetFirstName($FirstName)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Emit the SortKey, LastName and FirstName fields &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; SortKey &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;SortKey&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:GetSortKey()&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; LastName (another way to emit a field) &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:GetLastName()&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LastName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; FirstName &lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;FirstName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;userCSharp:GetFirstName()&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;FirstName&lt;/span&gt;&lt;/font&gt;&lt;font face="Lucida Console"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Summary      &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;Using XSLT and C# caching can be an efficient approach to designing a map that would otherwise unnecessarily consume too much processing bandwidth if the map were solely generated by the default BizTalk Mapper design output.     &lt;br /&gt;    &lt;br /&gt;Some considerations to think about:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Using XSLT with the BizTalk mapper might require that you or your client have a comfort level about designing the mapping outside of the normal Drag and Drop approach. However, the efficiency of the custom XSLT, and to some degree the straight-forwardness of it may outweigh the amount of design time needed for a complicated Drag and Drop map. &lt;/li&gt;    &lt;li&gt;The XSLT approach is more sensitive to schema changes. A simple map with out XSLT will fail validation (if not outright fail to compile) if a schema changes. However, custom XSLT is ultimately just syntax based on a matching mechanism. There is not compile time validation that the elements being emitted conform to the current target schema. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547368.aspx"&gt;Custom Extension XML (Grid Property)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547251.aspx"&gt;Scripting Using External Assemblies&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561456.aspx"&gt;Scripting Using Inline C#, JScript .NET, and Visual Basic .NET&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561574.aspx"&gt;Scripting Using Inline XSLT and XSLT Call Templates&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa560433.aspx"&gt;Extending Mapper (BizTalk Server Sample)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;External Links about BizTalk Mapper Performance&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.bizbert.com/bizbert/2008/02/26/Understanding+The+BizTalk+Mapper+Part+12+Performance+And+Maintainability.aspx"&gt;Understanding the BizTalk Mapper - Performance and Maintainability&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Article Links&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-1.html" target="_blank"&gt;BTS Mapping With External Assemblies Part 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-2.html" target="_blank"&gt;BTS Mapping With External Assemblies Part 2&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-266708359230438987?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/266708359230438987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=266708359230438987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/266708359230438987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/266708359230438987'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/11/bts-mapping-with-external-assemblies.html' title='BTS Mapping With External Assemblies Part 3'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_-MTm07-azhE/SRsekneUBeI/AAAAAAAAAMo/ZSV4bqWNtfE/s72-c/image8.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8687940020347382972</id><published>2008-10-23T13:01:00.002-05:00</published><updated>2008-10-23T13:03:24.229-05:00</updated><title type='text'>Managing SAP Connections with LOB SAP Adapter in BizTalk 2006 R2</title><content type='html'>&lt;p&gt;Recently I was working with a client to connect a BizTalk 2006 R2 process to SAP with the LOB SAP adapter. We first called a BAPI function that returned a list of contract IDs that had been modified since our last successful processing event (usually 24 hours). This list could contain anywhere from 1000 to 10000 contract IDs depending on volume and amount of time since the last processing event. Once we had the collection of contract IDs we iterate over the collection calling a separate BAPI function to retrieve the contract data for each contract ID. We quickly ran into the issue where BizTalk was overwhelming the SAP server with BAPI calls. In order to fix the issue we throttled down the number of connections made by the BizTalk Server. &lt;/p&gt;&lt;p&gt;To do this, we use the WCF-Custom Adapter with SAP bindings. In our Solicit-Response Send Port we select WCF-Custom as our Type and click "Configure". Click on the "Binding" tab and select sapBinding from the Binding Type drop-down. The configuration window will now display. This will look familiar to users of the mySAP adapter. The maxConnectionPerSystem setting is the one we are concerned with. In the specific instance above, we found a "sweet spot" of 25 connections. You will have to work with your SAP administrators to determine what this number will be. Make sure to consider other systems that connect to SAP (it is the SAP connection pool that we are trying to avoid overwhelming). Some trial and error are involved. Make sure to perform some high volume load testing to ensure that SAP is not being overwhelmed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8687940020347382972?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8687940020347382972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8687940020347382972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8687940020347382972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8687940020347382972'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/10/managing-sap-connections-with-lob-sap.html' title='Managing SAP Connections with LOB SAP Adapter in BizTalk 2006 R2'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-4706177522787850023</id><published>2008-10-21T09:41:00.001-05:00</published><updated>2008-10-21T09:43:44.656-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Oslo'/><category scheme='http://www.blogger.com/atom/ns#' term='Dublin'/><title type='text'>Microsoft’s Intentions for “Dublin”</title><content type='html'>Microsoft .NET Framework 4.0 release will be adding significant functionality to the development platform. Among these is a large enhancement codenamed "Dublin" that will focus on improving scalability and manageability of Windows based applications and provide a standard host for applications by extending IIS.&lt;a name="programmingModel"&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;“Dublin”, in a nutshell will:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Provide standard host for WF and WCF applications&lt;/li&gt;&lt;li&gt;Provide pre-built developer services&lt;/li&gt;&lt;li&gt;Support message-based correlation and content-based message routing&lt;/li&gt;&lt;li&gt;Contain a message forwarding service&lt;/li&gt;&lt;li&gt;Offer a compensation service for long-running transactions&lt;/li&gt;&lt;li&gt;Enable scale-out of stateful workflow applications&lt;/li&gt;&lt;li&gt;Persisting and rehydrating state for high scalability&lt;/li&gt;&lt;li&gt;Enhanced management and monitoring functions &lt;/li&gt;&lt;li&gt;Tracking store for workflow events &lt;/li&gt;&lt;li&gt;Supports “Oslo” modeling platform&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You may read those bullet points and say “hey, this sounds like BizTalk”. Well, yes and no. The easiest way to view this is that some BizTalk functionality will be available within the .NET Framework.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;“Dublin” will be available for download when released and will eventually be included in future releases of Windows Server. “Dublin” will be fully supported thru current support contracts.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;“Dublin” will be the first Microsoft server product to deliver support for the “Oslo” modeling platform. “Dublin” does not require “Oslo” in order to operate but administrators will be able to deploy applications from the “Oslo” repository directly to the “Dublin” application server. “Dublin” provides model-driven “Oslo” applications with a powerful runtime environment, out of the box.&lt;br /&gt;&lt;br /&gt;The intention is for “Dublin” based applications to interoperate with BizTalk based services. The integration server and application server workloads are distinct but complementary so they can be deployed separately as needed. The intention is for “Dublin” to be an application platform, BizTalk an integration platform. When they need to work together, they will be able to. Otherwise, requirements will drive which platform to use.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-4706177522787850023?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/4706177522787850023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=4706177522787850023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4706177522787850023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4706177522787850023'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/10/microsofts-intentions-for-dublin.html' title='Microsoft’s Intentions for “Dublin”'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8868204292603481539</id><published>2008-10-02T10:35:00.000-05:00</published><updated>2008-10-02T10:36:46.800-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>New Features in BizTalk 2009</title><content type='html'>Details about the upcoming release of BizTalk 2009 are emerging.  The new version was initially to be called BizTalk 2006 R3 but the development team felt that it was a significant enough step forward to warrant an change of the product name.&lt;br /&gt;&lt;br /&gt;Among the highlights of the new release are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for Windows Server 2008, Visual Studio 2008, SQL Server 2008 and also the .NET Framework 3.5&lt;/li&gt;&lt;li&gt;Support for Windows Server 2008 Hyper-V which is a much higher performance platform for creating virtual machines&lt;/li&gt;&lt;li&gt;BizTalk 2009 takes advantage of Windows Server 2008 clustering so you can now deploy BizTalk Server so cluster nodes could reside on separate IP subnets and avoid complicated VLANs&lt;/li&gt;&lt;li&gt;BizTalk Server 2009 includes a UDDI 3.0 registry which provides support for registry affiliation, extended discovery services, digital certificates and extensibility for a subscription API&lt;/li&gt;&lt;li&gt;New Line of Business Adapters are introduced for Oracle E-Business Suites and SQL Server&lt;/li&gt;&lt;li&gt;Additional performance improvements have been made to the existing set of adapters&lt;/li&gt;&lt;li&gt;Enhanced Business Activity Monitoring- By expanding the out of the box BAM functionality with SQL Server 2008 Analysis Services, BizTalk Server 2009 provides support for UDM cubes and scalable real-time aggregations which enhances support for Microsoft PerformancePoint Server 2007&lt;/li&gt;&lt;li&gt;ESB Guidance 2.0 delivers updated prescriptive guidance for applying ESB usage patterns&lt;/li&gt;&lt;li&gt;Enhanced Support for EDI and AS2 Protocols&lt;/li&gt;&lt;li&gt;BizTalk Server 2009 updates all message schemas and business rules for compliance with SWIFTReady Financial EAI Gold certification&lt;/li&gt;&lt;li&gt;New Mobile RFID Platform and device management &lt;/li&gt;&lt;li&gt;New RFID industry standards support for LLRP, TDT, TDS, WS Discovery and partial EPCIS support&lt;/li&gt;&lt;li&gt;BizTalk Server 2009 improves recoverable interchange processing of validation failures by providing support for recoverable interchange processing&lt;/li&gt;&lt;li&gt;The WCF Adapter has been enhanced to provide support for configurable transactions and the ability to choose the transaction isolation level in the WCF-Custom Send Adapter.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8868204292603481539?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8868204292603481539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8868204292603481539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8868204292603481539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8868204292603481539'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/10/new-features-in-biztalk-2009.html' title='New Features in BizTalk 2009'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-1406997656305624953</id><published>2008-10-01T14:09:00.001-05:00</published><updated>2008-10-01T14:15:22.538-05:00</updated><title type='text'>Introductory BizTalk Seminar</title><content type='html'>RDA is hosting a free ½ day seminar on EAI/BizTalk in the Atlanta and Philadelphia areas. We will be giving an overview of BizTalk features, and providing a summary of several implementations we've deployed.&lt;br /&gt;&lt;br /&gt;If your company faces challenges in getting new trading partners integrated into your existing systems – let RDA help you streamline your systems, processes and people.&lt;br /&gt;&lt;br /&gt;The target audience for this event is IT management of firms facing this challenge. For information or to register, please check out our website at &lt;a href="http://www.rdacorp.com/getting_started/events.html#Enterprise_Application_Integration_/_BizTalk_Seminar_Series"&gt;http://www.rdacorp.com/getting_started/events.html#Enterprise_Application_Integration_/_BizTalk_Seminar_Series&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-1406997656305624953?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/1406997656305624953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=1406997656305624953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1406997656305624953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1406997656305624953'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/10/introductory-biztalk-seminar.html' title='Introductory BizTalk Seminar'/><author><name>Rob Diaz</name><uri>http://www.blogger.com/profile/15910276392001964531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-4481880972820527955</id><published>2008-09-25T14:08:00.000-05:00</published><updated>2008-09-25T14:10:58.023-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><title type='text'>The Easiest Way to Try and Learn BizTalk: Virtual Labs</title><content type='html'>Microsoft has a great way to experiment with BizTalk Server. By using a virtual online environment, you can login to a session on remotely located server and use BizTalk without any of the complexities of setting up an environment yourself.&lt;br /&gt;&lt;br /&gt;In terms of getting up to speed, there is no faster way to do it. Labs are guided, well structured and guided. Each lab builds on the last to give a user top to bottom exposure of BizTalk Server. All labs are in English and last about 90 minutes. If your session goes longer than 90 minutes, you can certainly extend this time.&lt;br /&gt;&lt;br /&gt;You can give the BizTalk 2006 Virtual Labs a try at this address:&lt;br /&gt;&lt;a href="http://www.microsoft.com/biztalk/en/us/virtual-labs.aspx"&gt;http://www.microsoft.com/biztalk/en/us/virtual-labs.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a list of the current labs available, 26 in total!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MSDN Virtual Lab Express: What's New in BizTalk Server 2006&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Microsoft BizTalk Server 2006 Working with Schemas&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Microsoft BizTalk Server 2006 Working with Maps&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Working with Pipelines&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Processing Flat Files&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: New Features for Processing Flat Files and Batch Messages using BizTalk Server 2006&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integration with POP3 and SharePoint and Routing Failed Messages&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Creating an Orchestration&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Implementing Transactions&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integrating Business Rules in Microsoft BizTalk Server 2006&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Enabling Business Activity Monitoring&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: New Features for Deploying and Managing a BizTalk Application in Microsoft BizTalk Server 2006&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: WCF Introduction - Building a WCF Service&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Using the WCF Adapters in BizTalk Server 2006 R2&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Using the BizTalk Server 2006 R2 WF and WCF BAM Interceptors&lt;br /&gt;MSDN Virtual Lab: Building a Windows Communication Foundation (WCF) Adapter using the WCF LOB Adapter SDK&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Processing EDI messages with BizTalk Server 2006 R2&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Sending EDI Messages with BizTalk Server 2006 R2&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Building an RFID application with BizTalk Server 2006 R2&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integrating Legacy Data with BizTalk Applications using BizTalk Adapters for Host Systems&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integrating Legacy Data with .NET Framework applications using Host Integration Server 2006&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integrating Legacy Applications with BizTalk Applications using BizTalk Adapter for Host Systems&lt;/li&gt;&lt;li&gt;MSDN Virtual Lab: Integrating Legacy Applications with .NET Framework applications using Host Integration Server 2006&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-4481880972820527955?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/4481880972820527955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=4481880972820527955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4481880972820527955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4481880972820527955'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/09/easiest-way-to-try-and-learn-biztalk.html' title='The Easiest Way to Try and Learn BizTalk: Virtual Labs'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-9090541614625335108</id><published>2008-09-11T15:53:00.002-05:00</published><updated>2008-09-11T15:55:12.327-05:00</updated><title type='text'>Tracking Events In Real Time Using BizTalk 2006</title><content type='html'>&lt;p&gt;Recently I was tasked with creating a solution within BizTalk 2006 to track real-time events. The scenario did not sound unique and with the RFID functionality built into BizTalk 2006 R2, the situation seems likely to become more pervasive. Here is a stripped down sample of the solution that I arrived at &lt;a href="http://www.rdacorp.com/blogs/eai/rda_timer.zip"&gt;Sample Timer Application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Problem:&lt;/p&gt;&lt;p&gt;In this sample scenario we have the following set-up:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We have a warehouse in Death Valley, CA where we store pallets of ice cream. Some areas of the warehouse are refrigerated, some are not. The areas that are not refrigerated have an average temperature of over 100 degrees Fahrenheit. Ice Cream has a life expectancy of 20 minutes when left outside of a refrigerated area.&lt;/li&gt;&lt;li&gt;Pallets are equipped with RFID tags that identify the pallet by a unique Pallet ID.&lt;/li&gt;&lt;li&gt;Gateways between refrigerated areas and un-refrigerated areas are equipped with RFID readers. When an ice cream pallet passes through a gateway a message is sent to BizTalk indicating a change in status between refrigerated/exposed. &lt;/li&gt;&lt;li&gt;The external loading dock door is also equipped with an RFID reader. Passing through this portal indicates that the pallet has left the warehouse.&lt;/li&gt;&lt;li&gt;We need to be able to send an alert to the warehouse foreman to alert him when a pallet has been left exposed for 15 minutes so that he can take action before the pallet is ruined.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Based on this scenario the following requirements were compiled:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;When a message is received indicating that a pallet has changed status from refrigerated to exposed, a 15 minute timer should be started.&lt;/li&gt;&lt;li&gt;If the pallet is returned to refrigerated status or leaves the warehouse on a truck the timer should be terminated to prevent false alerts from executing.&lt;/li&gt;&lt;li&gt;If the timer expires without being terminated, an alert message should be generated by the system.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In order to solve this problem the following design was constructed:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/jason.petrin/SMmFXmdCpPI/AAAAAAAAAB8/4QjIQbo7FWg/Timer%20Diagram%5B5%5D.png"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="314" alt="Timer Diagram" src="http://lh5.ggpht.com/jason.petrin/SMmFXzncRrI/AAAAAAAAACA/XQvxKXAQCZU/Timer%20Diagram_thumb%5B3%5D.png" width="564" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Trigger messages are received from the Message Box (through direct binding) by the Timer Orchestration. Depending on the trigger type (Create, Reset, or Terminate) a corresponding stored procedure is called via a SQL send port. Trigger messages contain the following fields:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Timestamp - Timestamp of the message. In our solution, this timestamp is used as a base time in the following formula. BaseTime + TimerLength = TimerEndTime. TimerEndTime is the timestamp contained in the database that indicates when a timer should expire.&lt;/li&gt;&lt;li&gt;InterfaceName - Namespace of the trigger type. Used for routing.&lt;/li&gt;&lt;li&gt;Action - The action we are trying to perform (CreateTimer, ResetTimer, or TerminateTimer).&lt;/li&gt;&lt;li&gt;SubAction - Unique name for this timer.&lt;/li&gt;&lt;li&gt;Params - Collection of Key-Value pairs for future processing. (Note: the Create and Reset Timer Triggers require a TimerLength key with an integer (timer length in minutes) in order to process. Any number of Param nodes can be added to this collection. (e.i. in our example brand, flavor, and expiration date could be included, to name a few).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;SQL send ports are used to execute one of the three actions on the database:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create - Creates a record in the database. Uses spCreateTimer stored procedure.&lt;/li&gt;&lt;li&gt;Reset - Updates a specified record in the database to give it a new TimerEndTime, if the timer has not expired. Uses spResetTimer stored procedure.&lt;/li&gt;&lt;li&gt;Terminate - Updates a specified record in the database to flag it as expired. Uses spTerminateTimer stored procedure.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A SQL receive location is set up in BizTalk to poll the results of the spGetExpiredTimers stored procedure. This stored procedure aggregates timers from the database whose TimerEndTime timestamps are in the past. Timers that are flagged as expired are ignored. Timers collected are flagged as expired to prevent duplicate processing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-9090541614625335108?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/9090541614625335108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=9090541614625335108' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/9090541614625335108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/9090541614625335108'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/09/tracking-events-in-real-time-using.html' title='Tracking Events In Real Time Using BizTalk 2006'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jason.petrin/SMmFXzncRrI/AAAAAAAAACA/XQvxKXAQCZU/s72-c/Timer%20Diagram_thumb%5B3%5D.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-4138911042812663319</id><published>2008-09-09T08:01:00.000-05:00</published><updated>2008-09-09T08:02:40.010-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk 2009'/><title type='text'>"BizTalk 2009" Announced</title><content type='html'>This month, Microsoft has announced the upcoming release of BizTalk Server 2009 coupled with plans for future releases.&lt;br /&gt;&lt;br /&gt;Originally the next release of BizTalk was slated to be named BizTalk Server R3 but has been renamed “BizTalk Server 2009”. Microsoft wanted everyone to make sure it was understood that this is a full product release with new and enhanced capabilities and updated platform support for Windows Server 2008, Visual Studio 2008, SQL Server 2008, and the .NET Framework 3.5.&lt;br /&gt;&lt;br /&gt;A CTP release is expected by the end of this year. The formal release date is expected to be around June of ‘09.&lt;br /&gt;&lt;br /&gt;Microsoft also plans to maintain a rhythm of BizTalk releases every 2 years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-4138911042812663319?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/4138911042812663319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=4138911042812663319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4138911042812663319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4138911042812663319'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/09/biztalk-2009-announced.html' title='&quot;BizTalk 2009&quot; Announced'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2300327769950983918</id><published>2008-08-29T12:21:00.000-05:00</published><updated>2008-08-29T12:27:52.041-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><title type='text'>Creating a BizTalk 2006 R2 VPC Template for Use in MS System Center Virtual Machine Manager</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;I was tasked with the objective of creating a way for the EAI group to "mass-produce" BTS2006 R2 servers on the corporate Virtual Server Self-Serve portal for development purposes. Note that before embarking on this task, make sure that you or your company has the appropriate licenses (MSDN or other) to set this up.&lt;br /&gt;&lt;br /&gt;In analyzing the requirements for this, I found out that I would need to create a VPC with all the software on it. This VPC would then be processed and imported into the self-serve portal as a "template" for all machines to be made from. However, I found out some interesting information about the process the VPC is run through as it's being made into a "template".&lt;br /&gt;&lt;br /&gt;The VPC is first run through an application named SysPrep. This software "anonymizes" the OS. It removes the Windows activation code and also removes all the Security Identifiers associated with all files and accounts. This means that any "non-system" accounts created &lt;b&gt;before&lt;/b&gt; SysPrep is run will not match the accounts &lt;b&gt;after&lt;/b&gt; SysPrep is run. This brought up the major issue I ran into while trying to complete this objective. While configuring both BizTalk and Windows SharePoint Services (WSS), you need to provide accounts, which will be the owners of the associated processes. The issue would be that any account(s) I create and configure before SysPrep is run would not match the account(s) on each instantiation of the template, since the security IDs associated with the accounts wouldn't match.&lt;br /&gt;&lt;br /&gt;During discussions about this issue, someone theorized about possibly installing all the software, but not configuring the ones that need specific accounts (BTS 2006 and WSS 2.0/3.0). That's when I tried going through the Microsoft Installation instructions for BTS 2006 R2 (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=df2e8a88-fb23-49a4-9ac7-d17f72517d12&amp;amp;displaylang=en"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=df2e8a88-fb23-49a4-9ac7-d17f72517d12&amp;amp;displaylang=en&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;). In order to create a "template" for the Self-Service Portal, I created a VPC, with all the software products installed. I started with Windows Server 2003 (Enterprise). I changed the order in one aspect, in that they instruct you to install Windows 2003, then run Windows Update, and then install IIS. What I did was to install Windows Server 2003, then install IIS and the POP3 service, and then run Windows Update, so that I could get any update files specifically marked for IIS or the mail server.&lt;br /&gt;&lt;br /&gt;After I did that, then I installed the Office Components. The instructions specified Excel and InfoPath, but I also included Word. However, one note on these components. During installation, I did not use a Product Key for Office. This was so that whoever needs to use the server can use their own Office product key.&lt;br /&gt;&lt;br /&gt;I then installed Visual Studio 2005, and then service pack 1 for VS 2005. I did add a feature not listed in the instructions. The instructions indicate that you should unselect all features except Visual C# and .Net Framework SDK. I did keep the Visual Web Developer component, in case any web services needed to be included in any project.&lt;br /&gt;&lt;br /&gt;At this point, the instructions indicate that SQL Server 2005 should be installed. Now, one option in the installation for SQL allows for the use of a separate account, under which SQL server will run. Another option allows for SQL Server to run under a "defined system account". I chose this option because, when the VPC/VHD is imported and converted to a template for use in the Self-Service portal, the SIDs are all stripped out of accounts, so an account created now would not match an account when the template is "instantiated" into a particular instance.&lt;br /&gt;&lt;br /&gt;At this point, I added the additional software packages requested to be on the server, including NUnit and BizUnit.&lt;br /&gt;&lt;br /&gt;The next step includes installing first, Windows SharePoint Services (WSS) 3.0, and then WSS 2.0. Both versions were installed because the BAM portal in BTS 2006 is only supported on WSS 2.0, but most project work moving forward will likely be done on WSS 3.0. Thus, if you want to have the BAM portal on the same box that you have a WSS 3.0 site (or MOSS 2007 site), you need to have both versions of SharePoint installed. Note that after the installation is completed, the instructions indicate that configuration is next. Because user accounts are involved in the create of Application Pools when using WSS on IIS, this step was "postponed" until a particular instance was created.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The last software package installed was BizTalk Server 2006 R2 itself. I went through all the steps and did all the installation, but on the last screen, where the checkbox indicating that the configuration wizard should run after setup is completed, I unchecked this so that it could be done on a per instance basis.&lt;br /&gt;&lt;br /&gt;After everything was done, I defragmented the hard drive, ran the pre-compaction utility, and then compacted the drive. This allowed for a smaller VHD for import and cleaned up a lot of space in the VHD after all the updates had been made.&lt;/span&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2300327769950983918?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2300327769950983918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2300327769950983918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2300327769950983918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2300327769950983918'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/creating-biztalk-2006-r2-vpc-template.html' title='Creating a BizTalk 2006 R2 VPC Template for Use in MS System Center Virtual Machine Manager'/><author><name>Michael Schnell</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8025880780627424909</id><published>2008-08-29T07:21:00.003-05:00</published><updated>2008-08-29T07:44:07.170-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='External Assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Extension Xml'/><category scheme='http://www.blogger.com/atom/ns#' term='Mapping'/><title type='text'>Mapping With External Assemblies Part 2</title><content type='html'>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;Part 1 - Inline scripting and external assemblies     &lt;br /&gt;&lt;strong&gt;Part 2 - XSLT Call Templates and custom extensions&lt;/strong&gt;     &lt;br /&gt;Part 3 - Cascading Functoids     &lt;br /&gt;    &lt;br /&gt;This is the second of three articles about BizTalk mapping with external assemblies. External assemblies or helper classes are used by BizTalk's mapping engine (XSLT) automatically, and they can also be used explicitly by the developer. Just as in an orchestration, a developer may find a requirement that the built in mapping tools (&amp;quot;functoids&amp;quot;) do not address and in this case judicious use of a helper class can be very... helpful.     &lt;br /&gt;    &lt;br /&gt;While these articles are not an introduction to mapping if you have a little experience with the BizTalk mapper and a little experience with XSLT you should be able to follow along.     &lt;br /&gt;    &lt;br /&gt;Part 1, introduces inline C# scripting, its limitations, and also introduces the scenario of using an external assembly (helper class) automatically. Part 2, this article, demonstrates using a map's custom extension property, which allows us to explicitly access external assemblies. Part 3 will build on this discussion and highlight potential caveats about using cascading functoids; when the output of one functoid&amp;#160; is the input to another functoid(s).     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;External Assembly Script Type Review      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;In part 1 we examined inline scripting with C# and pointed out that only the built-in XSLT engine namespaces can be used. We also showed that when using an External Assembly Script Type an Extension Object XML file is automatically created, which contains the external assembly references that the XSL will use.     &lt;br /&gt;    &lt;br /&gt;The contents of the Extension Object Xml file that is made during the build looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;ExtensionObjects&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;ExtensionObject          &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;Namespace&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;http://schemas.microsoft.com/BizTalk/2003/ScriptNS0&lt;/span&gt;&amp;quot;           &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;RDA.BizTalk.Learning.MapUtility,            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Version=1.0.0.0,             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Culture=neutral,             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;PublicKeyToken=f7eb52812c0b3fa1&lt;/span&gt;&amp;quot;           &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;ClassName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RDA.BizTalk.Learning.MapUtility.Strings&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ExtensionObjects&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Custom Extension Xml Property      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="image" src="http://lh4.ggpht.com/evan.aussenberg/SLfpraW3AhI/AAAAAAAAAL0/kyF6KdzGHLo/image%5B7%5D.png" width="272" align="right" border="0" /&gt;If we want to explicitly include external assemblies in our map we can assign the &amp;quot;&lt;strong&gt;Custom Extension Xml&lt;/strong&gt;&amp;quot; Grid Property. Click on the background (grid) of your map in design mode to find the properties. The property represents an Xml file that is formatted as shown above, and it will contain only those assemblies that you wish to manually reference. As we will see, other assemblies referenced by External Assembly Script Types will be automatically appended to this file during the build.     &lt;br /&gt;    &lt;br /&gt;I normally name my file &amp;quot;External Assemblies.xml&amp;quot;. The following is an example. I usually leave the Namespace as the Namespace of the &lt;u&gt;class&lt;/u&gt;.&amp;#160; That way if I have one assembly (as I do below) I will have 2 unique namespaces. Remember, your external assemblies are probably already in the GAC.&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;font face="Courier New"&gt;ExtensionObjects&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;ExtensionObject        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;Namespace&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;http://RDA.Corporate.EAI.Common.Helper.Methods.Timestamps&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;RDA.Corporate.EAI.Common.Helper.Methods,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;Version=1.0.0.0,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Culture=neutral,           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PublicKeyToken=9f177c4f1a417459&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;ClassName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RDA.Corporate.EAI.Common.Helper.Methods.Timestamps&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;/&amp;gt;          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="color: #a31515"&gt;ExtensionObject          &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;Namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://RDA.Corporate.EAI.Common.Helper.Methods.DBUtility&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;RDA.Corporate.EAI.Common.Helper.Methods,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Version=1.0.0.0,           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Culture=neutral,           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PublicKeyToken=9f177c4f1a417459&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;ClassName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RDA.Corporate.EAI.Common.Helper.Methods.DBUtility&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;      &lt;br /&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" AR-SA?="AR-SA?"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ExtensionObjects&lt;/span&gt;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;&amp;gt;&lt;/font&gt;         &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;strong&gt;Using the Referenced External Assemblies      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;We already know that unfortunately we cannot use these classes with inline C# scripting. However, we also know that ultimately the mapper is simply creating XSLT and calling the C# methods, and we can do the same.     &lt;br /&gt;    &lt;br /&gt;Let's pretend, for example, that based on a meeting number, room number and timestamp that I need to retrieve a meeting record id. My DBUtility class contains the methods I need to use.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add a reference for the &lt;span style="color: blue"&gt;RDA.Corporate.EAI.Common.Helper.Methods&lt;/span&gt; assembly. &lt;/li&gt;    &lt;li&gt;Create and add External Assemblies.xml file (named to your liking) to your map project. &lt;/li&gt;    &lt;li&gt;Assign the Custom Extension XML Grid Property. &lt;/li&gt;    &lt;li&gt;Add a scriptoid to your map. &lt;/li&gt;    &lt;li&gt;Set it's script type to XSLT Call Template. &lt;/li&gt;    &lt;li&gt;Assign input parameters, and assign the output to the target schema node as required. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here is my map, I'm going to enrich the original message by filling in the MeetingKey record. I'll be using an XSLT call template. Remember it is the XSLT that is driving the mapping within the scriptoid. See the next paragraph.&lt;/p&gt;  &lt;p align="center"&gt;   &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="296" alt="image" src="http://lh5.ggpht.com/evan.aussenberg/SLfprXXI2BI/AAAAAAAAAL4/_C45F5fCvbc/image%5B13%5D.png" width="421" border="0" /&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Here is my XSLT call template that I've assigned to my scriptoid shown above.     &lt;br /&gt;&lt;span style="font-size: 8pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: #a31515"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;span style="color: #a31515"&gt;x&lt;/span&gt;&lt;/span&gt;sl:template&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;span style="color: blue"&gt;=&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;MeetingKeyCallTemplate&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt;Meeting Key Input &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:param&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;meetingNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:param&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;roomNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:param&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;meetingTimestamp&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Get the meeting key and assign it to variable &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;--&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;meetingKey&lt;/span&gt;&amp;quot;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; I'll just use the prefix &amp;quot;script&amp;quot; which is easy to type &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font face="Courier New" size="2"&gt;&amp;#160; &lt;br /&gt;&lt;span style="color: red"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:&lt;strong&gt;script&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://RDA.Corporate.EAI.Common.Helper.Methods.DBUtility&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Call my external method GetMeetingKey() &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;script&lt;/strong&gt;:GetMeetingKey($meetingNumber,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $meetingTimestampDateTime,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $roomNumber)&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;/&amp;gt;&amp;#160; &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Emit the MeetingKey and modified attribute values &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;span style="color: blue"&gt;--&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MeetingKey&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;modified&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Yes&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:attribute&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;id&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$meetingKey&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MeetingKey&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;         &lt;br /&gt;&lt;font face="Courier New" size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;!--&lt;/font&gt;&lt;/span&gt;&lt;span style="color: green"&gt;&lt;font face="Courier New" size="2"&gt; Emit the MeetingNumber, RoomNumber and MeetingLeader fields &lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New" size="2"&gt;&lt;span style="color: blue"&gt;--&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MeetingInfo&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MeetingNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$meetingNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RoomNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$roomNumber&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;span style="color: blue"&gt;&amp;gt;          &lt;br /&gt;          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Note: The MeetingLeader value comes directly from the original message&amp;#160; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;span style="color: blue"&gt;--&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" en-us;="EN-US;" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" mso-fareast-theme-font:="mso-fareast-theme-font:" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ?Trebuchet="?Trebuchet" MS?;="MS?;" minor-latin;="minor-latin;" AR-SA;="AR-SA;" mso-bidi-font-size:="mso-bidi-font-size:" 10.0pt?="10.0pt?"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MeetingLeader&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MeetingInfo/MeetingLeader/text()&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;/&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:element&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MeetingInfo&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;strong&gt;TIP&lt;/strong&gt;: In part 3 we'll see similar code again and we will combine into one example the use of external assemblies, inline C# scripting and value caching in a discussion about cascading functoids.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Custom Extension XML and External Assembly Script Types&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;The BizTalk mapper will accommodate maps using both custom Extension XML file as described here and also uses External Assembly Script Types. In this case the Extension Object XML file that is used will combine your custom references along with the automatically added External Assembly Script Type references. Validate your map and check it out!     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547368.aspx"&gt;Custom Extension XML (Grid Property)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547251.aspx"&gt;Scripting Using External Assemblies&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561456.aspx"&gt;Scripting Using Inline C#, JScript .NET, and Visual Basic .NET&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561574.aspx"&gt;Scripting Using Inline XSLT and XSLT Call Templates&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa560433.aspx"&gt;Extending Mapper (BizTalk Server Sample)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;External Links about BizTalk Mapper Performance&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.bizbert.com/bizbert/2008/02/26/Understanding+The+BizTalk+Mapper+Part+12+Performance+And+Maintainability.aspx"&gt;Understanding the BizTalk Mapper - Performance and Maintainability&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8025880780627424909?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8025880780627424909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8025880780627424909' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8025880780627424909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8025880780627424909'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-2.html' title='Mapping With External Assemblies Part 2'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/evan.aussenberg/SLfpraW3AhI/AAAAAAAAAL0/kyF6KdzGHLo/s72-c/image%5B7%5D.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-5831027544656274322</id><published>2008-08-29T05:18:00.003-05:00</published><updated>2008-08-29T07:35:25.388-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='External Assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom Extension Xml'/><category scheme='http://www.blogger.com/atom/ns#' term='Mapping'/><title type='text'>Mapping With External Assemblies Part 1</title><content type='html'>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Part 1 - Inline scripting and external assemblies&lt;/strong&gt;     &lt;br /&gt;Part 2 - XSLT Call Templates and custom extensions     &lt;br /&gt;Part 3 - Cascading Functoids     &lt;br /&gt;    &lt;br /&gt;This is the first of three articles about BizTalk mapping with external assemblies. External assemblies or helper classes are used by BizTalk's mapping engine (XSLT) automatically, and they can also be used explicitly by the developer. Just as in an orchestration, a developer may find a requirement that the built in mapping tools (&amp;quot;functoids&amp;quot;) do not address and in this case judicious use of a helper class can be very... helpful.     &lt;br /&gt;    &lt;br /&gt;While these articles are not an introduction to mapping if you have a little experience with the BizTalk mapper and a little experience with XSLT you should be able to follow along.     &lt;br /&gt;    &lt;br /&gt;Part 1, this article, introduces inline C# scripting, its limitations, and also introduces the scenario of using an external assembly (helper class) automatically. Part 2 demonstrates using a map's custom extension property, which allows us to explicitly access external assemblies. Part 3 will build on this discussion and highlight potential caveats about using cascading functoids; when the output of one functoid&amp;#160; is the input to another functoid(s).     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Inline Scripting with C#&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;As you probably know, using C# within a map is very easy to do. Drag the scripting functoid to the map:&lt;/p&gt;  &lt;p align="center"&gt;   &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="182" alt="From Toolbox to Design Window" src="http://lh5.ggpht.com/evan.aussenberg/SLfM132q93I/AAAAAAAAAK0/8SHFwVRDvVs/FromToolboxtoDesignWindow19.png" width="502" border="0" /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/p&gt;  &lt;p align="left"&gt;Right click on the scripting functoid and add your C# code: &lt;/p&gt;  &lt;p align="center"&gt;   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/evan.aussenberg/SLfM2JAjdMI/AAAAAAAAAK4/rSIhO068QMk/FromFuntoidMenutoScriptDialog10.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="449" alt="From Funtoid Menu to Script Dialog" src="http://lh6.ggpht.com/evan.aussenberg/SLfM2EBKQUI/AAAAAAAAAK8/ibIV52Plb3k/FromFuntoidMenutoScriptDialog_thumb5.png" width="575" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: In a previously saved map, if you switch between Script Types be sure to click the Reset button first, otherwise old settings (including C# code!) will stick around and the Script Type property won't necessarily change even though there is no warning.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="100%" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;         &lt;p align="left"&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can display friendly names for your input parameters if you set the Label property for each link.&amp;#160; View the link properties by clicking each link (line) in the map.&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top"&gt;         &lt;p align="center"&gt;Unlabeled Links            &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="113" alt="Configure Functoid Inputs 1" src="http://lh4.ggpht.com/evan.aussenberg/SLfM2VrfcjI/AAAAAAAAALA/1L8QImV9txY/ConfigureFunctoidInputs116.png" width="395" border="0" /&gt;&amp;#160;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;         &lt;p align="center"&gt;Label Property            &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="126" alt="Link Properties" src="http://lh4.ggpht.com/evan.aussenberg/SLfM2j2CfUI/AAAAAAAAALE/U69qf5YDoko/LinkProperty17.png" width="236" border="0" /&gt; &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top"&gt;         &lt;p align="center"&gt;Labeled Links            &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="125" alt="Configure Functoid Inputs 2" src="http://lh5.ggpht.com/evan.aussenberg/SLfM2qbrmwI/AAAAAAAAALI/hZDpu0c92Sk/ConfigureFunctoidInputs211.png" width="403" border="0" /&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;Limitations of Inline Scripting      &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="161" alt="Validate Map" src="http://lh6.ggpht.com/evan.aussenberg/SLfsmL82jII/AAAAAAAAAMI/zNPCnlY8J0k/image19.png" width="183" align="left" border="0" /&gt; Once the map is completed we can validate it and view the generated XSL file. I encourage you to create a simple map, validate it, then look at the resulting XSL file... even if you know only a smattering of XSLT you can gain lots of insight into how the actual mapping is working (or not!).     &lt;br /&gt;    &lt;br /&gt;If we look at the XSL file from the map above we discover that the BTS Mapper puts all of our inline C# code into a CDATA section. There is a screenshot below. Then within an XSLT statement our C# method is called. This is actually the key to the whole series of articles! In this case the BTS Mapper designed the XSLT &lt;em&gt;extended&lt;/em&gt; syntax for us, but as you will find out in part 2 we can do it for ourselves!     &lt;br /&gt;    &lt;br /&gt;So, why would we ever want to do manually what the BTS Mapper can do for us automatically? Well, if you reflect on the above paragraph you'll notice that our C# method is called from an XSLT statement. To highlight this point, below are the snippets from the XSL of our map: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;This section is how the XSL inline C# is automatically defined within a CDATA section. Noticed the prefix &amp;quot;&lt;font color="#0000ff"&gt;userCSharp&lt;/font&gt;&amp;quot; as in the future this will come in handy.&lt;/em&gt;       &lt;br /&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;msxsl:script&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;language&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;C#&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;implements-prefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;&amp;gt;&amp;lt;![CDATA[            &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="color: gray"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;public string MyInlineSortKey(string str1, string str2)             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;const string comma = &amp;quot;,&amp;quot;;             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;return String.Concat(str1, comma, str2);             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}             &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;]]&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;msxsl:script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;em&gt;Here is the actual XSLT that is generated. A variable named &amp;quot;v1&amp;quot; is created and our method is called by passing the XPATH values of LastName and FirstName. The actual use of the C# method is very straight forward.&lt;/em&gt;&lt;/p&gt;   &lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: #2b91af; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;xsl:variable&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;name&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;=&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: &amp;#39;Courier New&amp;#39;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-fareast-theme-font: minor-fareast; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v1&lt;/span&gt;&amp;quot;       &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp&lt;/strong&gt;:MyInlineSortKey(string(Customer/LastName/text()),         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;string(Customer/FirstName/text()))&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; /&amp;gt;        &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:v1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; /&amp;gt;        &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;  &lt;p&gt;To come back to the question, why would we want to implement a call to a helper class manually? It's because there are limitations to what you can do with inline C#. Specifically, inline C# that looks like the following will not compile even if the MyMapUtility reference was added to the map project.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&lt;font color="#000000"&gt;MyMapUtility.Strings stringUtil;&lt;/font&gt;           &lt;br /&gt;return&lt;/font&gt; stringUtil.MySortKey(str1, str2);&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;From MSDN (references at end):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;BizTalk saves inline scripts in the Extensible Stylesheet Language Transformations (XSLT) stylesheet defining the map. Because of this, inline scripts may use the same namespaces as any other XSLT stylesheet script.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What this means is that even if you add the helper class reference to your map project, you will not be able to call your methods with inline scripting and the map project will not compile. Part 2 will cover how this can be accomplished using XSLT call templates. Here are the namespaces that are supported for inline scripting, so remember with inline C# scripting you can use these namespaces but no other:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div&gt;     &lt;div align="center"&gt;Supported namespaces for inline scripting&lt;/div&gt;      &lt;table cellspacing="0" cellpadding="2" align="center" border="1"&gt;&lt;tbody&gt;         &lt;tr bgcolor="#0080ff"&gt;           &lt;td valign="top"&gt;&lt;strong&gt;&lt;font color="#ffffff"&gt;Namespace&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;            &lt;td valign="top"&gt;&lt;strong&gt;&lt;font color="#ffffff"&gt;Description&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System&lt;/td&gt;            &lt;td valign="top"&gt;The System class&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Collection&lt;/td&gt;            &lt;td valign="top"&gt;The collection classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Text&lt;/td&gt;            &lt;td valign="top"&gt;The text classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Text.RegularExpressions&lt;/td&gt;            &lt;td valign="top"&gt;The regular expression classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Xml&lt;/td&gt;            &lt;td valign="top"&gt;The core XML classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Xml.Xsl&lt;/td&gt;            &lt;td valign="top"&gt;The XSLT classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;System.Xml.Xpath&lt;/td&gt;            &lt;td valign="top"&gt;The XPath classes&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top"&gt;Microsoft.VisualBasic&lt;/td&gt;            &lt;td valign="top"&gt;The Visual Basic script classes.&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;External Assembly Script Types      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="139" alt="Script Type External Assembly" src="http://lh3.ggpht.com/evan.aussenberg/SLfM2x1UWfI/AAAAAAAAALQ/79MsHI4iBpM/ScriptTypeExternalAssembly8.png" width="211" align="left" border="0" /&gt;As we've examined, inline C# scripting only supports a certain set of namespaces. And in part 2 we'll look at custom XSLT templates that let use use any external assembly. However, there is functionality out of the box that the BTS mapper provides for using External Assemblies.     &lt;br /&gt;    &lt;br /&gt;The main caveat is that the default constructor (parameterless) on the external class will be used. In some cases you may find yourself wanting to create a wrapper class created especially for mapping that handles a custom initialization of the actual helper class.     &lt;br /&gt;    &lt;br /&gt;Knowing how the External Assembly and method call is incorporated into the map will help us in part 2 when we describe manually using an external assembly.     &lt;br /&gt;    &lt;br /&gt;Here is a example helper class that is designed to return two strings separated by a comma. After creating the helper class add its reference to the Map project.&lt;/p&gt;  &lt;blockquote&gt;&lt;em&gt;Typical helper class. This method will take two inputs and return a value:      &lt;br /&gt;&lt;/em&gt;    &lt;br /&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;namespace&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt; RDA.BizTalk.Learning.MapUtility        &lt;br /&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: green"&gt; String Utilities          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;Serializable&lt;/span&gt;]         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: #2b91af"&gt;Strings          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: green"&gt;// A custom sort key          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: green"&gt;//          &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; MySortKey(&lt;span style="color: blue"&gt;string&lt;/span&gt; str1, &lt;span style="color: blue"&gt;string&lt;/span&gt; str2)         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; comma = &lt;span style="color: #a31515"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;;         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Concat(str1, comma, str2);         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;}&lt;/font&gt;&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;em&gt;Assign the External Assembly to your scriptoid and pick your class method:      &lt;br /&gt;&lt;/em&gt;&lt;strong&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="327" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SLfM3H1SqPI/AAAAAAAAALU/3K_ZxKVegGs/image16.png" width="504" border="0" /&gt;       &lt;br /&gt;TIP:&lt;/strong&gt; If you right click and &amp;quot;Test&amp;quot; a map that uses an external assembly, the assembly must already be added to the GAC, otherwise the test will fail.&lt;/blockquote&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="153" alt="Validate Map" src="http://lh6.ggpht.com/evan.aussenberg/SLfsmL82jII/AAAAAAAAAMI/zNPCnlY8J0k/image19.png" width="175" align="right" border="0" /&gt;Now let's examine what the mapper does with the external assembly to call it. We can do this by right clicking the map and picking &amp;quot;Validate&amp;quot;. The output of the validation process is the XSL file and an Extension Object XML file.     &lt;br /&gt;    &lt;br /&gt;The Extension Object XML file was created automatically based on all the external assemblies used in the map (in this case, just one). It contains the assembly reference that the XSL will use. It looks like the following:&lt;/p&gt;  &lt;blockquote&gt;&lt;em&gt;Extension Object XML:      &lt;br /&gt;&lt;/em&gt;    &lt;br /&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;ExtensionObjects&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #a31515; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;ExtensionObject        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;Namespace&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;http://schemas.microsoft.com/BizTalk/2003/ScriptNS0&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;RDA.BizTalk.Learning.MapUtility,          &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Version=1.0.0.0,           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Culture=neutral,           &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;PublicKeyToken=f7eb52812c0b3fa1&lt;/span&gt;&amp;quot;         &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;ClassName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RDA.BizTalk.Learning.MapUtility.Strings&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;          &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ExtensionObjects&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, let's examine the XSL file. It turns out that the use of the external assembly will look almost exactly like how the inline C# code was called. The only difference is that in this case in the header of the XSL file a namespace alias is created for &amp;quot;&lt;font color="#0000ff"&gt;ScriptNS0&lt;/font&gt;&amp;quot;. I encourage you to validate your own simple map that uses an external assembly.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;External Assembly XSLT:        &lt;br /&gt;&lt;/em&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #2b91af; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;xsl:variable&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;name&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v1&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;ScriptNS0&lt;/strong&gt;:MySortKey(string(Customer/LastName/text()),             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;string(Customer/FirstName/text()))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:v1&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;&amp;gt;&lt;/font&gt;           &lt;br /&gt;          &lt;br style="mso-special-character: line-break" /&gt;&lt;/span&gt;&lt;/span&gt;      &lt;br /&gt;&lt;em&gt;The inline C# code XST from the previous section for comparison:&lt;/em&gt;       &lt;br /&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 10pt; color: #2b91af; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;xsl:variable&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; color: red; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;name&lt;/span&gt;&lt;span style="font-size: 10pt; color: blue; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-fareast;="minor-fareast;" mso-fareast-theme-font:="mso-fareast-theme-font:" Roman?;="Roman?;" New="New" ?Times="?Times" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" courier="courier" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;&lt;font face="Courier New"&gt;&amp;quot;&lt;span style="color: blue"&gt;var:v1&lt;/span&gt;&amp;quot;           &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;userCSharp&lt;/strong&gt;:MyInlineSortKey(string(Customer/LastName/text()),             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;string(Customer/FirstName/text()))&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt;&amp;gt;            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;select&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;$var:v1&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="color: blue"&gt; /&amp;gt;            &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SortKey&lt;/span&gt;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font face="Courier New"&gt;&amp;gt;&lt;/font&gt;           &lt;br style="mso-special-character: line-break" /&gt;          &lt;br style="mso-special-character: line-break" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;TIP:&lt;/strong&gt; The &amp;quot;&lt;strong&gt;&lt;font color="#0000ff"&gt;userCSharp&lt;/font&gt;&lt;/strong&gt;&amp;quot; prefix is used for all of your inline methods. If you have your own inline XSLT transformations you can call previously defined inline C# methods yourself!     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Though not necessarily a best practice it is possible to create a &amp;quot;floating&amp;quot; scriptoid (not connected to anything!) that just contains a few methods (yes, more than one) that you will call elsewhere in the map. You can call them from custom XSLT, and you can also call them from inline C#! In this manner you could have a GET and SET method to cache calculated values that are valid during the execution of the map.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;TIP&lt;/strong&gt;: A scriptoid must have a least one output to the target schema in order to be executed by the XSLT map. Otherwise, the map will still compile however the scriptoid will not execute.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547251.aspx"&gt;Scripting Using External Assemblies&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561456.aspx"&gt;Scripting Using Inline C#, JScript .NET, and Visual Basic .NET&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa561574.aspx"&gt;Scripting Using Inline XSLT and XSLT Call Templates&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa560433.aspx"&gt;Extending Mapper (BizTalk Server Sample)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;External Links about BizTalk Mapper Performance&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.bizbert.com/bizbert/2008/02/26/Understanding+The+BizTalk+Mapper+Part+12+Performance+And+Maintainability.aspx"&gt;Understanding the BizTalk Mapper - Performance and Maintainability&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5831027544656274322?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5831027544656274322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5831027544656274322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5831027544656274322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5831027544656274322'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/mapping-with-external-assemblies-part-1.html' title='Mapping With External Assemblies Part 1'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/evan.aussenberg/SLfM132q93I/AAAAAAAAAK0/8SHFwVRDvVs/s72-c/FromToolboxtoDesignWindow19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7849810505288587055</id><published>2008-08-18T15:24:00.000-05:00</published><updated>2008-08-18T15:44:55.308-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Tracking'/><title type='text'>BizTalk Tracking Advantages</title><content type='html'>&lt;p&gt;BizTalk allows tracking to be configured at receive, send port and orchestration levels to monitor transaction activity, flow and to access message contents. As long as tracking is enabled at least on one host, all tracked transactions will use that host for tracking (by default, BizTalkServerApplication host is designated for tracking). So it’s not necessary that a tracking host be assigned in a specific application to receive, send ports and orchestrations. Reason being, a message agent that is running within each BizTalk host will be calling a stored procedure that searches through each of the messages in the Messagebox looking for messages with matching subscription information. To keep the Messagebox as empty as possible, the tracking subsystem will move completed messages to the Tracking Database on a periodic basis. The Tracking Database is where the HAT queries for data and displays its tracking information. This is accomplished by a BizTalk host that has been tagged as a “tracking” host.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For most BizTalk customers, tracking data is very important for the following reasons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;To comply with federal guidelines Sarbane-oxley, IRS and such&lt;/li&gt;&lt;li&gt;To satisfy accounting department requirements to generate reports for business users, for example using BAM tracking&lt;/li&gt;&lt;li&gt;In the case of failures and such, to help recover from a disaster, because it is a record of data processing activity&lt;/li&gt;&lt;li&gt;Data in the tracking databases can be used to help determine the state of the system up to the point of failure for the runtime databases&lt;/li&gt;&lt;li&gt;Tracked messages and events can indicate what processes may have already happened and what messages have been received or sent&lt;/li&gt;&lt;li&gt;Tracks the health and run history of BizTalk messages and orchestration processes and aids in identifying errors and bottlenecks in the BizTalk Server environment&lt;/li&gt;&lt;li&gt;Individual tracking information per message can correlate what types of transactions are taking the most time&lt;/li&gt;&lt;li&gt;To view the technical details of a particular orchestration, pipeline, or message instance, as well as to see the message flow of a particular message from end to end&lt;/li&gt;&lt;li&gt;Tracking facilitates troubleshooting of service instances and messages&lt;/li&gt;&lt;li&gt;It provides debugging capabilities, allowing breakpoints to be set on orchestration shapes&lt;/li&gt;&lt;li&gt;Business users can view, monitor, and query completed messages and processes via tracked data, saving these queries as custom views for reuse&lt;/li&gt;&lt;li&gt;Business analysts and end users can track the state of their business processes by viewing both live and archived data&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;em&gt;Reference: Apress Pro BizTalk 2006 book&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7849810505288587055?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7849810505288587055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7849810505288587055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7849810505288587055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7849810505288587055'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/biztalk-tracking-advantages.html' title='BizTalk Tracking Advantages'/><author><name>Harish Bidadi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-5487116715440237949</id><published>2008-08-11T11:07:00.002-05:00</published><updated>2008-08-11T11:48:44.216-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='bottleneck'/><title type='text'>BizTalk performance issues</title><content type='html'>&lt;p&gt;Recently one of our customer experienced performance issues with BizTalk, where transaction queues were filling up and it was taking too much time to process normal transaction activity. So I went onsite, checked the obvious, found two familiar performance related issues...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issue 1:&lt;/strong&gt;Verfied built in SQL jobs history, found that DTA Purge and Archive (BizTalkDTADb) has not run on the production BizTalk server since September 2007. BizTalk tracking data file was about 1.6GB, obviously, which results in performance degradation. &lt;strong&gt;Analysis:&lt;/strong&gt; DTA Purge and Archive SQL job is expected to run every day (24 X 7) about 15-20 minutes apart. As time goes, the BizTalkDTADb database will grow in size and unchecked growth will result in poor performance. Possibly having an adverse impact on message box database performance as well...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Resolution:&lt;/strong&gt; Followed the steps detailed in this MSDN article:&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/library/aa560754.aspx"&gt;http://technet.microsoft.com/en-us/library/aa560754.aspx&lt;/a&gt;&lt;br /&gt;exec dtasp_BackupAndPurgeTrackingDatabase&lt;br /&gt;0, --@nLiveHours,&lt;br /&gt;30, --@nLiveDays&lt;br /&gt;35, --@nHardDeleteDays&lt;br /&gt;‘\\D:\SQL backup’, --@nvcFolder&lt;br /&gt;null, --@nvcValidatingServer&lt;br /&gt;0 --@fForceBackup Soft purge process&lt;br /&gt;After performing the steps above (once the tracking data is purged) "DTA Purge and Archive (BizTalkDTADb)", set the SQL Job is enabled and is running at every 20 minutes. Database size came down to 30 MB from 1.6 GB!&lt;br /&gt;To Understand DTA Tracking performance behavior, refer to these MSDN article:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc296718.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc296718.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Issue 2:&lt;/strong&gt; There were three BizTalk hosts in the production environment including the default BizTalk host instance and other two being txHost1 and txHost2. All the three host instances had tracking turned on.&lt;br /&gt;&lt;strong&gt;Analysis: &lt;/strong&gt;According to BizTalk documentation, "Allow host tracking" check box must be enabled on a single host instance and ideally on the default in-process BizTalk Application Host. "Allow host tracking" should not be enabled on any other Host instances.&lt;br /&gt;&lt;strong&gt;Resolution:&lt;/strong&gt; Removed tracking from txHost1 and txHost2 hosts, kept it unchanged on the BizTalk Application Host and restarted all the three hosts.&lt;br /&gt;Creayed and configured three new host instances such as orchHost for all orchestrations, rcvHost for all receive locations and sndHost for all send ports. Tested on the QA server with 1577 transactions, it took about 17 minutes to process all transactions, thus processed about 100 transactions a minute, improving the performance significantly...&lt;/p&gt;&lt;p&gt;For more info on tracking host: &lt;a href="http://msdn.microsoft.com/en-us/library/cc296878.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc296878.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5487116715440237949?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5487116715440237949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5487116715440237949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5487116715440237949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5487116715440237949'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/biztalk-performance-issues.html' title='BizTalk performance issues'/><author><name>Harish Bidadi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8703674225546130272</id><published>2008-08-04T15:32:00.005-05:00</published><updated>2008-12-10T17:08:33.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Service'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><title type='text'>Consuming a Java Web Service (JWS) Method Containing String Arrays as Parameters</title><content type='html'>&lt;p&gt;&lt;strong&gt;Consuming a Java Web Service (JWS) Method Containing String Arrays as Parameters &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Recently I was working on a POC where one of the tasks was integrating with a Quality Control application that exposed a web service built with Java. The application used a JWS to expose web service methods that were RPC encoded. BizTalk Server 2006 and Visual Studio 2005 natively recognized and imported the JWS WSDL and generated a multi-part message in the BizTalk project.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Early in the POC, consuming, connecting and executing the process were demonstrated using a JWS method called, Sample Log. There was no issues importing the JWS WSDL but the challenge was populating the message since it used string arrays for parameter names and values.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Multi-part Message Types&lt;br /&gt;&lt;/strong&gt;The multi-part message type generated by importing the SampleLog WSDL are the last &lt;em&gt;invoke_request&lt;/em&gt; and &lt;em&gt;invoke_response&lt;/em&gt; in the figure below. We will take a closer look at the invoke_&lt;em&gt;request&lt;/em&gt; message because the &lt;em&gt;fieldsArrayC&lt;/em&gt; and &lt;em&gt;valuesArray&lt;/em&gt; C items for the invoke_&lt;em&gt;request&lt;/em&gt; message are actually string arrays. This message structure presents a challenge for BizTalk because although this message type was successfully generated in BizTalk, it was not available for use within the Mapper. &lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_jNHcgrSaunQ/SJdoE1nFAAI/AAAAAAAAAEE/wpY3ETOdYpU/s1600-h/Message.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230763924533870594" style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_jNHcgrSaunQ/SJdoE1nFAAI/AAAAAAAAAEE/wpY3ETOdYpU/s320/Message.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Using and populating the message structure&lt;/strong&gt;&lt;br /&gt;In order to use and populate the mutli-part message in BizTalk, 3 three messages needed to be defined to get around the limitations of the mapper.&lt;br /&gt;These are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;msgLIMSSampleLogRequest&lt;/em&gt; - Message that will be sent to the JWS. &lt;/li&gt;&lt;li&gt;&lt;em&gt;msgLogSampleReferenceNameArray&lt;/em&gt; – An array that contains the names of the parameters passed. This message structure will be added to the &lt;em&gt;msgLIMSSampleLogRequest&lt;/em&gt; message.&lt;/li&gt;&lt;li&gt;&lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt; – An array that contains the values of the parameters passed. This message structure will be added to the &lt;em&gt;msgLIMSSampleLogRequest&lt;/em&gt; message.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create Message Variables &lt;/strong&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_jNHcgrSaunQ/SJdqBf9gl5I/AAAAAAAAAEM/-_XJ7GyzakM/s1600-h/CreateMessage.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230766066206021522" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_jNHcgrSaunQ/SJdqBf9gl5I/AAAAAAAAAEM/-_XJ7GyzakM/s320/CreateMessage.png" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Orchestration Snippet&lt;br /&gt;&lt;/strong&gt;Because we can’t use the mapper, an orchestration must be used. In the orchestration, the &lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt; and &lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt; needed to be populated using the following code in the Expression Shape of the orchestration.&lt;/p&gt;&lt;p&gt;Once &lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt; and &lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt; messages were populated, they could be assigned to the &lt;em&gt;msgLIMSSampleLogRequest&lt;/em&gt; message as described in the next section.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NOTE: This code is for demonstration purposes only. An actual implementation would use a component or other solution to populate the array depending on the requirements.&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;System.Diagnostics.Debug.WriteLine(System.String.Format("{0}{1}: {2}", strInterfaceName, "BuildReferenceArrays", ""));&lt;br /&gt;&lt;br /&gt;//Format and Populate ReferenceName&lt;br /&gt;strParameters = System.String.Format("{0},{1},{2},{3},{4},{5},{6},{7}", "LOT", "LOT_NAME", "PRODUCT_GRADE", "DESCRIPTION", "ROLL", "SAMPLING_POINT", "SPEC_TYPE", "GROUP_NAME");&lt;br /&gt;System.Diagnostics.Debug.WriteLine(System.String.Format("{0}{1}: {2}", "strParameters", "strParameters", strParameters));&lt;br /&gt;&lt;br /&gt;objXmlDoc1 = new System.Xml.XmlDocument();&lt;br /&gt;objXmlDoc1.LoadXml&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;(@"&lt;br /&gt;&lt;?xml:namespace prefix = ns0 /&gt;&lt;ns0:arrayofstring ns0=""&gt;&lt;br /&gt;&lt;ns0:string&gt;LOT&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;LOT_NAME&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;PRODUCT_GRADE&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;DESCRIPTION&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;ROLL&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;SAMPLING_POINT&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;SPEC_TYPE&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;GROUP_NAME&lt;/ns0:string&gt;&lt;br /&gt;&lt;/ns0:arrayofstring&gt;&lt;br /&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;msgLogSampleReferenceNameArray = objXmlDoc1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;System.Diagnostics.Debug.WriteLine(System.String.Format("{0}{1}: {2}", strInterfaceName, "ReferenceNameArray", objXmlDoc1.InnerXml));&lt;br /&gt;&lt;br /&gt;//Format and Populate ReferenceValue&lt;br /&gt;strParameters = System.String.Format("{0},{1},{2},{3},{4},{5},{6},{7}", "89210", "1000222", "40786351", "S 901/ERL 1908 HM", "001", "6351ANYL", "SP_1", "WINONA");&lt;br /&gt;&lt;br /&gt;objXmlDoc2 = new System.Xml.XmlDocument();&lt;br /&gt;objXmlDoc2.LoadXml&lt;br /&gt;(&lt;span style="color:#3333ff;"&gt;@"&lt;br /&gt;&lt;ns0:arrayofstring ns0=""&gt;&lt;br /&gt;&lt;ns0:string&gt;89210&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;1000222&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;40786351&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;S 901/ERL 1908 HM&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;001&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;6351ANYL&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;SP_1&lt;/ns0:string&gt;&lt;br /&gt;&lt;ns0:string&gt;WINONA&lt;/ns0:string&gt;&lt;br /&gt;&lt;/ns0:arrayofstring&gt;&lt;br /&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;msgLogSampleReferenceValueArray = objXmlDoc2;&lt;br /&gt;&lt;br /&gt;System.Diagnostics.Debug.WriteLine(System.String.Format("{0}{1}: {2}", strInterfaceName, "ReferenceValueArray", objXmlDoc1.InnerXml));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Populate Main Message (LogRequest)&lt;/strong&gt;&lt;br /&gt;The final step is to populate the &lt;em&gt;msgLIMSSampleLogRequest&lt;/em&gt; message in an Expression shape. Within the Expression shape the &lt;em&gt;fieldsArrayC&lt;/em&gt; element is loaded with the &lt;em&gt;msgLogSampleReferenceNameArray&lt;/em&gt; and the &lt;em&gt;valuesArrayC&lt;/em&gt; element is loaded with the &lt;em&gt;msgLogSampleReferenceValueArray&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;The following is the code snippet that loads the message. The highlighted rows are where the string arrays from the previous step are actually loaded into the main message.&lt;br /&gt;&lt;br /&gt;msgLIMSSampleLogRequest.authToken = msgLIMSAuthenticate1Response.authenticate1Result;&lt;br /&gt;msgLIMSSampleLogRequest.templateNameC = "SPEC_IPL";&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;msgLIMSSampleLogRequest.fieldsArrayC = msgLogSampleReferenceNameArray;&lt;br /&gt;msgLIMSSampleLogRequest.valuesArrayC = msgLogSampleReferenceValueArray;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8703674225546130272?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8703674225546130272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8703674225546130272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8703674225546130272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8703674225546130272'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/consuming-java-web-service-jws-method.html' title='Consuming a Java Web Service (JWS) Method Containing String Arrays as Parameters'/><author><name>Dean Pennypacker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jNHcgrSaunQ/SJdoE1nFAAI/AAAAAAAAAEE/wpY3ETOdYpU/s72-c/Message.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6369183559679295664</id><published>2008-08-04T13:15:00.000-05:00</published><updated>2008-08-04T13:34:43.897-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='whitepapers'/><category scheme='http://www.blogger.com/atom/ns#' term='Esso'/><category scheme='http://www.blogger.com/atom/ns#' term='Configuration'/><title type='text'>New BizTalk Server and Enterprise Single Sign-On Custom Configuration Whitepaper Available</title><content type='html'>&lt;p&gt;We’ve published a new whitepaper on our RDA corporate website dealing with the issue of how to store custom configuration information on an enterprise level, and for large numbers of different projects. &lt;/p&gt;&lt;p&gt;Over time, we’ve tried a number of different scenarios to solve this need and have settled on a useful approach by using Enterprise Single Sign-On. There is a need for a central repository for configuration information to avoid multiple copies of configuration information stored on specific servers and to increase security.&lt;/p&gt;&lt;p&gt;The whitepaper, titled &lt;a href="http://rdacorp.com/PDF/BizTalk%20and%20Custom%20SSO%20Configuration.pdf"&gt;Microsoft BizTalk Server and Enterprise Single Sign-On Custom Configuration&lt;/a&gt; discusses topics surrounding custom configuration within SSO with the intention of providing understanding and a reference point on utilizing it.&lt;br /&gt;&lt;br /&gt;You can also &lt;a href="http://rdacorp.com/thought_leadership/enterprise_app_integration.html"&gt;read our other RDA whitepapers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6369183559679295664?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6369183559679295664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6369183559679295664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6369183559679295664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6369183559679295664'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/08/new-biztalk-server-and-enterprise.html' title='New BizTalk Server and Enterprise Single Sign-On Custom Configuration Whitepaper Available'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-1734876741108912760</id><published>2008-07-24T17:19:00.002-05:00</published><updated>2008-07-24T17:31:09.672-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R2'/><category scheme='http://www.blogger.com/atom/ns#' term='RFID'/><title type='text'>RFID tags now work on metal</title><content type='html'>There has been a long standing rumor in the marketplace that RFID tags are not compatible with metal surfaces. While this may have been true at one time, new developments in the technology make this a problem of the past.&lt;br /&gt;&lt;br /&gt;A number of vendors now make metal mount RFID tags, this month ODIN technologies has published a benchmark study of different products that are now available in the marketplace which make metal mounting possible.&lt;br /&gt;&lt;br /&gt;Many companies who have wanted to utilize RFID have hedged because of this problem. The tags in the study were read in operational settings where metal surfaces such as shelves or server racks were present and potentially inhibit successful tag reads. &lt;a href="http://www.rfidsolutionsonline.com/article.mvc/Metal-RFID-Tags-0001?VNETCOOKIE=NO"&gt;You can see the study here&lt;/a&gt;. In short, the following tags were tested and deemed appropriate for adhesion to metal surfaces:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Avery Dennison: AD-900, AD-902, AD-908&lt;/li&gt;&lt;li&gt;Confidex: Halo, Ironside, Steelwave&lt;/li&gt;&lt;li&gt;Emerson &amp;amp; Cummings: Ecopad&lt;/li&gt;&lt;li&gt;Intermec: Large Rigid, Small Rigid&lt;/li&gt;&lt;li&gt;Omni-ID: Flex, Micro, Mini&lt;/li&gt;&lt;li&gt;Sontec: C0101, P01016BTTROI: MMT-3001, MMT-3004, PC-102&lt;/li&gt;&lt;/ul&gt;You can read the report here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rfidsolutionsonline.com/article.mvc/Metal-RFID-Tags-0001?VNETCOOKIE=NO"&gt;Metal Mount RFID Tags Benchmarked By ODIN Technologies&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-1734876741108912760?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/1734876741108912760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=1734876741108912760' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1734876741108912760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1734876741108912760'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/07/rfid-tags-now-work-on-metal.html' title='RFID tags now work on metal'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-3377943457834846712</id><published>2008-07-22T07:16:00.001-05:00</published><updated>2008-07-22T08:10:53.431-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='RFID'/><title type='text'>How can BizTalk and RFID work together?</title><content type='html'>Radio Frequency Identification tags (RFID) are becoming widely adopted by business as a cost cutting tool. BizTalk Server is also widely adopted for its ability to integrate systems and by proxy cut costs. BizTalk is ideal for RFID solutions to transition the physical event to a digital process in an automated way. Let’s take a look at a real world example of how they can work together.&lt;br /&gt;&lt;br /&gt;BizTalk interfaces with RFID in one of 2 ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;At the moment an RFID tag is printed&lt;/li&gt;&lt;li&gt;At the moment an RFID tag is read&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;BizTalk initiates and correlates a print job&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let’s say you manufacture computers, and your computers are made to order. You want to make sure your customer gets the computer they actually ordered, so it’s important to identify it.&lt;br /&gt;&lt;br /&gt;So your customer places an order on your B2B website. A BizTalk workflow is initiated that gathers up all the requirements for the order and passes it on to the ERP system for fulfillment. Once the ERP system shows the order fulfilled, BizTalk is then tasked with tagging the machine for delivery. BizTalk initiates the printing of the RFID tag and correlates it to that specific order; the printed sticker is attached to the new computer.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;RFID and BizTalk initiate the delivery cycle&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So the new computer is built, checked and packaged for delivery. A truck arrives at the loading dock, and a forklift places a load of orders on a palette and moves it to the loading bay. While in the process of loading the palette on the truck the passive RFID tags pass under an RFID reader.&lt;br /&gt;&lt;br /&gt;This action is sensed by BizTalk because the RFID reader is attached to a BizTalk server which is ‘subscribed’ for listening to messages from that reader and kicks off an advanced shipping notice message to the client. At the same time, BizTalk checks to make sure that the RFID reader’s location matches the truck in that location to make sure the correct truck is delivering the order. The advanced shipping notice is received by the customer to notify them their order is on its way, and the invoicing process begins.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Uh oh, one year later, computer breaks&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So your company has a great warranty plan and unfortunately something went wrong with that computer that was purchased a year ago. How can RFID be of help?&lt;br /&gt;&lt;br /&gt;Well, your call center logs a call and BizTalk receives a message that this computer (with a known RFID tag) will be sent to the service center to be repaired. Eventually it will arrive and when it does, the RFID reader at the shipping dock will recognize the tag and notify BizTalk of its arrival. BizTalk updates the call center’s call with this status. The customer can now know the computer arrived for repair.&lt;br /&gt;&lt;br /&gt;A technician is assigned to the repair, and BizTalk passed the details of this computer to that technicians work queue.&lt;br /&gt;&lt;br /&gt;BizTalk waits for the repair to take place and notifies the call center when it’s complete. The computer is working again and needs to be sent back to the client.&lt;br /&gt;&lt;br /&gt;The RFID tagged computer goes under an RFID reader when it’s being loaded and same ‘workflow’ that happened when the computer was originally sent takes place with an advanced shipping notice and, since its under warranty, a 0$ invoice is created.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you’ll notice, all the steps here took place with almost no human intervention. There was no person at the loading dock checking off shipments, nobody faxing invoices or shipping notices, and nobody needed to reconcile the shipments at the end of the day.&lt;br /&gt;&lt;br /&gt;If it were just BizTalk being used, some level of automation would be present, but with the combination of BizTalk and RFID, it’s possible to automate it all and that is where using them together is such a cost saver: less human interaction means less man-hours and fewer mistakes.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-3377943457834846712?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/3377943457834846712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=3377943457834846712' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3377943457834846712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/3377943457834846712'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/07/how-can-biztalk-and-rfid-work-together.html' title='How can BizTalk and RFID work together?'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-1990690159259739114</id><published>2008-07-15T15:12:00.000-05:00</published><updated>2008-07-15T15:16:30.746-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Covast'/><category scheme='http://www.blogger.com/atom/ns#' term='EDI'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk Server 2006 R3'/><title type='text'>Microsoft acquires Covast's B2B technology</title><content type='html'>Microsoft has acquired Covast's advanced B2B technology to make it available as part of upcoming BizTalk Server 2006 R3 release.&lt;br /&gt;&lt;br /&gt;The acquisition is expected to merge into R3 as superset of pieces to BizTalk Server 2006 R2's EDI component.&lt;br /&gt;&lt;br /&gt;R3 will retain the current R2 functionality but will be more tightly integrated with Covast's reporting capabilities and adapters. Covast's B2B expertise will be expected to add value in specific verticals such as automotive, energy, manufacturing.  Let all your Covast clients know.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.covast.com/news/press.asp?id=91"&gt;http://www.covast.com/news/press.asp?id=91&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-1990690159259739114?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/1990690159259739114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=1990690159259739114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1990690159259739114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1990690159259739114'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/07/microsoft-acquires-covasts-b2b.html' title='Microsoft acquires Covast&apos;s B2B technology'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-2447934921196824968</id><published>2008-07-09T15:42:00.005-05:00</published><updated>2008-07-10T01:04:44.098-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Property promotion'/><title type='text'>How To Expose the BTS ReceiveLocationName Property</title><content type='html'>There are some BizTalk properties that are not exposed in any property schemas from BTS 2006 R2. If your development project is such that you can add a new property schema or add a new BizTalk project then it is possible to access these properties from an orchestration. Because they are context properties they are not available for routing.   &lt;br /&gt;  &lt;br /&gt;One such property is the &lt;strong&gt;ReceiveLocationName&lt;/strong&gt; property. While the &lt;b&gt;ReceivePortName&lt;/b&gt; property is available in the &lt;b&gt;BTS namespace&lt;/b&gt; the ReceiveLocationName property is not. Therefore, this syntax from an example orchestration expression shape results in a compile time error:&amp;#160; &lt;font face="Courier New"&gt;&lt;font size="2"&gt;strReceiveLocation = myMsg(BTS.&lt;u&gt;&lt;strong&gt;ReceiveLocationName&lt;/strong&gt;&lt;/u&gt;); &lt;/font&gt;    &lt;br /&gt;&lt;/font&gt;  &lt;br /&gt;&lt;strong&gt;ReceiveLocationName Property&lt;/strong&gt;   &lt;br /&gt;  &lt;br /&gt;We can easily see the ReceiveLocationName property in messages that come into BizTalk. The question is how to get its value into an orchestration?   &lt;br /&gt;  &lt;br /&gt;&lt;img height="136" alt="" src="http://lh3.ggpht.com/evan.aussenberg/SHUiyZ78DiI/AAAAAAAAAGU/xo_cEVV4GiM/clip_image002%5B5%5D.jpg?imgmax=800" width="699" border="0" /&gt;&amp;#160; &lt;br /&gt;  &lt;br /&gt;&lt;strong&gt;Code Example&lt;/strong&gt;   &lt;br /&gt;  &lt;br /&gt;As you probably know, property values are identified by the property target namespace and property name. We won't ultimately use the following code, but for demonstration purposes in a custom pipeline component we can assess a property value by coding something like this:   &lt;br /&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal" style="mso-layout-grid-align: none"&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;// Namespace of the property          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;//              &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " courier="courier" new??="new??"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt; sysNamespace =&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#a31515"&gt;&lt;span style="color: #a31515"&gt;&amp;quot;http://schemas.microsoft.com/BizTalk/2003/system-properties&amp;quot;&lt;/span&gt;&lt;/font&gt;;             &lt;br /&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;             &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#008000"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;// Or instead of hard coding the namespace:                &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;// Assuming the property namespace for ReceivePortName is the same          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;// for ReceiveLocationName:          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;//          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt;BTS.ReceivePortName BTSPropReceivePortName = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; BTS.ReceivePortName();           &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt;sysNamespace = BTSPropReceivePortName.Name.Namespace;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;// Assign the receive location name          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new??="new??"&gt;//              &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " courier="courier" new??="new??"&gt;string&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font face="Courier New" size="2"&gt; receiveLocationName =&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new??="new??"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;pInMsg.Context.Read(&lt;font color="#a31515"&gt;&lt;span style="color: #a31515"&gt;&amp;quot;ReceiveLocationName&amp;quot;&lt;/span&gt;&lt;/font&gt;, sysNamespace);&lt;/font&gt;&lt;/font&gt;         &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p class="MsoNormal" style="mso-layout-grid-align: none"&gt;You can see from the last line of code from above, that to retrieve a message property requires &lt;i&gt;nothing &lt;/i&gt;more than knowing the &lt;b&gt;property name&lt;/b&gt; and the &lt;strong&gt;property target namespace&lt;/strong&gt;.&lt;strong&gt;      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;&lt;strong&gt;Adding a Property Schema&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;img style="margin: 0px 0px 0px 4px" height="151" alt="" src="http://lh6.ggpht.com/evan.aussenberg/SHUizH5sNCI/AAAAAAAAAGY/QskvtMYN-mg/clip_image002%5B6%5D%5B4%5D.jpg?imgmax=800" width="400" align="right" border="0" /&gt;As far as BTS message properties go, they can be assigned &lt;a href="http://msdn.microsoft.com/en-us/library/aa560371.aspx" target="_blank"&gt;Property Schema Base&lt;/a&gt; types of &lt;strong&gt;MessageDataPropertyBase&lt;/strong&gt; (default) or &lt;strong&gt;MessageContextPropertyBase&lt;/strong&gt;. MessageDataPropertyBase means that the XPath to the property value in the message &lt;u&gt;must exist&lt;/u&gt;. A MessageContextPropertyBase property means that the XPath may or may not exist.     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Taking this information into account we can expose the RecieveLocationName using the following steps. Note steps 1 &amp;#8211; 4 are just suggestions.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;1. Create a property schema, and perhaps create a new BizTalk project.&lt;/p&gt;    &lt;p&gt;2. Add a new property schema. Let&amp;#8217;s call it &amp;#8220;schBTSExtra.xsd&amp;#8221;.&lt;/p&gt;    &lt;p&gt;3. Change the namespace of the .NET &lt;u&gt;schema type&lt;/u&gt; to &amp;#8220;BTSExtra&amp;#8221;. This is just a shortened namespace similar to the &amp;#8220;BTS&amp;#8221; namespace in the Microsoft.BizTalk.GlobalPropertySchemas assembly.&lt;/p&gt;    &lt;p&gt;4. Open the new schema if it is not already opened.&lt;/p&gt;    &lt;p&gt;5. Change the name of Property1 (it was added by default when creating the new property schema) to &lt;b&gt;ReceiveLocationName.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;6. Set the &lt;b&gt;Property Schema Base&lt;/b&gt; to &lt;b&gt;MessageContextPropertyBase.&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;7. Highlight the &amp;#8220;Schema&amp;#8221; node and change the schema&amp;#8217;s &lt;b&gt;Target Namespace&lt;/b&gt; to       &lt;br /&gt;&lt;span class="str"&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;http://schemas.microsoft.com/BizTalk/2003/system-properties&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;8. Compile the project.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Property Schema Example      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;That&amp;#8217;s all there is to it&amp;#8230; now in your orchestration after referencing the new schema project (or you added this schema directly to your orchestration project) you can use an expression such as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal" style="mso-layout-grid-align: none"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;&lt;font face="Courier New" size="2"&gt;// Trace output from an orchestration expression shape          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;&lt;font face="Courier New" size="2"&gt;//          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;traceMsg = purchaseOrder(&lt;strong&gt;BTSExtra.ReceiveLocationName&lt;/strong&gt;);             &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;if&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;&lt;font face="Courier New" size="2"&gt; (traceMsg == &lt;span style="color: blue"&gt;null&lt;/span&gt;)           &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;&lt;font face="Courier New" size="2"&gt;{          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;traceMsg = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;null&amp;gt;&amp;quot;&lt;/span&gt;;             &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;}            &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" new="new" roman??="Roman??" new?;="new?;" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times"&gt;System.Diagnostics.Trace.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Receive Location Name: &amp;quot;&lt;/span&gt; + traceMsg);&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size: 10pt; font-family: " new="new" roman??="Roman??" mso-fareast-font-family:="mso-fareast-font-family:" ?Times="?Times" arial?,?sans-serif?;="arial?,?sans-serif?;"&gt; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;span id="ctl00_ContentPlaceHolder1_output"&gt;Here is the result when testing my own orchestration:      &lt;br /&gt;      &lt;br /&gt;&lt;img height="137" alt="" src="http://lh3.ggpht.com/evan.aussenberg/SHUizTEIuZI/AAAAAAAAAGc/_8J7gzBgHQY/clip_image002%5B8%5D%5B3%5D.jpg?imgmax=800" width="711" border="0" /&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa560371.aspx" target="_blank"&gt;Property Schema Base (Node Property of Property Schemas)&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-2447934921196824968?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/2447934921196824968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=2447934921196824968' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2447934921196824968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/2447934921196824968'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/07/how-to-expose-bts-receivelocationname.html' title='How To Expose the BTS ReceiveLocationName Property'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/evan.aussenberg/SHUiyZ78DiI/AAAAAAAAAGU/xo_cEVV4GiM/s72-c/clip_image002%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-1961092636543027147</id><published>2008-07-09T07:46:00.000-05:00</published><updated>2008-07-09T07:58:14.582-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Routing'/><category scheme='http://www.blogger.com/atom/ns#' term='Ports'/><title type='text'>RecieveLocationName missing and a workaround</title><content type='html'>I've had the situation recently where I wanted to set up a receive port and have a large number of receive locations feeding into this port.  In normal scenario this works fine but in my case it did not and had to find a workaround for it.&lt;br /&gt;&lt;br /&gt;The reason the scenario above did not work is because I needed to know the receive location's name that the message came in on and the only property available from the context within an orchestration is &lt;strong&gt;BTS.ReceivePortName&lt;/strong&gt; which is the same for all the locations.&lt;br /&gt;&lt;br /&gt;I did some digging and for some alternatives, one was a custom pipeline which found and promoted the property "&lt;strong&gt;ReceiveLocationName&lt;/strong&gt;", the second was a message context functoid on CodePlex which could retrieve this value from within a map.  I didn't like either option and tried to widdle the code from the functoid into something I could use in a small helper class method or even the expression shape.  I got the code to work but could never seem to find the ReceiveLocationName property I'd seen mentioned on other blogs.  My guess is that it only appears with certain adapters but I couldn't even find it in any of the BizTalk schemas.&lt;br /&gt;&lt;br /&gt;I decided to make a U-turn from this custom approach because I was just replacing a large number of receive ports with custom code.  So instead of the custom approach I'd been working on I decided to make the initial receive shape in the orchestration direct bound and create 1-n ports which I could leverage in the orchestration without knowing the ReceiveLocationName.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-1961092636543027147?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/1961092636543027147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=1961092636543027147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1961092636543027147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/1961092636543027147'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/07/recievelocationname-missing-and.html' title='RecieveLocationName missing and a workaround'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-5318850101030919363</id><published>2008-06-27T07:02:00.002-05:00</published><updated>2008-06-27T07:06:53.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPropertyAnnotation'/><category scheme='http://www.blogger.com/atom/ns#' term='XsdDistinguishedFieldDefinition'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Pipeline component'/><category scheme='http://www.blogger.com/atom/ns#' term='GetDistinguishedPropertyAnnotationEnumerator'/><category scheme='http://www.blogger.com/atom/ns#' term='GetPropertyAnnotationEnumerator'/><category scheme='http://www.blogger.com/atom/ns#' term='Property promotion'/><category scheme='http://www.blogger.com/atom/ns#' term='IDocumentSpec'/><title type='text'>Pipeline Component Property Promotion</title><content type='html'>&lt;p&gt;I've often seen questions from new BizTalk developers asking why they couldn't subscribe to an incoming message. Typically, the question actually revolves around why were the message property values not promoted as expected? And sometimes, for the new developer, the answer is because he or she forgot to use the XML Receive pipeline component and instead used the Pass Thru Receive pipeline component for the message being received.    &lt;br /&gt;    &lt;br /&gt;So, we take away from this scenario the fact that one job of a &lt;em&gt;receive&lt;/em&gt; pipeline component (XML, Flat File, etc) is to promote property values from the message to the message context, which makes those values available to subscriptions. And notice the Pass Thru Receive pipeline is named appropriately... it passes a message through directly to the message box without any processing and since the message is not identified, even if it is an instance of a deployed schema, no properties from the message are promoted.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Custom Pipeline Property Promotion&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;Recently I was developing a custom pipeline component when I discovered that the message properties were not being promoted. Well, it was a little more complicated than that because this particular component encapsulated the Flat File Receive disassembly pipeline component. This part worked, because in this case the Flat File Receive component handled property promotion of the resulting Xml message.     &lt;br /&gt;    &lt;br /&gt;The other piece of the puzzle was that I also created a &lt;em&gt;second &lt;/em&gt;Xml message on the fly to be emitted from the pipeline. It was this second message whose properties were not promoted correctly or at all. To add another layer of complexity this additional message could be one of a handful of different types. I wanted to dynamically promote its properties since not having to adjust a custom pipeline due to schema changes in the future makes for a robust solution.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Drill Down into Property Promotion     &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="100%" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;&lt;a href="http://lh3.ggpht.com/evan.aussenberg/SGTW0aZVzEI/AAAAAAAAAFw/9-1YAs8DHqg/image3.png"&gt;&lt;img style="margin: 0px 4px 0px 0px" height="198" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGTW0pZjgHI/AAAAAAAAAF0/sEjYTqU7ZXk/image_thumb1.png" width="327" align="left" border="0" /&gt;&lt;/a&gt;I realized that is up to my custom pipeline component to promote the properties for that second message since it is being created on the fly. If you've worked with custom pipeline component code before you'll think why not just use the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.message.interop.ibasemessagecontext_members.aspx" target="_blank"&gt;&lt;strong&gt;IBaseMessageContext&lt;/strong&gt;&lt;/a&gt; methods to promote properties? Well, that's the mechanism to actually affect the promotion but it is only part of the answer because those methods won't allow discovery of what field names are linked to the property schema(s).           &lt;br /&gt;          &lt;br /&gt;Remember that when you create promoted properties for your message you are linking an XPath from your message to a property name (element) in a property schema. So not only do we need to discover what promoted (and distinguished) properties are available for this second message being created, we also need to know what the XPath is to actually promote the value from the message to the message context! &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;         &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/evan.aussenberg/SGTW04aN8cI/AAAAAAAAAF4/YDroviWcq9g/image7.png"&gt;&lt;img style="margin: 0px 0px 0px 4px" height="182" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGTW1TiUzTI/AAAAAAAAAF8/rSZqUVP20zc/image_thumb3.png" width="354" align="right" border="0" /&gt;&lt;/a&gt;This is where the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.idocumentspec.aspx" target="_blank"&gt;&lt;strong&gt;IDocumentSpec&lt;/strong&gt;&lt;/a&gt; interface comes in. This interface contains the &lt;strong&gt;GetPropertyAnnotationEnumerator&lt;/strong&gt; and &lt;strong&gt;GetDistinguishedPropertyAnnotationEnumerator&lt;/strong&gt; methods that will give us a list of both the promoted and distinguished property names. From this list we can also determine the XPath to those values in our message.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;         &lt;p&gt;&lt;img style="margin: 0px 4px 0px 0px" height="222" alt="image" src="http://lh3.ggpht.com/evan.aussenberg/SGTW14HnnaI/AAAAAAAAAGA/5H6mGQdH8gU/image29.png" width="307" align="left" border="0" /&gt; In addition to the BizTalk references needed to compile a custom Pipeline Component, you will need an additional reference to Microsoft.XLANGs.RuntimeTypes.             &lt;br /&gt;            &lt;br /&gt;This assembly contains the &lt;strong&gt;IPropertyAnnotation&lt;/strong&gt; interface and &lt;strong&gt;XsdDistinguishedFieldDefinition &lt;/strong&gt;definition. Ultimately it is these types of objects that are returned from the DocumentSpec &amp;quot;get&amp;quot; methods.             &lt;br /&gt;            &lt;br /&gt;The &amp;quot;&lt;font face="Courier New"&gt;&lt;strong&gt;XPath&lt;/strong&gt;&lt;/font&gt;&amp;quot; property contains the XPath to the value in the message which we will promote (or write) to the message context! The &amp;quot;&lt;font face="Courier New"&gt;&lt;strong&gt;Namespace&lt;/strong&gt;&lt;/font&gt;&amp;quot; property contains the property schema namespace. As you'll see in the example below these values are used with the &lt;strong&gt;Promote()&lt;/strong&gt; and &lt;strong&gt;Write()&lt;/strong&gt; methods of the pipeline context.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="100%"&gt;         &lt;p&gt;&lt;strong&gt;Property Promotion Implementation              &lt;br /&gt;&lt;/strong&gt;            &lt;br /&gt;&lt;img style="margin: 0px 0px 0px 4px" height="251" alt="image" src="http://lh3.ggpht.com/evan.aussenberg/SGTW2O7aUGI/AAAAAAAAAGE/Us6k43g1yUc/image81.png" width="347" align="right" border="0" /&gt;Creating a custom pipeline component is outside the scope of this post, though I've included some external links below. In our following example we retrieve the DocumentSpec object mentioned above from the pipeline context (&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.ipipelinecontext_members.aspx" target="_blank"&gt;&lt;strong&gt;IPipelineContext&lt;/strong&gt;&lt;/a&gt;), which is provided to us during pipeline execution.             &lt;br /&gt;            &lt;br /&gt;Since the documentation is not abundantly clear, I'll point out that the &lt;strong&gt;GetDocumentSpecByName&lt;/strong&gt;() is passed the Strong Assembly Name (AssemblyQualifiedName property) of the schema type. The &lt;strong&gt;GetDocumentSpecByType&lt;/strong&gt;() is passed the BizTalk MessageType (target namespace + &amp;quot;#&amp;quot; + root node name).             &lt;br /&gt;            &lt;br /&gt;Once we have the DocumentSpec in hand then it's a relatively straightforward matter of stepping through the enumerated properties and promoting/writing them to the context of our message.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;u&gt;Code Snippet&lt;/u&gt;     &lt;br /&gt;&lt;font face="Courier New" color="#008000" size="1"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="1"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;// Instead of hard-coding namespaces for various built-in        &lt;br /&gt;// BTS properties, here is an idea that caches the information         &lt;br /&gt;// the first time the the pipeline component runs.         &lt;br /&gt;//&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff" size="1"&gt;&lt;span style="font-size: 9pt; color: blue; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;        &lt;br /&gt;private&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" size="1"&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;struct&lt;/span&gt;&lt;/font&gt; &lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;BTSProperties&lt;/span&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;            &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;InterchangeID&lt;/span&gt;&lt;/font&gt; interchangeId = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;InterchangeID&lt;/span&gt;&lt;/font&gt;();         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;/font&gt; XMLNORM.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;DocumentSpecName&lt;/span&gt;&lt;/font&gt; documentSpecName = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; XMLNORM.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;DocumentSpecName&lt;/span&gt;&lt;/font&gt;();         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;/font&gt; FILE.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;ReceivedFileName&lt;/span&gt;&lt;/font&gt; receivedFileName = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; FILE.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;ReceivedFileName&lt;/span&gt;&lt;/font&gt;();         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;MessageType&lt;/span&gt;&lt;/font&gt; messageType = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;MessageType&lt;/span&gt;&lt;/font&gt;();         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&lt;/font&gt; &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;SchemaStrongName&lt;/span&gt;&lt;/font&gt; schemaStrongName = &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;/font&gt; BTS.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;SchemaStrongName&lt;/span&gt;&lt;/font&gt;();         &lt;br /&gt;}&lt;/span&gt;&lt;/font&gt;&lt;font face="Arial" size="1"&gt;&lt;span style="font-size: 9pt; font-family: " mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" arial?,?sans-serif?;="arial?,?sans-serif?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#008000" size="1"&gt;&lt;span style="font-size: 9pt; color: green; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;[ ... ]         &lt;br /&gt;        &lt;br /&gt;// msgAuditTrail         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Second message created on the fly,         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;an instance of IBaseMessage.         &lt;br /&gt;//         &lt;br /&gt;// xmlMsgAuditTrail         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Xml document instance.         &lt;br /&gt;//         &lt;br /&gt;// pContext         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;IPipelineContext - provided to us during         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;pipeline execution.         &lt;br /&gt;//         &lt;br /&gt;// auditTrailAssemblyQualifiedName         &lt;br /&gt;//&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;String value for the schema type.         &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" color="#2b91af" size="1"&gt;&lt;span style="font-size: 9pt; color: #2b91af; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;IDocumentSpec&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New" size="1"&gt;&lt;span style="font-size: 9pt; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt; docSpecAuditTrail =        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;pContext.GetDocumentSpecByName(auditTrailAssemblyQualifiedName);         &lt;br /&gt;        &lt;br /&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// Write document type to the message context            &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;msgAuditTrail.Context.Write(&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;BTSProperties&lt;/span&gt;&lt;/font&gt;.documentSpecName.Name.Name,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;BTSProperties&lt;/span&gt;&lt;/font&gt;.documentSpecName.Name.Namespace,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;docSpecAuditTrail.DocSpecStrongName);         &lt;br /&gt;msgAuditTrail.Context.Write(&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;BTSProperties&lt;/span&gt;&lt;/font&gt;.schemaStrongName.Name.Name,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;BTSProperties&lt;/span&gt;&lt;/font&gt;.schemaStrongName.Name.Namespace,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;docSpecAuditTrail.DocSpecStrongName);         &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// WRITE DISTINGUISHED VALUES            &lt;br /&gt;//             &lt;br /&gt;// Iterate through each distinguished property and promote it from the message.             &lt;br /&gt;// Write distinguished properties prior to promoted properties. This is because             &lt;br /&gt;// if a promoted property is also distinguished it won't be promoted if the             &lt;br /&gt;// &amp;quot;write&amp;quot; is used last.             &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt;&lt;/font&gt; annotations =         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;docSpecAuditTrail.GetDistinguishedPropertyAnnotationEnumerator();         &lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;           &lt;br /&gt;if&lt;/span&gt;&lt;/font&gt; (annotations != &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/font&gt;)         &lt;br /&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;while&lt;/span&gt;&lt;/font&gt; (annotations.MoveNext())         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;DictionaryEntry&lt;/span&gt;&lt;/font&gt; de = (&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;DictionaryEntry&lt;/span&gt;&lt;/font&gt;)annotations.Current;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;font color="#2b91af"&gt;&lt;span style="font-weight: bold; color: #2b91af; mso-bidi-font-weight: normal"&gt;XsdDistinguishedFieldDefinition&lt;/span&gt;&lt;/font&gt;&lt;/b&gt; &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-weight: bold; mso-bidi-font-weight: normal"&gt;distinguishedField&lt;/span&gt;&lt;/b&gt; =         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;(&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;XsdDistinguishedFieldDefinition&lt;/span&gt;&lt;/font&gt;)de.Value;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// Use annotation.Name or Namespace to get the data to            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;// promote from message             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;System.Xml.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;XmlNode&lt;/span&gt;&lt;/font&gt; contextNode =         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;xmlMsgAuditTrail.SelectSingleNode(distinguishedField.XPath);         &lt;br /&gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;&lt;/font&gt; (contextNode != &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/font&gt;)         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// &amp;quot;Write&amp;quot; distinguished fields.            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;//             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;msgAuditTrail.Context.&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-weight: bold; mso-bidi-font-weight: normal"&gt;Write&lt;/span&gt;&lt;/b&gt;(de.Key.ToString(),         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Microsoft.XLANGs.BaseTypes.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;Globals&lt;/span&gt;&lt;/font&gt;.DistinguishedFieldsNamespace,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextNode.InnerText);         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;}         &lt;br /&gt;        &lt;br /&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// WRITE PROMOTED VALUES            &lt;br /&gt;//             &lt;br /&gt;// Iterate through each promoted property and promote it from the message.             &lt;br /&gt;// Write distinguished properties prior to promoted properties. This is because             &lt;br /&gt;// if a promoted property is also distinguished it won't be promoted if the             &lt;br /&gt;// &amp;quot;write&amp;quot; is used last.             &lt;br /&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;annotations = docSpecAuditTrail.GetPropertyAnnotationEnumerator();         &lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;           &lt;br /&gt;if&lt;/span&gt;&lt;/font&gt; (annotations != &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/font&gt;)         &lt;br /&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;while&lt;/span&gt;&lt;/font&gt; (annotations.MoveNext())         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;font color="#2b91af"&gt;&lt;span style="font-weight: bold; color: #2b91af; mso-bidi-font-weight: normal"&gt;IPropertyAnnotation&lt;/span&gt;&lt;/font&gt; propAnnotation&lt;/b&gt; =         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;(&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;IPropertyAnnotation&lt;/span&gt;&lt;/font&gt;)annotations.Current;         &lt;br /&gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// Use annotation.Name or Namespace to get the data to            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;// promote from message             &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;System.Xml.&lt;font color="#2b91af"&gt;&lt;span style="color: #2b91af"&gt;XmlNode&lt;/span&gt;&lt;/font&gt; contextNode =         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;xmlMsgAuditTrail.SelectSingleNode(propAnnotation.XPath);         &lt;br /&gt;        &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;&lt;/font&gt; (contextNode != &lt;font color="#0000ff"&gt;&lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/font&gt;)         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;font color="#008000"&gt;&lt;span style="color: green"&gt;// &amp;quot;Promote&amp;quot; distinguished fields.            &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;//             &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;msgAuditTrail.Context.&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-weight: bold; mso-bidi-font-weight: normal"&gt;Promote&lt;/span&gt;&lt;/b&gt;(propAnnotation.Name,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;propAnnotation.Namespace,         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextNode.InnerText);         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;}&lt;/span&gt;&lt;/font&gt; &lt;font face="Courier New" color="#008000" size="1"&gt;&lt;span style="font-size: 8pt; color: green; font-family: " courier="courier" mso-bidi-language:="mso-bidi-language:" mso-fareast-language:="mso-fareast-language:" mso-ansi-language:="mso-ansi-language:" minor-latin;="minor-latin;" mso-fareast-theme-font:="mso-fareast-theme-font:" MS?;="MS?;" ?Trebuchet="?Trebuchet" mso-fareast-font-family:="mso-fareast-font-family:" new?;="new?;" ar-sa?="AR-SA?" en-us;="EN-US;"&gt;       &lt;br /&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;strong&gt;External Links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/aa578544.aspx" target="_blank"&gt;Pipelines (BizTalk Server Samples Folder)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/brajens/archive/2006/12/03/how-to-develop-biztalk-custom-pipeline-components-part1.aspx" target="_blank"&gt;How to Develop BizTalk Custom Pipeline Components (MSDN Blog)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.message.interop.ibasemessagecontext_members.aspx" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://technet.microsoft.com/en-us/library/aa560021.aspx" target="_blank"&gt;Using Pipeline Interfaces&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.message.interop.ibasemessagecontext_members.aspx" target="_blank"&gt;IBaseMessageContext&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.idocumentspec_members.aspx" target="_blank"&gt;IDocumentSpec&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.biztalk.component.interop.ipipelinecontext_members.aspx" target="_blank"&gt;IPipelineContext&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-5318850101030919363?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/5318850101030919363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=5318850101030919363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5318850101030919363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/5318850101030919363'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/pipeline-component-property-promotion.html' title='Pipeline Component Property Promotion'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/evan.aussenberg/SGTW0pZjgHI/AAAAAAAAAF0/sEjYTqU7ZXk/s72-c/image_thumb1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8676850944546393841</id><published>2008-06-26T09:21:00.002-05:00</published><updated>2008-06-26T09:25:00.025-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complex Type'/><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='Xml'/><title type='text'>BizTalk Editor Global Types</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Following on to the &lt;a href="http://eaiteamblog.blogspot.com/2008/06/biztalk-xml-complex-types.html"&gt;BizTalk Xml Complex Types&lt;/a&gt; post here are some tips for working with Complex or Global Types in the BizTalk Schema Editor itself.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Creating a Complex Type      &lt;br /&gt;&lt;/strong&gt;    &lt;br /&gt;The BizTalk Editor is very message-instance-centric and typically you are working with a schema that already represents a message in whole or in part. To create a complex type, highlight a record node and type in a Data Structure Type value. Typically I will use a suffix of &amp;quot;&lt;font face="Courier New"&gt;Type&lt;/font&gt;&amp;quot; as seen below.     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="100%" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="365"&gt;&lt;img height="170" alt="image" src="http://lh4.ggpht.com/evan.aussenberg/SGOl2VaPKmI/AAAAAAAAAEw/omsaextEksw/image9.png" width="380" border="0" /&gt;&lt;/td&gt;        &lt;td valign="top" width="100%"&gt;When you assign a value to the Data Structure Type property the BizTalk editor adds the &amp;quot;&lt;font face="Courier New"&gt;type&lt;/font&gt;&amp;quot; attribute to the element and also creates a definition for the type. This is important to note because if we delete the actual record node, the schema editor will look empty yet the Xml type we created still exists!&amp;#160; In fact, when saving such a schema a prompt will be displayed asking about deleting unused schema definitions.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;In this case our Xml record has no children because it is a base type, but further below we'll look at a more complex example.:     &lt;br /&gt;&lt;img height="149" alt="image" src="http://lh3.ggpht.com/evan.aussenberg/SGOl308kw8I/AAAAAAAAAE0/lcfaBFsx-oY/image8.png" width="765" border="0" /&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;Saving a schema with unused data types results in a pop-up dialog being displayed:     &lt;br /&gt;&lt;img height="148" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGOl4G_aHSI/AAAAAAAAAE4/uNHlIhDwsiM/image12.png" width="370" border="0" /&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Updating a Complex Type using the BizTalk Editor      &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;&lt;u&gt;Rename&lt;/u&gt;: To rename a global type, change the Data Structure Type property value. Caution should be applied if this global type is used in external schema definitions.     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;De-referencing&lt;/u&gt;: Let's say you've defined an Xml record as a global type but now you decide it'd be nice to copy all the elements from the global type but not reference it. This is easily done and is a nice feature of the BizTalk Xml Editor. Right-click on the Data Structure Type property and click &amp;quot;Reset&amp;quot; from the context menu. The property will now be empty and the fields from the global type will be copied to your record node as if you had typed them in. This tip works with other global definitions as well, such as Sequence Group references.     &lt;br /&gt;    &lt;br /&gt;&lt;u&gt;Deleting&lt;/u&gt;: Using the BizTalk Editor the only way to delete an unused Global Type is to remove its use from your schema and then save the schema. The type definition will then be deleted if you choose. See the above screen shot &amp;quot;Clean Up Global Data Types&amp;quot;. You can also edit the XSD file manually or use the standard XML Schema Editor.&amp;#160; &lt;br /&gt;&lt;strong&gt;     &lt;br /&gt;Example       &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;&lt;img style="margin: 0px 0px 0px 8px" height="84" alt="" src="http://lh6.ggpht.com/evan.aussenberg/SGOl4SBdDEI/AAAAAAAAAE8/wjHVzwxif00/image33.png" width="296" align="right" border="0" /&gt;In our example BizTalk application we process many different kinds of flat file messages and the first two rows of all the messages contain the same format. So, we would like to create a reusable global definition.     &lt;br /&gt;    &lt;br /&gt;Row 1 contains a timestamp, and row 2 contains a &amp;quot;&lt;font face="Courier New"&gt;/&lt;/font&gt;&amp;quot; (slash) delimited record for &lt;u&gt;S&lt;/u&gt;hipment &lt;u&gt;I&lt;/u&gt;D and &lt;u&gt;T&lt;/u&gt;ransport &lt;u&gt;N&lt;/u&gt;umber.     &lt;br /&gt;    &lt;br /&gt;The first step (see next image) is to create a schema to hold the header flat file definition. You can use the Flat File Wizard if you want to help define the schema for the first two rows. Afterwards, create a Sequence Group to encapsulate the fields and flat file attributes -- which I can use since all of my fields are elements. To create the global definition just type in a name for your Group -- in this case I used the name &amp;quot;&lt;font face="Courier New"&gt;HeaderContent&lt;/font&gt;&amp;quot;. Note; For our purposes this schema is not a &amp;quot;Flat File Header Schema&amp;quot; as in flat file envelope processing, which is a whole other topic.&lt;/p&gt;  &lt;div align="center"&gt;   &lt;table cellspacing="0" cellpadding="2" width="400" align="center" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;img height="202" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGOl40978kI/AAAAAAAAAFA/w7eNFuEAfWM/image18.png" width="278" border="0" /&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;img height="148" alt="image" src="http://lh3.ggpht.com/evan.aussenberg/SGOl45IAGPI/AAAAAAAAAFE/N2WZsSGs0dc/image31.png" width="241" border="0" /&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;Next, create the document flat file schema and define everything except for the header content. The example below is for a fictional Delivery Confirmation document. Import the schema containing the reusable type and reference it in the document schema. Automatically the entire flat file header content that was previously defined is now part of Delivery Confirmation document.&lt;/p&gt;  &lt;div align="center"&gt;   &lt;table cellspacing="0" cellpadding="2" width="400" align="center" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;img height="315" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGOl5OdynYI/AAAAAAAAAFI/ZFBphMAp-qQ/image25.png" width="257" border="0" /&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;img height="176" alt="image" src="http://lh6.ggpht.com/evan.aussenberg/SGOl5jcIyeI/AAAAAAAAAFM/yXcrU97FHPA/image28.png" width="241" border="0" /&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;External links from MSDN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa547916.aspx" target="_blank"&gt;How to Create References to Another Node or Type&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms962808.aspx" target="_blank"&gt;Schemas That Use Other Schemas&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8676850944546393841?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8676850944546393841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8676850944546393841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8676850944546393841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8676850944546393841'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/biztalk-editor-global-types.html' title='BizTalk Editor Global Types'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/evan.aussenberg/SGOl2VaPKmI/AAAAAAAAAEw/omsaextEksw/s72-c/image9.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6246476193961540404</id><published>2008-06-25T04:53:00.002-05:00</published><updated>2008-06-25T05:04:40.649-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complex Type'/><category scheme='http://www.blogger.com/atom/ns#' term='Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='Xml'/><title type='text'>BizTalk Xml Complex Types</title><content type='html'>&lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;BizTalk operations are often designed to use an internal message representation, a &lt;i&gt;&lt;span style="font-style: italic"&gt;canonical&lt;/span&gt;&lt;/i&gt;, for disparate data that represents the same logical piece of information. For example different trading partners might submit different Purchase Order formats, which are then transformed into Purchase Order canonical messages so that BizTalk services can process them consistently.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;Sometimes there are other reasons for using a canonical such as the need to &lt;i&gt;&lt;span style="font-style: italic"&gt;enrich&lt;/span&gt;&lt;/i&gt; the data (status, approvals, context metadata, etc) or to transform the message from non-Xml flat text data.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;I recently worked on a project that involved processing &lt;i&gt;&lt;span style="font-style: italic"&gt;many&lt;/span&gt;&lt;/i&gt; &lt;i&gt;&lt;span style="font-style: italic"&gt;different&lt;/span&gt;&lt;/i&gt; types of messages. The schemas involved were anything from simple free text messages to well defined messages with both organized content and free form text. While the messages where physically different they all had a common business context. If there had been only a few different messages then a direct schema implementation might have been indicated, however we had almost 100 different message types and different services might subscribe to one or more of them. So, we needed a single canonical to easily represent any one of these different messages. This would also make the subscription/filter configuration easier to maintain and deploy.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;How did we implement a single canonical schema to easily represent one of many different messages? The first idea was to try to normalize all the different fields in all the different messages and add the fields to the canonical. This works but the downside is that every time a message type is added or changed, the canonical would have to be updated. Another downside is that structurally it is difficult to organize the canonical schema to make sense from a business perspective and one looses the ability to &lt;i&gt;&lt;span style="font-style: italic"&gt;eyeball&lt;/span&gt;&lt;/i&gt; the schema and understand where the data is coming from and how it is grouped.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;We implemented our solution using Xml Complex Types and the resulting canonical schema required no updating if a message type was added or changed. First we created a base message content complex type from which all other content would be derived. Next we reviewed all the messages and decided how they might be organized from a business perspective. Next, we created the individual content by extending the base message type. Lastly, instead of adding individual messages to the canonical, we simply added the base message content complex type.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;The screen shots below depict a schema for a fictional shipping company. Note; the project artifacts are simplified for discussion purposes.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;a href="http://lh4.ggpht.com/evan.aussenberg/SGIVjRw4JKI/AAAAAAAAADY/wsCKHQzvxXU/image001%5B3%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="202" alt="image001" src="http://lh3.ggpht.com/evan.aussenberg/SGIVjnOmB5I/AAAAAAAAADc/kVYezrYYLXs/image001_thumb%5B1%5D.png" width="234" border="0"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;The screenshot below shows the Air Content schema, which contains all the content types associated with shipping by air.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;a href="http://lh5.ggpht.com/evan.aussenberg/SGIVjxZf4nI/AAAAAAAAADo/2Cc_IjB1L-w/image002%5B4%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="227" alt="image002" src="http://lh6.ggpht.com/evan.aussenberg/SGIVj7C8IaI/AAAAAAAAADs/iErs6t_y6ew/image002_thumb%5B2%5D.png" width="634" border="0"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;The Transport &lt;i&gt;&lt;span style="font-style: italic"&gt;Canonical&lt;/span&gt;&lt;/i&gt; schema is shown below. The “&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="font-family: 'Courier New'"&gt;Content&lt;/span&gt;&lt;/font&gt;” node is assigned the base content type. Since all the individual Ground, Air and Uplink content types are derived from the base type they are &lt;span style="background: rgb(231,255,232); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;automatically&lt;/span&gt; part of the canonical schema. Note the Xml &lt;i&gt;&lt;span style="font-style: italic"&gt;equivalent&lt;/span&gt;&lt;/i&gt; node; it contains all of the derived message types from the base Xml complex data type. From MSDN;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing" style="margin: 0in 0.5in 0pt"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 10pt"&gt;“&lt;b&gt;&lt;span style="font-weight: bold"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa578276.aspx" target="_blank"&gt;Equivalent&lt;span style="font-weight: normal"&gt; &lt;strong&gt;nodes&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; are created automatically by BizTalk Editor to show how derived complex types can be used instead of the base complex type from which they are derived wherever the base complex type is called for in the schema. This yields the same type of polymorphism that is common in many object-oriented programming languages.”&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;a href="http://lh3.ggpht.com/evan.aussenberg/SGIVkCUErxI/AAAAAAAAADw/gSvzqozivyA/image003%5B4%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="422" alt="image003" src="http://lh4.ggpht.com/evan.aussenberg/SGIVkQWsa-I/AAAAAAAAAD8/u21gDJpizDQ/image003_thumb%5B2%5D.png" width="367" border="0"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;The “&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="font-family: 'Courier New'"&gt;Content&lt;/span&gt;&lt;/font&gt;” record properties.&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;a href="http://lh5.ggpht.com/evan.aussenberg/SGIVkVfVxlI/AAAAAAAAAEA/myBFxUtLhmY/image004%5B4%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="190" alt="image004" src="http://lh6.ggpht.com/evan.aussenberg/SGIVkuOJk_I/AAAAAAAAAEE/s6XHTcrI9xE/image004_thumb%5B2%5D.png" width="356" border="0"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;Below is a screenshot of a canonical instance for the Air Weather Request message. During mapping we could easily map the name of the message to a promoted property (&lt;/span&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;span style="font-family: 'Courier New'"&gt;TransportMessageTypeId&lt;/span&gt;&lt;/font&gt;) if required.&lt;/p&gt; &lt;p class="MsoNoSpacing"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;span style="font-size: 11pt"&gt;&lt;a href="http://lh3.ggpht.com/evan.aussenberg/SGIVk9v9anI/AAAAAAAAAEI/jESPbdIRjgE/image005%5B5%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="287" alt="image005" src="http://lh4.ggpht.com/evan.aussenberg/SGIVkzd6C0I/AAAAAAAAAEM/STBxO7xkbsg/image005_thumb%5B3%5D.png" width="569" border="0"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6246476193961540404?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6246476193961540404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6246476193961540404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6246476193961540404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6246476193961540404'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/biztalk-xml-complex-types.html' title='BizTalk Xml Complex Types'/><author><name>Evan Aussenberg</name><uri>http://www.blogger.com/profile/17129558867483067370</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_-MTm07-azhE/SUTDiV4tePI/AAAAAAAAANQ/vAADNpJHIro/S220/Gray+Sport+Headshot+Full.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/evan.aussenberg/SGIVjnOmB5I/AAAAAAAAADc/kVYezrYYLXs/s72-c/image001_thumb%5B1%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-4961941412679681234</id><published>2008-06-23T19:44:00.001-05:00</published><updated>2008-12-10T17:08:33.963-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='BRE'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Rules Engine'/><title type='text'>BRE and XML Node Creation</title><content type='html'>On a recent project, I was tasked with using Business Rules Engine (BRE) to call a list of BRE Policies. These policies could generate a number of results, or triggers, the number of results was not known until runtime. BRE can update existing XML nodes within the Fact document, however, it cannot create nodes that do not already exist.&lt;br /&gt;&lt;br /&gt;To solve this issue, I decided to add a serializable .NET object to pass in as a fact. The object has a public method that is used to create trigger objects and add them to the object's collection. Upon return from the BRE call, the raw xml of the object is exposed through it's XmlString property.&lt;br /&gt;&lt;br /&gt;First we will talk about the Trigger class. This class represents our result. It is very generic and thus flexible in its use. The TimeStamp field can be used to track the time the trigger was created. We use the InterfaceName field for routing purposes. The Action and SubAction fields can optionally be used to further differentiate the trigger from other triggers during routing. The other section of the Trigger is a collection of Parameters. This is where a list of key-value pairs can be stored for use in processing. We expose a method to add a parameter key-value to the Parameters collection.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_j1J3rD8z2A0/SGDoqSqBkKI/AAAAAAAAAAU/PmKf4qZTxpY/s1600-h/Trigger.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_j1J3rD8z2A0/SGDoqSqBkKI/AAAAAAAAAAU/PmKf4qZTxpY/s400/Trigger.jpg" alt="" id="BLOGGER_PHOTO_ID_5215424181755285666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The PolicyResults class is a collection of Trigger objects. We expose a CreateTrigger method in order to be able to create Trigger objects on-the-fly from BRE. We also expose two utility properties, Count and XmlString. The Count property returns the number of Trigger objects in the collection. The XmlString property returns the raw XML version of the collection. This property can be loaded into an XmlDocument class and assigned to and XLang message easily.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_j1J3rD8z2A0/SGDpAuPgNZI/AAAAAAAAAAc/FVKZINVkWkk/s1600-h/PolicyResults.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_j1J3rD8z2A0/SGDpAuPgNZI/AAAAAAAAAAc/FVKZINVkWkk/s400/PolicyResults.jpg" alt="" id="BLOGGER_PHOTO_ID_5215424567117362578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We use this setup when calling BRE by first creating a PolicyResults object and passing it into BRE as a fact. Next, when creating policies in BRE, we can call the CreateTrigger method in the Assert section of any Rules we create. If the Assert is executed the Trigger(s) will be created and added to our PolicyResults. Once the BRE call is complete we can return the PolicyResults as a string (or XmlDocument) to the calling orchestration, where can be used for processing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-4961941412679681234?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/4961941412679681234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=4961941412679681234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4961941412679681234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/4961941412679681234'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/bre-and-xml-node-creation.html' title='BRE and XML Node Creation'/><author><name>Jason Petrin</name><uri>http://www.blogger.com/profile/03821658529282328459</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_j1J3rD8z2A0/SGDoqSqBkKI/AAAAAAAAAAU/PmKf4qZTxpY/s72-c/Trigger.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-8240729464088373565</id><published>2008-06-23T14:43:00.000-05:00</published><updated>2008-12-10T17:08:34.098-05:00</updated><title type='text'>R2-AS2 POC</title><content type='html'>&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;R2 AS2 POC&lt;/span&gt; &lt;/strong&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;strong&gt; &lt;/div&gt;&lt;/strong&gt;Sometime back, I worked on a AS2 POC(proof of concept) using BizTalk 2006 R2. Here is a high level overview of VAN/BizTalk interaction, Party configuration, AS2 and EDI receive/send ports configuration in R2, to generate decrypted EDI files and 997s.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5215167100304453810" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 405px; CURSOR: hand; HEIGHT: 160px; TEXT-ALIGN: center" height="182" alt="" src="http://1.bp.blogspot.com/_udW_oAaKygE/SF_-2LnzcLI/AAAAAAAAANI/z7Dnx0YqS00/s400/AS2Com.jpg" width="400" border="0" /&gt; &lt;p&gt;BizTalk Server 2006 R2 makes use of many components to successfully establish communication between VAN(Value Added Network) provider and their customers. In this proof of concept, to receive and send EDI messages, AS2(Applicability Statement 2) components and HTTP adapter components are primarily used.&lt;br /&gt;BizTalk AS2 receive processing is performed using the AS2 receive pipelines. There are two types of AS2 pipelines available in R2. AS2EdiReceive pipeline to process EDI messages received over AS2 and AS2Receive pipeline to process messages that are not encoded in EDI. AS2 pipelines are also responsible for generating MDNs(Message Disposition Notification).&lt;br /&gt;In the above diagram, a request-response HTTP Two-Way adapter is configured to receive messages from VAN. AS2 receive pipeline generates the MDN and routes it to the BizTalk MessageBox database. This MDN will be automatically picked up by the AS2Send pipeline which is part of the HTTP Two-Way adapter. AS2 receive pipeline uses the BizTalk S/MIME pipeline component to provide S/MIME decoding functionality. AS2 Decoder processes the incoming message AS2/HTTP headers, verifies the signature and decrypts the encrypted messages. After successful decryption, AS2 disassembler generates a MDN and sets the correlation tokens and properties on the MDN.&lt;br /&gt;In the case of EDI messages, EDI disassembler will parse the message and generates corresponding EDI document and 997 acknowledgements.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Party Configuration:&lt;/strong&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a new party using the BizTalk Administrator explorer&lt;/li&gt;&lt;li&gt;Enter appropriate values in the Organization, Name and Value fields under the values. I used EDIINT-AS2, AS2-From and partner name respectively. Hint: AS2 functionality resolves the incoming messages party information based on the AS2-From and AS2-To values in the Aliases tab &lt;/li&gt;&lt;li&gt;Next step is to set signing and encryption, MDN generation request properties for a given message &lt;/li&gt;&lt;li&gt;Right click on the party to select AS2 properties, select Party as AS2 message receiver&lt;br /&gt;Leave the default values selected and make sure Sign message and Encrypt message check boxes are selected under Outbound AS2 message. I selected DES3, Application/EDI-X12 and also entered AS2-From and As2-To values, selected ‘Request MDN’ check box &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;HTTP Two-Way port configuration&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a Request-Response receive port/location to process AS2 messages and generate MDN response&lt;/li&gt;&lt;li&gt;Select HTTP as transport type and select AS2EDIReceive as receive pipeline and AS2Send as send pipeline&lt;/li&gt;&lt;li&gt;Create a send port to send raw data and go back to the party you created earlier to select this send port using the party administration&lt;/li&gt;&lt;li&gt;Select Certificate in the send port to apply certificate thumbprint for encrypting messages&lt;/li&gt;&lt;li&gt;Create another send port to send pay load messages (EDI messages). In this case, selected file transport type to send EDI files to local folder and make sure to set EDISend as the send pipeline &lt;/li&gt;&lt;li&gt;Enter receive port name and select EDIintAS.IsAS2PayloadMessage == True in the send port filter. This fileter values allows us to decrypt EDI messages and creates message files as specified in the Transport Type&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;997 Configuration&lt;/strong&gt;: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a new send port to create 997 files, selected File as Transport Type &lt;/li&gt;&lt;li&gt;Set the filter for 997 messages and set filter BTS.MessageType = &lt;a href="http://schemas.microsoft.com/Edi/X12#X12_997_Root"&gt;http://schemas.microsoft.com/Edi/X12#X12_997_Root&lt;/a&gt;&lt;br /&gt;Set EDISend as send pipeline &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Certificate Management&lt;/strong&gt;:&lt;br /&gt;It turned out the most important part of the POC was to have valid certificates and configured it right. I obtained a trial certificate from VeriSign. Note, you can also use windows generated certificate too. In a nut shell, for the encryption/decryption of the messages over AS2, I followed the Certificate configuration as described in this KB article: &lt;a href="http://support.microsoft.com/?id=942253"&gt;http://support.microsoft.com/?id=942253&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-8240729464088373565?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/8240729464088373565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=8240729464088373565' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8240729464088373565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/8240729464088373565'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/r2-as2-poc.html' title='R2-AS2 POC'/><author><name>Harish Bidadi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_udW_oAaKygE/SF_-2LnzcLI/AAAAAAAAANI/z7Dnx0YqS00/s72-c/AS2Com.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6183532269336066506</id><published>2008-06-23T13:06:00.001-05:00</published><updated>2008-06-23T13:13:01.431-05:00</updated><title type='text'>Using BAM API’s in a BizTalk Solution</title><content type='html'>Recently, I had a requirement where I needed to track a subset of messages flowing through an ESB to capture and store key data points to a table along with the raw Xml of the message. The data was going to be used by the client for viewing and reporting.&lt;br /&gt;&lt;br /&gt;After a couple of small POC’s, it was decided to leverage BAM API’s in order to persist the data. BAM comes with OOB functionality to capture and display data elements through the BAM portal. Additionally, after defining an &lt;em&gt;Observation Model&lt;/em&gt; using the Excel plug-in, the BAM definition is then deployed which creates Sql Server tables, stored procedures and views in order to persist and update the tables.&lt;br /&gt;&lt;br /&gt;But, OOB functionality does not support capturing and persisting of the underlying Xml or provide content based filtering, so as part of the POC, the BAM API’s were used to store the Xml.&lt;br /&gt;&lt;br /&gt;A C# component was written to use the &lt;em&gt;OrchestrationEventStream&lt;/em&gt; class from the BAM API. This class is designed to asynchronously write data into the BAMPrimaryImport database as well as provide transactional consistency when used from either an orchestration or pipeline.&lt;br /&gt;&lt;br /&gt;For this particular solution that I was working on, the messages that needed to be tracked were already being consumed by a generic Data Archive orchestration. This orchestration was then modified to contain a Decision Shape that would filter based on configurable conditions to capture the required content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6183532269336066506?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6183532269336066506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6183532269336066506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6183532269336066506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6183532269336066506'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/06/using-bam-apis-in-biztalk-solution.html' title='Using BAM API’s in a BizTalk Solution'/><author><name>Dean Pennypacker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-6521590246725919237</id><published>2008-05-22T09:28:00.000-05:00</published><updated>2008-05-22T09:29:38.335-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RFID'/><title type='text'>RFID Presentation at MICSUG, Reston VA</title><content type='html'>&lt;span&gt;This week I presented on Microsoft BizTalk RFID at the MICSUG (Microsoft Integration and Connected Systems User Group) for the Washington, DC area.  The presentation was held at the Microsoft office in Reston.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;The main topics that were addressed were architecture of the RFID code base, RFID as a platform, and case studies which demonstrated significant ROI’s.  In addition we discussed how RFID and BizTalk work together.&lt;br /&gt;&lt;br /&gt;RFID demonstrates a big step forward in BizTalk Server’s capabilities because it now enables connectivity to actual devices rather than software to software transactions which are traditional means of using BizTalk.  It’s a brand new paradigm and the audience sensed the shift as the realization that almost any device can be tied into an enterprise using BizTalk.&lt;br /&gt;&lt;br /&gt;Exciting times.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-6521590246725919237?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/6521590246725919237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=6521590246725919237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6521590246725919237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/6521590246725919237'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/05/rfid-presentation-at-micsug-reston-va.html' title='RFID Presentation at MICSUG, Reston VA'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-7487916097200724494</id><published>2008-03-12T15:35:00.000-05:00</published><updated>2008-03-12T15:37:52.028-05:00</updated><title type='text'>Link to BizTalk case studies</title><content type='html'>Often times I am asked for reference case studies for potential BizTalk projects. And then comes that moment when I can't find the link to them!&lt;br /&gt;&lt;br /&gt;Well, here it is. This part of the Microsoft.com site contains over 200 case studies related to BizTalk and has been updated with many new cases related to BizTalk 2006.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/casestudies/search.aspx?ProTaxID=1265"&gt;http://www.microsoft.com/casestudies/search.aspx?ProTaxID=1265&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-7487916097200724494?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/7487916097200724494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=7487916097200724494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7487916097200724494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/7487916097200724494'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2008/03/link-to-biztalk-case-studies.html' title='Link to BizTalk case studies'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116778627343533147</id><published>2007-01-02T19:51:00.000-05:00</published><updated>2007-01-02T20:04:33.450-05:00</updated><title type='text'>HIPAA Support in BizTalk 2006 R2</title><content type='html'>&lt;p&gt;HIPAA support in BizTalk has always required the purchase, installation and use of the HIPAA accelerator. I've recently learned that the upcoming release of BizTalk 2006 R2 (scheduled sometime in the June 2007 timeframe) will bundle HIPAA support out of box. A main feature of BizTalk 2006 R2 is to provide native EDI support for transaction sets such as X12. HIPAA is simply a collection of specific X12 transaction sets. As such, its a natural enhancement to support HIPAA out of the box. The following is the current list of transaction sets to be supported as described in the Biztalk b2b blog on msdn located at: (&lt;a href="http://blogs.msdn.com/biztalkb2b/archive/2006/12/31/hipaa-support-in-biztalk-server-2006-r2.aspx"&gt;http://blogs.msdn.com/biztalkb2b/archive/2006/12/31/hipaa-support-in-biztalk-server-2006-r2.aspx&lt;/a&gt;). &lt;/p&gt;&lt;ul&gt;&lt;li&gt;key HIPAA 4010A transaction set schemas:&lt;br /&gt;- 270/271 - Eligibility&lt;br /&gt;- 276/277 - Claim Status&lt;br /&gt;- 278 - Services Review Request/Response&lt;br /&gt;- 820 - Payroll Deduction&lt;br /&gt;- 834 - Benefit Enrollment&lt;br /&gt;- 835 - Claim Payment&lt;br /&gt;- 837D - Claim Dental&lt;br /&gt;- 837I - Claim Institutional&lt;br /&gt;- 837P - Claim Professional &lt;/li&gt;&lt;li&gt;ten other non-HIPAA standard schemas that are widely used in the HIPAA realm, including but not limited to:&lt;br /&gt;- v3070 277 Healthcare Payer Unsolicited Claim Status&lt;br /&gt;- v4010 148 Doctor's First Report of Injury&lt;br /&gt;- v4040 277 Healthcare Claim Acknowledgement&lt;br /&gt;- v4050 274 Healthcare Provider Information &lt;/li&gt;&lt;li&gt;a schema annotation which enables splitting a multiple part document (e.g. a 837 Claim that has many individual claims) into separate transactions, one for each individual document. This feature is enabled by an annotation called 'subdocument_break'. When assigned a value of "yes" it will split an inbound transaction into individual transaction sets based on the number of documents included in the original transaction set. For example, an inbound 837D with three separate claims in it would be split into three separate 837D transaction sets with all of the appropriate header information included in each. &lt;/li&gt;&lt;li&gt;WEDI/SNIP level 2 validation which includes basic X12 syntax integrity as well as validation of loops, segments, elements and code values. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116778627343533147?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116778627343533147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116778627343533147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116778627343533147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116778627343533147'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2007/01/hipaa-support-in-biztalk-2006-r2.html' title='HIPAA Support in BizTalk 2006 R2'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116716352003924827</id><published>2006-12-26T14:40:00.000-05:00</published><updated>2007-04-25T07:31:20.271-05:00</updated><title type='text'>Microsoft introduces an ESB for BizTalk</title><content type='html'>An Enterprise Service Bus (ESB) will be available for BizTalk around the time of the release of R2.&lt;br /&gt;&lt;br /&gt;An ESB, a collection of architectural patterns based on traditional Enterprise Application Integration (EAI) principles, is an often developed solution with BizTalk. Now, a set of ESB related building blocks will be made available to speed up the design and development process.&lt;br /&gt;&lt;br /&gt;Officially called ESB Guidance, the new package contains architectural guidance, patterns and practices, and BizTalk Server and .NET components. Microsoft ESB Guidance currently consists of a number of BizTalk projects including:&lt;br /&gt;&lt;br /&gt;ESB Core Engine (transformation and routing agents)&lt;br /&gt;ESB Core Services (dynamic transformation, dynamic endpoint resolution/UDDI)&lt;br /&gt;ESB Portal framework&lt;br /&gt;Exception Management framework&lt;br /&gt;ESB Client application&lt;br /&gt;Namespace Resolution pipeline component&lt;br /&gt;&lt;br /&gt;Currently, select partners, customers building an ESB and Microsoft employees can download and try the new early access release. The release contains:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ESB Developer Guide&lt;/strong&gt;&lt;br /&gt;This document introduces architects and developers to ESB architectural concepts as addressed by the guidance, describes the installation procedures for the reference implementation, and explains the functionality of the guidance components through a set of commonly accepted ESB use cases.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ESB Reference Implementation VPC&lt;/strong&gt;&lt;br /&gt;This Virtual PC image provides a fully functional instance of the ESB Reference Implementation for evaluation, technical readiness, proof of concept, and demo purposes. The MQSeries 5.3 Trial edition and CSD12 can be installed optionally. The installation for these can be found at the root of C:\Projects within the VPC. Once you install MQSeries, then you can install the JMS Pipeline component MSI package within the VPC.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ESB Reference Implementation Redistributable&lt;/strong&gt;&lt;br /&gt;The redistributable contains installation scripts and .MSI installers for the ESB Reference Implementation components.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ESB Positioning Presentation&lt;/strong&gt;&lt;br /&gt;This presentation describes Microsoft’s platform value to customers evaluating ESB vendor offerings and the capabilities offered by the Application Platform and the ESB Guidance package.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ESB Patterns Technical Presentation&lt;/strong&gt;&lt;br /&gt;This presentation provides an introduction to ESB patterns and capabilities as implemented in the ESB Guidance package.&lt;br /&gt;&lt;br /&gt;Microsoft ESB Guidance should be released in the 3rd quarter of 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116716352003924827?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116716352003924827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116716352003924827' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116716352003924827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116716352003924827'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/12/microsoft-introduces-esb-for-biztalk.html' title='Microsoft introduces an ESB for BizTalk'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116680266056296786</id><published>2006-12-22T10:46:00.000-05:00</published><updated>2006-12-22T10:51:36.060-05:00</updated><title type='text'>SOA: not just a buzzword</title><content type='html'>Over the last couple of years while the concept of Service Oriented Architecture has evolved I often worried that it would just become another buzzword that would become serially dismissed after a few years in the spotlight.&lt;br /&gt;&lt;br /&gt;An interesting article popped up on ZDNet earlier this week which proves there is benefit to be had by adopting the principles associated with SOA. Big hitters like &lt;strong&gt;Ebay&lt;/strong&gt;, &lt;strong&gt;HP&lt;/strong&gt;, and &lt;strong&gt;Amazon&lt;/strong&gt; are all adopting the principles of service orientation and in the process cutting costs and streamlining their enterprises. For an interesting read, check out the full article:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.zdnet.com/service-oriented/?p=781"&gt;http://blogs.zdnet.com/service-oriented/?p=781&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116680266056296786?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116680266056296786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116680266056296786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116680266056296786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116680266056296786'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/12/soa-not-just-buzzword.html' title='SOA: not just a buzzword'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116124291765751864</id><published>2006-10-19T02:16:00.000-05:00</published><updated>2006-10-19T02:28:37.746-05:00</updated><title type='text'>BizTalk Tips and Tricks – Promoting properties from a collection.</title><content type='html'>Only non-repeatable fields can be easily promoted from within the schema editor. At the end of the day however it’s simply an xpath statement. In rare cases, if you need to promote a repeatable field from a collection, you can simply modify the xpath contained within the schema and change the xpath to point to a specific index within the collection. Internally, BizTalk simply applies the xpath to the message when its time to promote the data. There is no reason why the xpath couldn’t be restructured to evaluate to a field within a collection at a given index (such as 0). The need might be rare, but it can be done if needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116124291765751864?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116124291765751864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116124291765751864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116124291765751864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116124291765751864'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/10/biztalk-tips-and-tricks-promoting.html' title='BizTalk Tips and Tricks – Promoting properties from a collection.'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116124058270914546</id><published>2006-10-19T01:08:00.000-05:00</published><updated>2006-10-19T01:49:42.726-05:00</updated><title type='text'>BizTalk Best Practice - Message Decoupling in Orchestrations</title><content type='html'>Have you ever found it annoying to change message schema types in an orchestration when the orchestration designer forces you to disconnect or unwire all the shapes that reference the message? There is a clever way around this and in the end, it promotes good design and adds another layer of decoupling and indirection to your messages in orchestrations.&lt;br /&gt;&lt;br /&gt;Define all of your Messages in an orchestration from Multipart Schema Types. &lt;br /&gt;&lt;br /&gt;If you create a message from a schema and assign it to a receive shape and that receive shape is connected to a logical port, if you need to change that message type, you need to first disconnect the “wire” between the receive shape and the port before the designer allows you the change the message type. Imagine if the message was referenced by lots ports and shapes. You would need to disconnect all of them and that could be a real pain.&lt;br /&gt;&lt;br /&gt;If on the other hand you create a multipart message type for each schema and create each message in the orchestration from the appropriate multipart message type, you don’t need to unwire the various references to the message if you need to change the underlying schema type of a message. This might not be directly obvious, adds an abstraction layer around your message types and enhances overall maintainability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116124058270914546?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116124058270914546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116124058270914546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116124058270914546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116124058270914546'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/10/biztalk-best-practice-message.html' title='BizTalk Best Practice - Message Decoupling in Orchestrations'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116123803698195914</id><published>2006-10-19T01:03:00.000-05:00</published><updated>2006-10-19T01:07:16.986-05:00</updated><title type='text'>BizTalk 2006 – Deep Technical Training</title><content type='html'>I’m attending an internal BizTalk 2006 deep dive training session given by one of the BizTalk product team members at Microsoft who is close to the product internals and has lots of practical knowledge. It’s being held for both Microsoft and Virtual Technical Specialists. It’s not your typical deep dive and focuses heavily on architecture, farms, high availability, best practices, tuning, internals, considerations when designing solutions, and more. It’s been a long, but very cool week so far. &lt;br /&gt;&lt;br /&gt;As time permits, I’ll begin posting interesting things we’ve discussed along the way. You might not come across anything new, but if you do, great! Most are common sense and good engineering practices; however others could be things you simply haven’t thought about yet or practices you haven’t followed. Given the flexibility and breadth of the product there are always going to be new things to consider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116123803698195914?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116123803698195914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116123803698195914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116123803698195914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116123803698195914'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/10/biztalk-2006-deep-technical-training.html' title='BizTalk 2006 – Deep Technical Training'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116097869362031971</id><published>2006-10-16T00:57:00.000-05:00</published><updated>2006-10-16T01:04:53.866-05:00</updated><title type='text'>BizTalk Server 2006 Documentation Update</title><content type='html'>Microsoft released an update to the BizTalk Server 2006 documentation on 10/10/2006. It can be found here &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3294DDAF-9F67-409F-A92D-2F6070DC0D1A&amp;displaylang=en"&gt;BizTalk 2006 Documentation Update&lt;/a&gt; (41.6 MB)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;br /&gt;In this Help Update, you'll find the following content:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Complete documentation for all BizTalk Server Line of Business Adapters, including new tutorials, one for each adapter. See the section "Using Adapters." &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Troubleshooting guidance for each of the native BizTalk adapters. See the section "Troubleshooting Adapters."&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Troubleshooting Instructions for how to capture a memory dump. See the section "How to Capture a Memory Dump of a BizTalk Process." &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Disaster recovery instructions for backing up and restoring your BizTalk Server and databases. See the section "Backing Up and Restoring BizTalk Server" &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Updated Tutorials. See the section, "BizTalk Server 2006 Tutorials"&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Information for improving fault tolerance. See the section "Planning and Architecture" &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Updated Developer's Reference that now includes the BAM namespaces that were not included in the RTM documentation. See the section "Developer's Reference"&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116097869362031971?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116097869362031971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116097869362031971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116097869362031971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116097869362031971'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/10/biztalk-server-2006-documentation.html' title='BizTalk Server 2006 Documentation Update'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-116096735890392241</id><published>2006-10-15T21:52:00.000-05:00</published><updated>2006-10-15T21:55:58.910-05:00</updated><title type='text'>BizTalk 2006 R2 B2B/EDI WebLog</title><content type='html'>The Microsoft BizTalk Product Development team is launching the B2B/EDI WeBlog on the MSDN platform to communicate feature/functionality relating to EDI, AS2 and HIPAA in BizTalk Server 20006 R2. Key objective of the blog is to increase product awareness and also assist with partner readiness thereby leading to a successful launch of the EDI Technology in R2.&lt;br /&gt;&lt;br /&gt;The blog can be found here &lt;a href="http://blogs.msdn.com/BizTalkB2B/"&gt;http://blogs.msdn.com/BizTalkB2B/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-116096735890392241?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/116096735890392241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=116096735890392241' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116096735890392241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/116096735890392241'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/10/biztalk-2006-r2-b2bedi-weblog.html' title='BizTalk 2006 R2 B2B/EDI WebLog'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115939490241724898</id><published>2006-09-27T16:59:00.000-05:00</published><updated>2006-10-07T20:00:03.266-05:00</updated><title type='text'>Business Policy Management and the BizTalk Rules Engine</title><content type='html'>Earlier in the year we designed an architecture in which the BizTalk Rules engine was leveraged along with InfoPath, SharePoint and K2.Net to manage business policies in a human to human and human to system workflow solution. The full article can be found (&lt;a href="http://www.rdacorp.com/spotlight/Spotlight%2006%201%20Jan%2011.htm" title="RDA Spotlight JANUARY 11, 2006"&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;here&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;). We found this design to work extremely well in regards to providing an agile approach at managing business process policies in a generic way. Following is a brief fragement of this article.&lt;br /&gt;&lt;br /&gt;RDA leverages the BizTalk Business Rules Engine to manage business policies in document workflow solutions. Document management workflows come in many shapes and sizes. Many of these workflows operate under rigid business policies, which often affect how documents flow through a process or influence decisions along the way.&lt;br /&gt;&lt;br /&gt;Business policies are often fluid. They change with time. Any solution dependent on changing business policies must be agile by design. As such, the rules that govern the policy of a given document workflow needs to be easily maintained without affecting the solution deployed in a running production environment. The BizTalk Business Rules Engine provides just a mechanism.&lt;br /&gt;&lt;br /&gt;The diagram below depicts a workflow system that leverages the rules engine to enforce and manage fluid business policies.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.rdacorp.com/spotlight/Spotlight%2006%201%20Jan%2011.htm"&gt;&lt;img style="DISPLAY: inline; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/5103/3903/320/BPIBizTalkRulesEngine.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Browse all the RDA Spotlight on Business and Technology newsletters here:&lt;br /&gt;&lt;a href="http://www.rdacorp.com/SpotlightNewsletters.htm"&gt;http://www.rdacorp.com/SpotlightNewsletters.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115939490241724898?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115939490241724898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115939490241724898' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115939490241724898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115939490241724898'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/09/business-policy-management-and-biztalk.html' title='Business Policy Management and the BizTalk Rules Engine'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115939222731960589</id><published>2006-09-27T15:07:00.000-05:00</published><updated>2006-10-09T20:12:19.433-05:00</updated><title type='text'>Choosing BizTalk over WebSphere</title><content type='html'>The following is a good whitepaper providing a comparative analysis of Microsoft BizTalk and IBM WebSphere. Note while this whitepaper is a bit dated and BizTalk 2004 centric, its still very much applicable to BizTalk 2006.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/0/1/E/01E77F30-E571-478D-A8F8-F35FE66BD2BD/ChsBPASol.doc"&gt;http://download.microsoft.com/download/0/1/E/01E77F30-E571-478D-A8F8-F35FE66BD2BD/ChsBPASol.doc&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115939222731960589?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115939222731960589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115939222731960589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115939222731960589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115939222731960589'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/09/choosing-biztalk-over-websphere.html' title='Choosing BizTalk over WebSphere'/><author><name>Scott D. McHugh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945578328089852</id><published>2006-03-29T11:02:00.000-05:00</published><updated>2006-09-28T10:03:03.890-05:00</updated><title type='text'>Mapping complex conditions in BizTalk with XSLT</title><content type='html'>Recently I found myself in a situation where I needed to evaluate a set of complex conditions that I could not use the Business Rules Engine for. The BizTalk mapper was able to achieve the conditionality by chaining a series of about 21 functoids together but this became very unmanageable especially since I was combining false statements to see if both were false, then returning a true to an “And” functoid (&amp;) which evaluated another branch as true and passed a result to the node in the destination schema, you get the idea.&lt;br /&gt;&lt;br /&gt;An easier way is to plug in XSLT. There are disadvantages to doing this, the main one being its maintainability and transparency but when faced with the daunting set of functoids described above, it looked a decent option.&lt;br /&gt;&lt;br /&gt;The XSLT function that I used was the &lt;b&gt;&amp;lt;xsl:choose&amp;gt;&lt;/b&gt; statement, inside the statement was a set of conditions which, if true, would return a value/values to the destination schema. In the last part of the statement was the &lt;b&gt;&amp;lt;xsl:otherwise&amp;gt;&lt;/b&gt; condition which could set values if the conditions presented were not valid and you had a default you wanted to present in that event.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="var:vAnnuity"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="count(/*[local-name()='InternalSupport' and namespace-uri()='http://internal_support']/*[local-name()='LoanPartItems' and namespace-uri()='' and Method='Annuity'])"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="var:vLinear"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="count(/*[local-name()='InternalSupport' and namespace-uri()='http://internal_support']/*[local-name()='LoanPartItems' and namespace-uri()='' and Method='Linear'])"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="var:vTotalCount"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="count(/*[local-name()='InternalSupport' and namespace-uri()='http://internal_support']/*[local-name()='PartItems' and namespace-uri()=''])"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="var:vHasValidEndowment"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="count(/*[local-name()='InternalSupport' and namespace-uri()='http://internal_support']/*[local-name()='LoanPartItems' and namespace-uri()='' and isValid ='true'])"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="var:vHasValidId"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="count(/*[local-name()='InternalSupport' and namespace-uri()='http://internal_support']/*[local-name()='Ready' and HasValidId ='true'])"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="LeningSoort"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;="$var:vAnnuity = $var:vTotalCount"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;="$var:vLinear = $var:vTotalCount"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;="($var:vHasValidEndowment = $var:vTotalCount) and ($var:vHasValidId = $var:vTotalCount)"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="4"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Of course each specific case requires different XSLT, but this should provide a framework of how to do this within a functoid.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;To set up the XSLT:&lt;br /&gt;&lt;br /&gt;• Create XSLT similar to the one above which meets your needs&lt;br /&gt;• Drop a scripting functoid on your map&lt;br /&gt;• Connect the output parameter to the node you want to create&lt;br /&gt;• Note: do no include any input parameters, the XSLT is setup already to look them up&lt;br /&gt;• Open the scripting functoid’s, click the (…) inside “Configure Functoid Script”&lt;br /&gt;• Under “Script type” choose “Inline XSLT”&lt;br /&gt;• Paste your XSLT snippet in the text box&lt;br /&gt;&lt;/b&gt;&lt;div style="clear:both; padding-bottom: 0.25em;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945578328089852?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945578328089852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945578328089852' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945578328089852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945578328089852'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/03/mapping-complex-conditions-in-biztalk.html' title='Mapping complex conditions in BizTalk with XSLT'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945566511913171</id><published>2006-03-25T11:00:00.000-05:00</published><updated>2006-09-28T10:01:31.090-05:00</updated><title type='text'>XSLT performance when mapping large documents in BizTalk</title><content type='html'>Recently I had to map a document with many thousand rows.  I could not split the document because before I could split it, the document’s nodes had to be sorted.&lt;br /&gt;&lt;br /&gt;With such large files you generally test it using a small subset to avoid waiting for maps to complete, I built an XSLT which worked great, I thought.&lt;br /&gt;&lt;br /&gt;When you use a select filter such as "not(KeyValue=preceding-sibling::row/ KeyValue)" you end up with a huge performance hit the larger the document gets.  My map went from 2 seconds for 50 rows to 10 minutes for a few thousand.&lt;br /&gt;&lt;br /&gt;How to improve performance when you have large XML files to map that you can’t split?  Try using xsl:key instead, which builds an index of keys from which you can much more efficiently select.&lt;br /&gt;&lt;br /&gt;Here is a sample XSLT that demonstrates how to use the xsl:key:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: maroon;"&gt;xml&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;="1.0"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;="UTF-8"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: maroon;"&gt;xmlns&lt;/span&gt;&lt;span style="color: fuchsia;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;xsl&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://www.w3.org/1999/XSL/Transform"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;="1.0"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: maroon;"&gt;xmlns&lt;/span&gt;&lt;span style="color: fuchsia;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;ns0&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://Conversion.schemas"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:output&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;method&lt;/span&gt;&lt;span style="color: blue;"&gt;="xml"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;indent&lt;/span&gt;&lt;span style="color: blue;"&gt;="no"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:key&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="NumberKey"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;="/*[local-name()='top' and namespace-uri()='http://biztalk/Conversion.schemas']/*[local-name()='row' and namespace-uri()='']"&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;use&lt;/span&gt;&lt;span style="color: blue;"&gt;="keyValue"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;="/"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;ns0:Rows&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="/*[local-name()='top' and namespace-uri()='http://biztalk/Conversion.schemas']/*[local-name()='row' and namespace-uri()='' and generate-id(.) = generate-id(key('NumberKey', keyValue)[1])]"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:variable&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="current_Number"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="keyValue"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Data&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;keyValue&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="$current_Number"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;keyValue&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="//row[keyValue=$current_Number]"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;Part&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;PartID&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;="nr_data"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;PartID&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Part&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;Data&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:for-each&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;ns0:Rows&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both; padding-bottom: 0.25em;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945566511913171?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945566511913171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945566511913171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945566511913171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945566511913171'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/03/xslt-performance-when-mapping-large.html' title='XSLT performance when mapping large documents in BizTalk'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945547964445881</id><published>2006-03-13T10:57:00.000-05:00</published><updated>2006-09-28T09:58:29.390-05:00</updated><title type='text'>You can evaluate dates using the Cumulative Maximum Functoid</title><content type='html'>Dates you say? Stop the press!&lt;br /&gt;&lt;br /&gt;I had a situation where there was a node whose max occurs is unbounded and I needed to extract a single node from it to map to a destination node whose max occurs is one.&lt;br /&gt;&lt;br /&gt;The problem was that I had to choose the node to map with the highest (newest) date:&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;lt;testdate&amp;gt;01-01-2000&amp;lt;testdate&amp;gt;&lt;br /&gt;&amp;lt;testdata&amp;gt;a&amp;lt;testdata&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;lt;testdate&amp;gt;01-01-2002&amp;lt;testdate&amp;gt;&lt;br /&gt;&amp;lt;testdata&amp;gt;c&amp;lt;testdata&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;lt;testdate&amp;gt;01-01-2001&amp;lt;testdate&amp;gt;&lt;br /&gt;&amp;lt;testdata&amp;gt;b&amp;lt;testdata&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;br /&gt;In the case above, I want the node with the highest &amp;lt;testval&amp;gt;, or 01-01-2002, therefore I want to map &amp;lt;testdata&amp;gt;c&amp;lt;testdata&amp;gt; to the destination node.&lt;br /&gt;&lt;br /&gt;This can actually be done.&lt;br /&gt;&lt;br /&gt;What I did was convert my date to ticks in a scripting functoid:&lt;br /&gt;&lt;br /&gt;public string toTicks(string param1)&lt;br /&gt;{&lt;br /&gt;DateTime dt = DateTime.Parse(param1);&lt;br /&gt;return dt.Ticks.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Afterwards I connected the scripting functoid to the cumulative max functoid.&lt;br /&gt;&lt;br /&gt;Then I evaluate the output of the scripting functoid with the cumulative max functoid with an Equals functoid.&lt;br /&gt;&lt;br /&gt;This should work for any set of repeating dates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945547964445881?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945547964445881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945547964445881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945547964445881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945547964445881'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/03/you-can-evaluate-dates-using.html' title='You can evaluate dates using the Cumulative Maximum Functoid'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945538693881031</id><published>2006-03-04T10:55:00.000-05:00</published><updated>2006-09-28T09:56:26.946-05:00</updated><title type='text'>BizTalk's mapper allows drag and drop replace</title><content type='html'>I learned a little trick the other day about the mapper which I have never seen documented. It works for BizTalk 2004 and also 2006.&lt;br /&gt;&lt;br /&gt;Have you ever had to change a functoid and gone thru the task of dragging the new functoid onto the grid and then reconnecting all of the lines, then having to check to make sure you got them all in order?&lt;br /&gt;&lt;br /&gt;Well, what I realized quite by accident is that you can actually just drag the new functoid over the one you want to replace and all your links will maintain themselves. The old functoid will disappear and be replaced by the new one.&lt;br /&gt;&lt;br /&gt;Of course there is a limitation when you have different maximum inputs, etc, but for the most part this works with everything else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945538693881031?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945538693881031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945538693881031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945538693881031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945538693881031'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/03/biztalks-mapper-allows-drag-and-drop.html' title='BizTalk&apos;s mapper allows drag and drop replace'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945530694601416</id><published>2006-02-25T10:53:00.000-05:00</published><updated>2006-09-28T09:55:06.956-05:00</updated><title type='text'>Blogging about .NET?  Then this is a must have tool</title><content type='html'>&lt;p&gt;I’ve found a tool recently that will make blogging about BizTalk easier. It’s been around for a while but if you are like me and have never heard of it before, CopySourceAsHtml is very useful.&lt;/p&gt;&lt;p&gt;If you have been in the situation of wanting to post a code or XSLT snippet onto your blog and found yourself writing HTML to make it look like it does in Visual Studio (or resort to screen shots) then fret no more, &lt;strong&gt;CopySourceAsHtml will take anything that you can open in VS (source code related) and convert it to HTML for you&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The tool is written by Colin Coller and can be downloaded on the &lt;a href="http://www.jtleigh.com/CopySourceAsHtml/"&gt;CopySourceAsHtml homepage&lt;/a&gt;. In addition, &lt;a href="http://www.jtleigh.com/people/colin/blog/"&gt;Colin has a blog&lt;/a&gt; which updates progress on the tool. I read that a VS 2005 version is soon to be ready.&lt;br /&gt;&lt;br /&gt;A couple of tips when using it:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;After installing you should be able to open any C# source code page, highlight and right click a code snippet and see a new “Copy as HTML” item on the menu. But, if for example you want to copy XSLT, the item doesn’t show up. Use the edit menu instead.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When you copy something as HTML, under general, uncheck the “Number lines from:” box unless you really want them and also check the “Embed styles” box since blog tools/some browsers wont recognize the style sheet that gets created. Embeding the style makes it a simpler operation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945530694601416?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945530694601416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945530694601416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945530694601416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945530694601416'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/02/blogging-about-net-then-this-is-must.html' title='Blogging about .NET?  Then this is a must have tool'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945492445604507</id><published>2006-02-03T10:47:00.000-05:00</published><updated>2006-09-28T09:48:44.456-05:00</updated><title type='text'>Easier way to add a DLL to the GAC</title><content type='html'>Often in BizTalk you’ll need to add assemblies to the Global Assembly Cache. In the past I had used a shortcut on my Quick Launch toolbar which opened the GAC, then I’d drop the assembly inside, but there is an easier way.&lt;br /&gt;&lt;br /&gt;A registry key can be created which allows you to right click the DLL and “GAC it” in one click.&lt;br /&gt;&lt;br /&gt;The text for the key is below; simply copy/paste it into notepad and save it as a registry file (.reg). Then double click the file to add it to the registry.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#990000;"&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\dllfile\shell\gacutil\command]&lt;br /&gt;@="c:\\windows\\Microsoft.NET\\Framework\\v1.1.4322\\gacutil.exe /i \"%1\""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can also download the &lt;a href="http://onlinetransmissions.com/fla/Right_Click_gacutil.zip"&gt;Gacutil right-click key as a zip file here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945492445604507?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945492445604507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945492445604507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945492445604507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945492445604507'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/02/easier-way-to-add-dll-to-gac.html' title='Easier way to add a DLL to the GAC'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945478275771740</id><published>2006-01-31T10:45:00.000-05:00</published><updated>2006-09-28T09:46:22.756-05:00</updated><title type='text'>BizTalk exception handling with web services</title><content type='html'>Recently I needed to include exception handling in a web service call to an external party. I learned a couple of things and thought I’d highlight them here.&lt;br /&gt;&lt;br /&gt;Exception handling doesn’t always behave the way you expect when you are trying to catch exceptions when calling a web service. While using one is very useful some things must be considered or you will not get the result you wanted.&lt;br /&gt;&lt;br /&gt;Here is one way to do it as well as a few things to keep in mind when you want to set one up:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Include the external web service call (both send and receive shapes) in either a non-transactional scope shape or a long running transaction.&lt;/li&gt;&lt;li&gt;Decide if you need to catch any specific exceptions, if you don’t, using the General Exception will suffice. If you need to catch specific errors, you can use multiple catch exception blocks.&lt;/li&gt;&lt;li&gt;It may sound obvious to say this, but make sure your orchestration doesn’t have a timeout that is the same length (or shorter) than the timeout of your scope transaction.&lt;/li&gt;&lt;li&gt;Most important: in your send port which holds the reference to the web service, make sure you are not using any retries (unless, of course, you explicitly need to). If the web service fails with an error such as “&lt;em&gt;There is an error in XML document (5, 10)&lt;/em&gt;” and you have retries enabled you will only see warnings in your event viewer (which means the exception block won’t be activated until the SOAP timeout).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945478275771740?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945478275771740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945478275771740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945478275771740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945478275771740'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/01/biztalk-exception-handling-with-web.html' title='BizTalk exception handling with web services'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945469566198510</id><published>2006-01-21T10:43:00.000-05:00</published><updated>2006-09-28T09:44:55.666-05:00</updated><title type='text'>"multiple schemas match the message type"may be caused by web services</title><content type='html'>I was stuck recently with what seemed like a pair of contradictory errors.&lt;br /&gt;&lt;br /&gt;I had an application deployed which was exposed as a web service. To test the application we built a test harness which picked up a flat file and called the web service for us and then dumped the result on the file system to see the result.&lt;br /&gt;&lt;br /&gt;This testing system worked fine until I needed to use that same deployed schema to do some additional messaging. I wanted to route a message via a receive port and have a send port subscribe to it, then map the message to a new format and deliver it to a destination. Pretty simple, right?&lt;br /&gt;&lt;br /&gt;Well, no. When I have my project deployed I got the following error when routing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive" Source: "XML disassembler" Receive Location: " D:\dat\FileReceive\RoundTrip\*.xml Reason: &lt;strong&gt;Cannot locate document specification as multiple schemas match the message type&lt;/strong&gt; "&lt;/em&gt;&lt;/span&gt;&lt;a href="http://bo.get.ev2/#Method/"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;http://BO.Get.EV2#Method&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;".&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That error left me scratching my head. It means I probably have the schema deployed twice, right? I didn't, so I thought. When I undeployed the application the messaging engine could no longer match my message type:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive" Source: "XML disassembler" Receive Location: "D:\dat\FileReceive\RoundTrip\*.xml"&lt;br /&gt;Reason: &lt;strong&gt;Finding document specification by message type "&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;a href="http://bo.get.ev2/#Method/"&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;&lt;strong&gt;http://BO.Get.EV2#Method&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;em&gt;&lt;strong&gt;" failed. Verify that the schema is deployed properly&lt;/strong&gt;.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I deployed the project with the schemas, everything suddenly worked fine. That means that, somewhere, the schema was again deployed.&lt;br /&gt;&lt;br /&gt;So I looked thru the BizTalk Server Assemblies viewer and discovered that the web reference which existed in my test harness was the culprit. The messaging engine recognized the web reference as a second deployment of my schema. This was technically accurate but rather frustrating to find. I've seen so many of these errors posted on the newsgroups that I thought I'd mention this as a possible cause.&lt;br /&gt;&lt;br /&gt;If you are using test harnesses coupled with web services be aware that your schema is actually deployed twice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945469566198510?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945469566198510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945469566198510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945469566198510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945469566198510'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/01/multiple-schemas-match-message-typemay.html' title='&quot;multiple schemas match the message type&quot;&lt;br&gt;may be caused by web services'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945462409602327</id><published>2006-01-12T10:42:00.000-05:00</published><updated>2006-09-28T09:43:44.096-05:00</updated><title type='text'>Fully qualified name differs for XSD’s with multiple root nodes in the Business Rules Engine</title><content type='html'>&lt;p&gt;One of the most common problems that exist when using the business rules engine is forgetting to use the fully qualified name from a schema in definition of the rule.&lt;/p&gt;&lt;p&gt;&lt;a href="http://groups.google.com/group/microsoft.public.biztalk.general/browse_thread/thread/141b23f8d1eb4f76/07468d8f77701e96?lnk=st&amp;q=biztalk+ba+rules+engine+fully+qualified&amp;amp;amp;amp;rnum=4&amp;amp;hl=en#07468d8f77701e96" target="_blank"&gt;Posts like this on Google Groups can clarify what I mean&lt;/a&gt; if what I am talking about is not clear.&lt;/p&gt;&lt;p&gt;I have discovered something new regarding the fully qualified name which caught me out this morning and I thought I’d mention it here in case you have the same problem. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;If you are using the fully qualified name of a schema with multiple root nodes in the BRE, the fully qualified name must include the name of the root node. &lt;/strong&gt;When you go to your orchestration and try to feed a rules shape your XSD you will find it won’t recognize it (no drop down appears). &lt;/p&gt;&lt;p&gt;For example you can have a schema with multiple root nodes with a fully qualified name such as schma_name_fully_qualified which, with a single root node, would work just fine. But if the schema has multiple root nodes &lt;strong&gt;you must append the specific root node to this qualification for the orchestration to recognize the rule&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;So if you had the fully qualified name schma_name_fully_qualified, look at your orchestration view, click on the message you are using and look at the message type: you will find that you must use something like schma_name_fully_qualified.header to properly identify the schema when creating your business rules. Changing this should then allow you to select a message type in your orchestration.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945462409602327?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945462409602327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945462409602327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945462409602327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945462409602327'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/01/fully-qualified-name-differs-for-xsds.html' title='Fully qualified name differs for XSD’s with multiple root nodes in the Business Rules Engine'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945447050052468</id><published>2006-01-05T10:39:00.000-05:00</published><updated>2006-09-28T09:41:10.503-05:00</updated><title type='text'>How to stop applications from unloading in BizTalk 2004</title><content type='html'>Recently we developed a time sensitive BizTalk application where a simple set of processing steps were invoked via a web service.&lt;br /&gt;&lt;br /&gt;The external calling application (the application calling the BizTalk process) had just 5 seconds to complete its task. Since the BizTalk part was not very complex or resource intensive, we were achieving response times of 1 second, well within the 5 second margin.&lt;br /&gt;&lt;br /&gt;During testing, though, we were getting intermittent timeouts because the BizTalk application was unloading itself from memory and causing the calling application to timeout. Basically it took more than 5 seconds for the unloaded BizTalk application to start itself up again and caused a failure.&lt;br /&gt;&lt;br /&gt;BizTalk relies on a configuration file to store its application information. This config file contains settings for unloading an application from memory and is located at &lt;em&gt;\Program Files\Microsoft BizTalk Server 2004\BTSNTSvc.exe.config&lt;/em&gt;. &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdk/htm/ebiz_prog_orch_jzex.asp" target="_blank"&gt;Full documentation can be found at Microsoft’s website&lt;/a&gt; but &lt;a href="http://onlinetransmissions.com/fla/BTSNTSvc.exe.zip"&gt;here is a working example you can download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By default BizTalk has 2 shutdown settings which are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#ff0000;"&gt;&lt;strong&gt;SecondsIdleBeforeShutdown = 1800 (seconds, or 30 minutes)&lt;br /&gt;SecondsEmptyBeforeShutdown = 1200 (seconds, 20 minutes)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The link below is a sample config file that never shuts down. We are isolating these “hot” processes on a separate server from the “cold” processes (processes that can safely unload). You can run hot and cold side by side as well but that requires more changes in the config file. If you set the &lt;strong&gt;SecondsIdleBeforeShutdown&lt;/strong&gt; and &lt;strong&gt;SecondsEmptyBeforeShutdown to -1&lt;/strong&gt; they will always stay in memory.&lt;br /&gt;&lt;br /&gt;Note that this is increasing the load on the server but for time sensitive situations this could save you a rash of intermittent errors in production. Note also that you shouldn’t do this unless you really need to, unloading saves resources and with most integration scenarios the few seconds it takes to start up are minor.&lt;br /&gt;&lt;br /&gt;You can &lt;strong&gt;backup your current file&lt;/strong&gt;, &lt;a href="http://onlinetransmissions.com/fla/BTSNTSvc.exe.zip"&gt;download this BTSNTSvc.exe.config zip file and extract it&lt;/a&gt;, then stop and start your BizTalk host to see it work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945447050052468?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945447050052468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945447050052468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945447050052468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945447050052468'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/01/how-to-stop-applications-from.html' title='How to stop applications from unloading in BizTalk 2004'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35125468.post-115945506578577491</id><published>2006-01-02T10:49:00.000-05:00</published><updated>2006-09-28T09:51:05.796-05:00</updated><title type='text'>Solving BizTalk "error X2044"</title><content type='html'>I encountered a strange compilation error recently in BizTalk 2004 when importing a web service.&lt;br /&gt;&lt;br /&gt;While I can’t put my finger on the exact cause yet, I do have a fix that works.&lt;br /&gt;&lt;br /&gt;When you see an error message like:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#990000;"&gt;C:\Project\Web References\ExtRef\MyOrch.odx(445,23): error X2044: symbol '@@@@' is already defined; the first definition is in assembly @@@.dll : It may be possible to disambiguate by using fully qualified names.&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;The way to fix this error is to do the following: &lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Open the orchestration in Notepad (In my case MyOrch.odx)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Do a find (Ctrl+F) for “#endif // __DESIGNER_DATA”&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Delete all the code below that line&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Save your file in Notepad&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Say yes when Visual Studio asks if you want to update your file&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Recompile&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The code will not be regenerated until you edit an expression shape, etc. Add a “//” or something and you will then see the code re-appear when you open it in Notepad again.&lt;br /&gt;&lt;br /&gt;I hope this may serve to save someone time, it took a while for me to figure it out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35125468-115945506578577491?l=eaiteamblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eaiteamblog.blogspot.com/feeds/115945506578577491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35125468&amp;postID=115945506578577491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945506578577491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35125468/posts/default/115945506578577491'/><link rel='alternate' type='text/html' href='http://eaiteamblog.blogspot.com/2006/01/solving-biztalk-error-x2044_02.html' title='Solving BizTalk &quot;error X2044&quot;'/><author><name>Isaac Ferreira</name><uri>http://www.blogger.com/profile/05641561687797973615</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
