IStreamFactory & C#


Navegando por el Blog,  estuve viendo con mucha alegría como, de a poco,  vamos agregando nuevos artículos y me detuve un minuto en el post Explorando un assembly de BTS.  El artículo me trajo a la memoria un problema que tuvimos que solucionar en un proyecto y que me gustaría compartir con todos ustedes.


Teníamos una tarea bastante particular que requería que modificáramos utilizando código un mensaje de BizTalk Server enviado desde una orquestación.  NO es una practica de la cual podemos estar orgullosos pero en su momento nos sirvió y bien valió la pena para entender un poco mas como BTS construye mensajes.


Básicamente, nos enfrentamos con el siguiente problema: ¿Como podemos crear un mensaje de BizTalk Server mediante código?
Todos sabemos que podemos crear un mensaje asignando un XMLDocument a un mensaje definido en una orquestación, pero ¿que pasa cuando necesitamos crear un mensaje que no es definible a través de un esquema XSD? Por ejemplo, si necesitáramos, por algún motivo demasiado particular (o por una mala definición de arquitectura, de hecho redefinimos la arquitectura para no implementar en producción esta solución), enviar un documento Excel ó PDF o reemplazar el contenido del mensaje original por un nuevo mensaje binario?.. Bueno, quisiera compartir con ustedes el siguiente código que en algún momento he aprovechado y además fue muy útil para entender algunos mecanismos de BizTalk.


BizTalk Server 2004 provee una interfaz  llamada IStreamFactory, si revisamos la documentación del producto encontraremos la siguiente definición:


“… This interface is typically used for working with large user-constructed messages. During message/part construction, you can hand in an object that implements the IStreamFactory interface to the XLANGPart::LoadFrom method. This StreamFactory is then used to access the underlying data. …”


Aquí adjunto una pequeña porción del código que (casi) utilizamos:


[Serializable()]
public class StreamFactory: Microsoft.XLANGs.BaseTypes.IStreamFactory
{
   private string _stringdata = string.Empty ;
   public StreamFactory(string stringdata) {
     _stringdata = stringdata;
   }


   public System.IO.Stream CreateStream()
   {
      return new; 
   ....

El fragmento anterior de código, a modo de ejemplo, simplemente asignamos a un mensaje el contenido de una cadena System.String en formato binario, en la línea:

   …
   destinationMessage.LoadFrom( new StreamFactory(messageContents));
   …

En esta sección es donde, por ejemplo, podríamos destinationMesage para adjuntar al XLANGPart un archivo cualquiera, o cualquier stream de datos para luego, asignarlo desde un “Message Assigment” dentro de una orquestación (ver imagen).




Espero que este artículo les sea útil, tanto para solucionar alguno de estos inconvenientes “raros” o, mejor aun, para que empiecen a curiosear, reflector de por medio, un poquito mas el producto : ).



Autor: Christian Carnero


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

Skip to main content