Functoid GetContextProperty

Muchas veces he escuchado, ¿como puedo obtener una propiedad de contexto del mensaje desde un mapa? Bien, mientras jugaba con el framework de BizTalk Server 2006 RC encontré una forma de hacer un functoid que implemente esta funcionalidad. A continuación tratare de explicar como lo obtuve.

Primero, es necesario conocer tres parámetros:

  • Nombre del mensaje: el nombre del mensaje que tiene la propiedad del contexto a extraer.
  • Nombre de la propiedad: el nombre de la propiedad de contexto.
  • Namespace de la propiedad: el namespace de la propiedad de contexto

Segundo, necesito obtener los segmentos del servicio (orquestación) y por cada segmento verificar si existe el mensaje del cual debo extraer la propiedad; los mensajes no se almacenan directamente en el servicio, los mensajes son almacenados en los segmentos que existen en la orquestación. Normalmente un servicio (orquestación) tiene dos segmentos y un segmento mas cuando la orquestación implementa compensación; usualmente los mensajes son almacenados en el segundo segmento (no se exactamente por que existen los segmentos, es una arquitectura interna de Microsoft y no existe mucha información al respecto).

Tercero, cuando encuentro el mensaje chequeo que la propiedad de contexto (formada por el nombre y el namespace de la propiedad) exista en el mensaje y retorno su valor.

Este el es código que utilizo en la función principal del functoid:

======================================================================
// set the property
string property = "";
// get the service
Microsoft.XLANGs.Core.Service s = Microsoft.XLANGs.Core.Service.RootService;
foreach (Microsoft.XLANGs.Core.Segment seg in s._segments)
{
   // find the real name of the message
foreach (DictionaryEntry de in Microsoft.XLANGs.Core.Context.FindFields(typeof
(Microsoft.XLANGs.BaseTypes.XLANGMessage), seg.ExceptionContext))
   {
      // check that the key ends with the name of the message
if (de.Key.ToString().EndsWith(val1))
      {
         // get the message as a XLANGMessage
Microsoft.XLANGs.Core.XMessage msg = de.Value as Microsoft.XLANGs.Core.XMessage;
         // if the message was found, then I get the value of the property
         if (msg != null)
         {
            // create a XmlQName instance
            Microsoft.XLANGs.BaseTypes.XmlQName qName = new Microsoft.XLANGs.BaseTypes.XmlQName(val2, val3);
            // find the message property in the message
            if (msg.GetContextProperties().ContainsKey(qName))
            {
               // get the property from GetContextProperties
               property = msg.GetContextProperties()[qName].ToString();
            }
            else if (msg.GetContentProperties().ContainsKey(qName))
            {
               // get the property from GetContentProperties
               property = msg.GetContentProperties()[qName].ToString();
            }
         }
         break;
      }
   }
   if (property.Length > 0)
      break;
}
// return the property value
return property;

======================================================================


Excepcion :(

Desafortunadamente, este functoid SOLAMENTE puede ser utilizado dentro de orquestación, es decir, en un mapa que este en una orquestación. La razón es simple, para acceder al mensaje se debe obtener el contexto actual del servicio y este esta representado por la orquestación, si la orquestación no existe no se podrá obtener el contexto.

Tu puedes bajar el assembly del functoid o su código fuente desde GetContextProperty Functoid

Este functoid fue desarrollado utilizando el framework de BizTalk Server 2006 RC usando los assemblies Microsoft.XLANGs.Engine.dll y Microsoft.XLANGs.BasTypes.dll. Por lo tanto, es posible que para la versión RTM surja algún cambio.

Autor: Carlos Medina

Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho