Cuidado al construir multiples mensajes con XmlDocument

Una de las técnicas utilizadas para definir mensajes al desarrollar orquestaciones es usar objetos System.Xml.XmlDocument.  Sin embargo, es necesario tener cuidado al momento de utilizar el mismo objeto para definir mas de un mensaje usando un sólo "Construction Shape" ya que los mensajes pueden no almacenarse en la base de datos con la información esperada.

El siguiente escenario (ver figura) pretende explicar con más detalle lo comentado.

image

En la figura se observa como la orquestación construye dos mensajes: Msg2 y Msg3, usando el mismo "Construction Shape" y para ambos mensajes usa el mismo objeto xmlDoc de tipo System.Xml.XmlDocument.  Asi, en el primer Message Assigment Shape el siguiente codigo define el Msg2:

 // carga xml y asigna el Msg2
xmlDoc.LoadXml("<Root><Field>Field_2</Field></Root>");
Msg2 = xml;

Y en el segundo Message Assigment Shape este codigo define el Msg3:

 // carga xml y asigna el Msg3
xmlDoc.LoadXml("<Root><Field>Field_3</Field></Root>");
Msg3 = xml;

En teoria el resultado deberia ser dos archivos diferentes, sin embargo el resultado al ejecutarse la orquestación no es el esperado ya que ambos archivos contienen la misma informacion.

image

Este inconveniente se debe a dos razones:

  1. El mensaje de BizTalk guarda una referencia al objeto XmlDocument asignado.
  2. El objeto XmlDocument fue modificado en el mismo Construction Shape por lo que no fue posible hacer persistente el mensaje.

Por lo tanto, el objeto xml que se utilizo para definir el Msg2 fue modificado para construir el Msg3 antes de que el mensaje Msg2 se hiciese persistente.  Esto ocasiono que el contenido de ambos mensajes en la base de datos sea el mismo.

Esta característica esta presente en las versiones de biztalk 2004/2006/2006r2.