Mensajes representados como XLANGMessage
Un objeto XLANGMessage representa una instancia de mensaje declarada con un servicio XLANG. Este objeto se obtiene pasando una referencia a un mensaje como un parámetro en una llamada de método. Un objeto XLANGPart representa una parte de mensaje contenida en una instancia de mensaje dentro de un servicio XLANG. Este objeto se obtiene pasando una referencia de pieza en una invocación de método donde el tipo de parámetro receptor es XLANGPart o enumerando en una referencia pasada de XLANGMessage.
Una variable de mensaje de orquestación se puede pasar a un componente de usuario y recibirse como un objeto XLANGMessage . El objeto XLANGMessage permite acceder a los elementos y acceder a las propiedades del mensaje. El usuario puede "mantenerse" en un XLANGMessage y, por tanto, extender su duración más allá del ámbito declarado. Posteriormente, se puede devolver un XLANGMessage de un método y asignarse a una variable de mensaje en una orquestación.
Construir un XLANGMessage
Al construir un XLANGMessage con una secuencia, el tipo de secuencia debe implementar IStreamFactory o ser memoryStream. En el ejemplo de código siguiente se muestra cómo construir un XLANGMessage:
public class FileStreamFactory : IStreamFactory
{
string _fname;
public FileStreamFactory(string fname)
{
_fname = fname;
}
public Stream CreateStream()
{
return new FileStream
(
_fname,
FileMode.Open,
FileAccess.Read,
FileShare.Read
);
}
}
public static void AssignStreamFactoryToPart(XLANGMessage msg)
{
IStreamFactory sf = new FileStreamFactory( @”c:\data.xml” );
msg[0].LoadFrom( sf );
}
Puede que a veces desee crear un nuevo mensaje sin transformar un mensaje de origen. Puede hacerlo mediante una variable de tipo System.Xml. XmlDocument y carga o construye el contenido adecuado. En el ejemplo siguiente, XML se carga desde una cadena mediante el método LoadXml de XmlDocument:
XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");
XLANGMessage XmlMsg = XmlVariable;
En el ejemplo siguiente se carga XML desde un archivo mediante el método Load de XmlDocument:
XmlVariable.Load("C:\MyData.xml");
XLANGMessage XmlMsg = XmlVariable;
Nota
Si desea construir mensajes más grandes, use uno de los métodos de streaming mostrados en la sección anterior o considere la posibilidad de usar la forma Transformar en orquestación Designer.
Consideraciones al usar XLANGMessage y XLANGPart
Al usar XLANGMessage y XLANGPart en el código de usuario, tenga en cuenta lo siguiente:
No pase un elemento de mensaje como argumento XLANGPart ni devuelva un valor de tipo XLANGPart. Debe pasar XLANGPart como el tipo de la parte. Por ejemplo:
Message String msg; Class.Test(msg); // or you can do the following Messagetype mt { String part; }; Message mt msg; Class.Test(msg,part);
También puede pasar el propio mensaje como un XLANGMessage y usar los operadores de subíndice XLANGMessage para acceder al elemento dentro de la llamada de función. Sin embargo, no debe colocar un XLANGPart en una colección cuya duración dure más allá de la duración de la llamada de función. En su lugar, debe colocar XLANGMessage en la colección. Por ejemplo:
void Test(XLANGMessage xlm) { try { XLANGPart xlp = xlm[0]; string sval = (string)xlp.RetrieveAs(typeof(string)); } finally { xlm.Dispose(); } }
No defina un parámetro de orquestación como XLANGMessage o XLANGPart. Si quiere pasar un mensaje, use un parámetro de tipo mensaje para ello. Si quiere pasar una parte, pase el mensaje en su lugar y, a continuación, use la parte. Si solo quiere el valor de la parte, use el tipo de parte para pasarla.
No devuelva un parámetro XLANGMessage para una llamada de método. Si devuelve un parámetro XLANGMessage que se pasa y, a continuación, no puede llamar al método Dispose en el parámetro dentro de la llamada al método , infringe intuitivamente las suposiciones de duración y también produce una excepción. Al pasar un mensaje a través de un parámetro XLANGMessage al código de usuario, se hace referencia al mensaje a un contexto especial que normalmente no tiene mensajes a los que se hace referencia. La duración de este contexto es la duración de la instancia de orquestación. Esto se debe a que BizTalk Server desconoce si el código de usuario se mantendrá en el mensaje.
Cuando se cierra una instancia de orquestación, cualquier mensaje creado en esa instancia ya no es válido; por tanto, la duración de tal colección debe ser menor o igual que la duración de la instancia. Sin embargo, si desea liberar una referencia de mensaje en un bucle cuando el mensaje se pasó a través de un argumento XLANGMessage que tiene la misma duración que la instancia de orquestación, puede llamar a XLANGMessage.Dispose para liberar la referencia. Además, si dentro del método de código de usuario, el parámetro XLANGMessage solo se usa localmente y la duración del parámetro está contenida en la de la llamada de función, también puede llamar a XLANGMessage.Dispose para liberar la referencia al contexto raíz y devolver el mensaje correspondiente al comportamiento de duración normal. Por ejemplo:
void Test(XLANGMessage xlm) { try { //XLANGMessage is only used locally } finally { xlm.Dispose(); } }
Si coloca el xlm en una colección, la propia clase debe tener un método Dispose para la limpieza. Por ejemplo:
public class A { Hashtable h = new Hashtable(); public void Test(XLANGMessage xlm) { h[xlm] = 1; } //You can have more methods here public void Dispose() { foreach (XLANGMessage xlm in h.Keys) { xlm.Dispose(); } } }
Llamaría a A.Dispose cuando haya terminado con la colección de XLANGMessages.
Consulte también
Mensajes representados como esquemas XSD
Mensajes representados como clases .NET
Construcción de mensajes en código de usuario