Monday 23 February 2009

ParallelBranch- Scope Synchronized=True

ParallelBranch- Scope Synchronized=True – How to Skip execution of all branches ?
What is the purpose of using “Synchronized=Ture” at Scope Shape?
When ever you want to use a variable across the Parallel branches you need to set the property for each branch Scope Shape Synchronized=True. In other hand we can say , Sharing a variable across the branches.
Let say you declared a variable “vGlobalVariable” at Orchestration Level and you are trying to update/ Set the value in each/ one of the branch , then you may encounter the below error ( when Synchronized=False – its default property for Scope Shape)
Error :
'vGlobalVariable': if shared data is updated in a parallel then all references in every task must be in a synchronized or atomic scope.

To over come this error you need to set the Synchronized=True. Fine what is the next issue ?

When you set Synchronized=True then each branch will execute one after one, for example if you have 3 branches like Branch1, Branch2 and Branch3. Then BizTalk executes the each branch in same order 1 , 2 and 3.

Now I have error at Branch 2 and I am catching the Error at Branch 2 Exception Block. But I do not want to proceed for Branch 3. How do I control the execution of all branches?

“ I came up with simple logic, It could be a silly but it works well, The logic is Declare a Bool type variable at Orchestration (vFlag=Tue) level and set the value at Each Branch Exception Block.
Also Second Branch and 3rd Branch should have Decide Shape to Check the Condition. “

You can also check the below article from “Scott Colestock” – for more Experiments on Parallel Branch.
http://www.traceofthought.net/PermaLink,guid,e2e45c5b-e8f3-4c05-9c60-d6e5e1ec29b3.aspx

The Orchestration looks like below

If you have any issues , reach me @ raj.webjunky@yahoo.com


Monday 9 February 2009

Add Additional SOAP Header while Publish Orchestration as Webservice

Last couple of days I was busy with documnetation work in my office and one of my friend request me to provide an example for how to add an additional Soap Header while publishing the orchestration as webservice. I just tried to provide a URL from google search, unfortunately I could not find any right answer. Then I started my new journey to prepare my own example.

I was trying to publish my Orchestration as Webservice and tried to add additional SOAP header ( provided option while publish). I created a new Property Schema and changed the Target Namespace as
http://schemas.microsoft.com/BizTalk/2003/SOAPHeader

But when I try to select the Schema while publishing in the Tool , I couldn’t find the schema from the list. I was surprised and recollected myself what I was doing wrong?. And as per my observations I found that Document schemas are in the list to add as Additional soap Header but not Property schemas.

But how this document schema can be treaded as SOAP Header ?? any guess ..?
Lets do a deep drive to and see how we can add additional soap header for your Published Webservice.

First step is to create normal Document Schema and Change Root Node as “AuthenticateSoapHeader”. And add two Field elements under root node like UserName , Password.
Create a Property Schema and Rename the Property1 element as “AuthenticateSoapHeader” and set the property Schema Base = “MessageContextPropertyBase” also the Target NameSpace as http://schemas.microsoft.com/BizTalk/2003/SOAPHeader.


For more details of creating SOAP Header Schema , refer the below link (Steps to Create Soap Header Schema)
http://rajwebjunky.blogspot.com/2009/01/how-to-send-custom-soap-headers-from.html

Lets try to understand the purpose of creating Property Schema : When ever you add Document schema as Additional SOAP header at publish tool BizTalk Creates an Soap header class with the root node of your Document Schema. In my Example AuthenticateSoapHeader is the Root node of my Document Schema.

If you look at the MessageContext Property of your Orchestration Instance for Incoming Message , It shows clearly that AuthenticateSoapHeader is one of the value sent along with incoming message as part of Soap header.

Now next step is to get the SoapHeader XML data and assign the value to Document Schema.
Write the below code at MessageAssignment Shape

// get SoapHeader Information from Context
vData= IncomingInvoiceMsg(SoapHeaderExposeOrch.AuthenticateSoapHeader);
//Load SoapHeader xml data and assing to Document Schema
vXmlObj= new System.Xml.XmlDocument();
vXmlObj.LoadXml(vData);

//Assign SoapHeadr XML to Document Schema
SoapHeaderMsg=vXmlObj;



reach me if you have any issues :
raj.webjunky@yahoo.com