Freigeben über


Als 'XLANGMessage' dargestellte Nachrichten

Ein XLANGMessage-Objekt stellt eine Nachricht dar, die mit einem XLANG-Dienst deklariert instance. Dieses Objekt wird in einem Methodenaufruf abgerufen, indem ein Verweis als Parameter an eine Nachricht übergeben wird. Ein XLANGPart-Objekt stellt einen Nachrichtenteil dar, der in einer Nachricht instance in einem XLANG-Dienst enthalten ist. Dieses Objekt wird entweder durch Übergeben eines Teilverweises in einem Methodenaufruf, bei dem der empfangende Parametertyp XLANGPart ist, oder durch Aufzählen auf einen übergebenen Verweis von XLANGMessage abgerufen.

Eine Orchestrierungsmeldungsvariable kann an eine Benutzerkomponente übergeben und als XLANGMessage-Objekt empfangen werden. Das XLANGMessage-Objekt ermöglicht den Zugriff auf die Teile und den Zugriff auf Nachrichteneigenschaften. Der Benutzer kann sich an einer XLANGMessage "halten" und dadurch seine Lebensdauer über den deklarierten Bereich hinaus verlängern. Anschließend kann eine XLANGMessage von einer Methode zurückgegeben und einer Nachrichtenvariablen in einer Orchestrierung zugewiesen werden.

Erstellen einer 'XLANGMessage'-Nachricht

Beim Erstellen einer XLANGMessage mit einem Stream muss der Streamtyp entweder IStreamFactory implementieren oder ein MemoryStream sein. Im folgenden Codebeispiel wird das Erstellen einer XLANGMessage veranschaulicht:

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

Möglicherweise möchten Sie eine neue Nachricht erstellen, ohne die Quellnachricht zu transformieren. Dazu können Sie eine Variable vom Typ System.Xml verwenden. XmlDocument und Laden oder anderweitiges Erstellen geeigneter Inhalte. Im folgenden Beispiel wird XML mithilfe der LoadXml-Methode von XmlDocument aus einer Zeichenfolge geladen:

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

Im folgenden Beispiel wird XML mithilfe der Load-Methode von XmlDocument aus einer Datei geladen:

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

Hinweis

Wenn Sie größere Nachrichten erstellen möchten, verwenden Sie eine der Streamingmethoden, die im vorherigen Abschnitt veranschaulicht wurden, oder erwägen Sie die Verwendung der Transformationsform in Orchestrierung Designer.

Überlegungen bei der Verwendung von 'XLANGMessage' und 'XLANGPart'

Wenn Sie XLANGMessage und XLANGPart im Benutzercode verwenden, sollten Sie Folgendes berücksichtigen:

  • Übergeben Sie einen Nachrichtenteil nicht als XLANGPart-Argument , oder geben Sie einen Wert vom Typ XLANGPart zurück. Sie sollten XLANGPart als Typ des Teils übergeben. Beispiel:

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

    Sie können die Nachricht selbst auch als XLANGMessage übergeben und die XLANGMessage-Tiefgestelltoperatoren verwenden, um auf den Teil innerhalb des Funktionsaufrufs zuzugreifen. Sie sollten jedoch kein XLANGPart in eine Auflistung einfügen, deren Lebensdauer sich über die Lebensdauer des Funktionsaufrufs hinaus erstreckt. Stattdessen sollten Sie die XLANGMessage in die Auflistung einfügen. Beispiel:

    void Test(XLANGMessage xlm)
    {
         try
         {
             XLANGPart xlp = xlm[0];
             string sval = (string)xlp.RetrieveAs(typeof(string));
         }
         finally
         {
             xlm.Dispose();
         }
    }
    
  • Definieren Sie keinen Orchestrierungsparameter als XLANGMessage oder XLANGPart. Wenn Sie eine Nachricht übergeben möchten, verwenden Sie dafür einen Nachrichtenparametertyp. Wenn Sie ein Nachrichtenteil übergeben möchten, übergeben Sie die vollständige Nachricht, und verwenden Sie den entsprechenden Nachrichtenteil. Wenn Sie nur den Wert des Teils übergeben möchten, verwenden Sie dafür den Teiltyp.

  • Geben Sie keinen XLANGMessage-Parameter für einen Methodenaufruf zurück. Wenn Sie einen XLANGMessage-Parameter zurückgeben, der übergeben wird, und sie dann die Dispose-Methode nicht für den Parameter innerhalb des Methodenaufrufs aufrufen können, verstößt dies intuitiv gegen Lebensdauerannahmen und löst auch eine Ausnahme aus. Wenn Sie eine Nachricht über einen XLANGMessage-Parameter an den Benutzercode übergeben, verweisen Sie auf die Nachricht auf einen speziellen Kontext, in dem normalerweise keine Nachrichten darauf verweisen. Der Lebenszyklus dieses Kontexts entspricht dem Lebenszyklus der Orchestrierungsinstanz. Dies liegt daran, dass in BizTalk Server nicht festgestellt werden kann, ob der Benutzercode die Nachricht "festhält".

    Wenn eine Orchestrierungsinstanz vorhanden ist, sind die in dieser Instanz erstellten Nachrichten nicht mehr gültig. Daher sollte der Lebenszyklus einer solchen Auflistung kleiner als der Lebenszyklus der Instanz sein oder diesem entsprechen. Wenn Sie jedoch einen Nachrichtenverweis in einer Schleife freigeben möchten, wenn die Nachricht über ein XLANGMessage-Argument übergeben wurde, das dieselbe Lebensdauer wie die Orchestrierung instance hat, können Sie XLANGMessage.Dispose aufrufen, um den Verweis freizugeben. Wenn der XLANGMessage-Parameter innerhalb der Benutzercodemethode nur lokal verwendet wird und die Lebensdauer des Parameters in der des Funktionsaufrufs enthalten ist, können Sie auch XLANGMessage.Dispose aufrufen, um den Verweis auf den Stammkontext freizugeben und der entsprechenden Nachricht das normale Lebensdauerverhalten zurückzugeben. Beispiel:

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

    Wenn Sie xlm in einer Auflistung platzieren, muss die Klasse selbst über eine Dispose-Methode für die Bereinigung verfügen. Beispiel:

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

    Sie würden A.Dispose aufrufen, wenn Sie mit der Sammlung von XLANGMessages fertig sind.

Weitere Informationen

Als XSD-Schemas dargestellte Nachrichten
Als .NET-Klassen dargestellte Nachrichten
Erstellen von Nachrichten in Benutzercode