Condividi tramite


Messaggi rappresentati come XLANGMessage

Un oggetto XLANGMessage rappresenta un'istanza del messaggio dichiarata con un servizio XLANG. L'oggetto viene ottenuto passando un riferimento a un messaggio sotto forma di parametro nella chiamata a un metodo. Un oggetto XLANGPart rappresenta una parte del messaggio contenuta in un'istanza di messaggio all'interno di un servizio XLANG. Questo oggetto viene ottenuto passando un riferimento a una parte in una chiamata al metodo in cui il tipo di parametro ricevente è XLANGPart o enumerazione su un riferimento passato di XLANGMessage.

Una variabile del messaggio di orchestrazione può essere passata a un componente utente e ricevuta come oggetto XLANGMessage . L'oggetto XLANGMessage consente di accedere alle parti e di accedere alle proprietà del messaggio. L'utente può "tenere premuto" a un XLANGMessage e quindi estenderne la durata oltre l'ambito dichiarato. Successivamente, un XLANGMessage può essere restituito da un metodo e assegnato a una variabile di messaggio in un'orchestrazione.

Costruzione di un XLANGMessage

Quando si costruisce un XLANGMessage con un flusso, il tipo di flusso deve implementare IStreamFactory o essere memoryStream. L'esempio di codice seguente illustra come costruire 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 );  
}  

In alcuni casi potrebbe essere necessario creare un nuovo messaggio senza trasformare un messaggio di origine. A tale scopo, è possibile usare una variabile di tipo System.Xml. XmlDocument e il caricamento o la costruzione di contenuto appropriato. Nell'esempio seguente il codice XML viene caricato da una stringa usando il metodo LoadXml di XmlDocument:

XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");  
XLANGMessage XmlMsg = XmlVariable;  
  

L'esempio seguente carica XML da un file usando il metodo Load di XmlDocument:

XmlVariable.Load("C:\MyData.xml");  
XLANGMessage XmlMsg = XmlVariable;  
  

Nota

Se si desidera costruire messaggi di dimensioni maggiori, usare uno dei metodi di streaming illustrati nella sezione precedente o prendere in considerazione l'uso della forma Transform in Orchestration Designer.

Considerazioni utili per l'utilizzo di XLANGMessage e XLANGPart

Quando si usano XLANGMessage e XLANGPart nel codice utente, tenere presente quanto segue:

  • Non passare una parte del messaggio come argomento XLANGPart o restituire un valore di tipo XLANGPart. È necessario passare XLANGPart come tipo della parte. Ad esempio:

    Message String msg;  
    Class.Test(msg);  
    // or you can do the following  
    Messagetype mt  
    {  
         String part;  
    };  
    Message mt msg;  
    Class.Test(msg,part);  
    
    

    È anche possibile passare il messaggio stesso come XLANGMessage e usare gli operatori di pedice XLANGMessage per accedere alla parte all'interno della chiamata di funzione. Tuttavia, non è consigliabile inserire un XLANGPart in una raccolta la cui durata supera la durata della chiamata di funzione. È invece consigliabile inserire L'espressione XLANGMessage nella raccolta. Ad esempio:

    void Test(XLANGMessage xlm)
    {
         try
         {
             XLANGPart xlp = xlm[0];
             string sval = (string)xlp.RetrieveAs(typeof(string));
         }
         finally
         {
             xlm.Dispose();
         }
    }
    
  • Non definire un parametro di orchestrazione come XLANGMessage o XLANGPart. Se si desidera passare un messaggio, utilizzare un parametro di tipo messaggio. Se si desidera passare una parte, passare il messaggio e in seguito utilizzare la parte. Se si desidera solo il valore della parte, utilizzare il tipo di parte per passare la parte.

  • Non restituire un parametro XLANGMessage per una chiamata al metodo. Se si restituisce un parametro XLANGMessage passato e non è possibile chiamare il metodo Dispose sul parametro all'interno della chiamata al metodo, viola in modo intuitivo i presupposti di durata e genera anche un'eccezione. Quando si passa un messaggio tramite un parametro XLANGMessage al codice utente, si fa riferimento al messaggio a un contesto speciale che normalmente non contiene messaggi a cui viene fatto riferimento. La durata di questo contesto coincide con la durata dell'istanza dell'orchestrazione per la motivazione che in BizTalk Server non è noto se il codice utente tratterrà il messaggio.

    Quando l'istanza di un'orchestrazione viene chiusa, gli eventuali messaggi creati nell'istanza non sono più validi, quindi la durata di tale insieme sarà inferiore o uguale alla durata dell'istanza. Tuttavia, se si vuole rilasciare un riferimento a un messaggio in un ciclo quando il messaggio è stato passato tramite un argomento XLANGMessage con la stessa durata dell'istanza di orchestrazione, è possibile chiamare XLANGMessage.Dispose per liberare il riferimento. Inoltre, se all'interno del metodo di codice utente, il parametro XLANGMessage viene usato solo localmente e la durata del parametro è contenuta in quella della chiamata di funzione, è anche possibile chiamare XLANGMessage.Dispose per liberare il riferimento al contesto radice e restituire il messaggio corrispondente il normale comportamento di durata. Ad esempio:

    void Test(XLANGMessage xlm)
    {
         try
         {
            //XLANGMessage is only used locally
         }
         finally
         {
            xlm.Dispose();
         }
    }
    

    Se si inserisce l'xlm in una raccolta, la classe stessa deve avere un metodo Dispose per la pulizia. Ad esempio:

    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();
             }
         }
    }
    

    Al termine dell'operazione si chiamerebbe A.Dispose con la raccolta di XLANGMessages.

Vedere anche

Messaggi rappresentati come schemi XSD
Messaggi rappresentati come classi .NET
Costruzione di messaggi in codice utente