Freigeben über


Verwenden von Ausdrücken zum Ausführen von Abläufen

BizTalk Server verfügt über die Möglichkeit, eine Pipeline synchron aus einer Orchestration aufzurufen. Dadurch können Orchestrierungen die Nachrichtenverarbeitung nutzen, die in einer Pipeline (entweder senden oder empfangen) für einen Datentext gekapselt ist, ohne diese Daten über die Messaginginfrastruktur senden zu müssen.

Sie können dieses Feature verwenden, um eine Orchestrierung zum Aufrufen einer Sendepipeline zu ermöglichen, um mehrere Nachrichten in einem einzelnen ausgehenden Austausch zu aggregieren. Umgekehrt könnte eine Orchestrierung eine Empfangspipeline aufrufen, um einen Datenaustausch außerhalb der Messaginginfrastruktur zu decodieren und zu zerlegen, ohne die Verarbeitungskosten für das Durchlaufen der Nachrichtenbox zu verursachen.

Einzelheiten

Orchestrierungen verwenden Methoden in der XLANGPipelineManager-Klasse (im Microsoft.XLANGs.Pipeline-Namespace ), um Sende- oder Empfangspipelines aufzurufen. Eine Empfangspipeline nutzt entweder eine einzelne Nachricht oder einen Austausch und liefert null oder mehr Nachrichten, genau so, als ob die Pipeline im Kontext des Empfangens einer Nachricht in BizTalk Messaging ausgeführt wird. Eine Sendepipeline nutzt eine oder mehrere Nachrichten und liefert eine einzelne Nachricht oder einen Austausch, so wie beim Ausführen der Pipeline im Kontext des Sendens einer Nachricht innerhalb des BizTalk-Messagings.

Anrufen einer Empfangspipeline

Um eine Empfangspipeline innerhalb einer Orchestrierung aufzurufen, ruft die Anwendung die ExecuteReceivePipeline()- Methode der XLANGPipelineManager-Klasse auf. Diese Methode verwendet einen einzelnen Austausch und gibt eine Auflistung von null oder mehr Nachrichten zurück (in einer Instanz der ReceivePipelineOutputMessages-Klasse enthalten). Die Syntax dieser Methode wird in der .NET-Klassenbibliotheksreferenz für die XLANGPipelineManager-Klasse detailliert beschrieben .

Die API zum Ausführen einer Empfangspipeline innerhalb einer Orchestrierung lautet:

// Execute receive pipeline

static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);

Ein Aufruf einer Empfangspipeline erfolgt typischerweise in einem Ausdruck-Element innerhalb der Orchestrierung.

Um eine Empfangspipeline innerhalb einer Orchestrierung aufzurufen, muss der Entwickler auf die Pipelineassembly im Orchestrierungsprojekt verweisen. Nachfolgend sehen Sie ein Beispiel für eine Orchestrierung, die eine Empfangspipeline aufruft:

Aufruf der Empfangspipeline-Bildschirm

Ein ausführlicheres Beispiel finden Sie im SDK-Beispiel für zusammengesetzten Nachrichtenprozessor (BizTalk Server-Beispiel).

Hinweis

Eine Variable vom Typ ReceivePipelineOutputMessages kann nur innerhalb eines atombezogenen Bereichs in einer Orchestrierung deklariert werden. Dies liegt daran, dass Variablen dieses Typs nicht serialisierbar sind und somit die Persistenz der Orchestrierung nicht überleben würden, und Orchestrierungen werden nie beibehalten, während sie innerhalb eines atombezogenen Bereichs ausgeführt werden. Dies bedeutet, dass eine Empfangspipeline nur innerhalb eines Atombereichs ausgeführt werden kann.

Hinweis

Beim Aufrufen der PassThruReceive-Pipeline oder der benutzerdefinierten Pipelinekomponente innerhalb einer Orchestrierung müssen Sie den Variablentyp für eingehende Nachrichten als System.Xml.XmlDocument deklarieren, obwohl der Typ der eingehenden Nachricht XML ist oder nicht. Daher kann eine Ausnahme auftreten, wenn Sie versuchen, sie zu bearbeiten, wenn es sich bei der eingehenden Nachricht um eine Nicht-XML-Nachricht handelt, z. B. eine Flache Dateiformatnachricht. Dies liegt daran, dass das Orchestrierungsmodul System.Xml.XmlDocument für jeden Typ eingehender Nachrichten im oben beschriebenen Szenario verwenden soll.

Aufrufen einer Sendepipeline

Um eine Sendepipeline aus einer Orchestrierung aufzurufen, ruft die Anwendung die ExecuteSendPipeline()- Methode der XLANGPipelineManager-Klasse auf. Diese Methode verwendet eine Auflistung einer oder mehrerer Nachrichten (in einer Instanz der SendPipelineInputMessages-Klasse enthalten) und gibt einen einzigen Austausch zurück. Die Syntax dieser Methode wird in der .NET-Klassenbibliotheksreferenz für die XLANGPipelineManager-Klasse detailliert beschrieben . Da die Ausführung einer Sendepipeline einen neuen Austausch liefert, muss der Aufruf der ExecuteSendPipeline()- Methode innerhalb eines Nachrichtenzuweisungs-Shapes erfolgen, z. B.:

Die API zum Ausführen einer Sendepipeline innerhalb einer Orchestrierung lautet:

// Execute a send pipeline

static public ExecuteSendPipeline(System.Type sendPipelineType, SendPipelineInputMessages inputMsgs, XLANGMessage msg);

Ein Aufruf einer Sendepipeline muss in einem Nachrichtenzuweisungs-Shape innerhalb der Orchestrierung erfolgen.

Um eine Sendepipeline innerhalb einer Orchestrierung aufzurufen, muss der Entwickler im Orchestrierungsprojekt auf die Pipeline-Assembly verweisen. Ein Beispiel für eine Orchestrierung, die eine Sendepipeline aufruft:

Fenster

Hinweis

Beim Aufrufen der Standard-XMLTransmit-Pipeline müssen Sie die Nachrichtenkontexteigenschaft XMLNORM.EnvelopeSpecName auf den vollqualifizierten Namen des Envelope-Schemas festlegen. Beispiel:

MyMessage(XMLNORM.EnvelopeSpecName) = "PipelineSchemas.POEnv, PipelineSchemas, Version=1.0.0.0, Culture=nuetral, PublicKeyToken=12e5cc95621c33e8";

Ein ausführlicheres Beispiel finden Sie im SDK-Beispielaggregator (BizTalk Server Sample).

Pipelineausführung – Verhaltensunterschiede

Die Ausführung einer Sende- oder Empfangspipeline, die von einer Orchestrierung aufgerufen wird, ist überwiegend identisch mit der Ausführung derselben Pipeline innerhalb der Messaging-Infrastruktur (d. h. beim Empfangsstandort oder Sendeport). Es gibt jedoch bestimmte Verhaltensunterschiede, die unten aufgeführt sind.

Unterschiede innerhalb der Pipelinephasen

Die Ausführung der Phasen innerhalb einer Sende- oder Empfangspipeline, die von einer Orchestrierung aufgerufen wird, ist nahezu identisch mit der Ausführung dieser Phasen, wenn die Pipeline von der BizTalk-Messaging-Infrastruktur aufgerufen wird, mit den unten für die einzelnen Phasen angegebenen Ausnahmen.

  • Assembler/Disassembler: Die Montage- und Demontagestufen verarbeiten keine Tracking-Profildaten .

  • Encoder/Decoder: Der MIME-Encoder signiert Nachrichten digital mit dem Zertifikat, das auf dem Host konfiguriert ist, dem der Host zugeordnet ist. Der SMIME-Encoder verschlüsselt Nachrichten mithilfe des Zertifikats im Kontext der an die Pipeline übergebenen Nachricht.

Schemaauflösung

Es gibt zwei Schemasuchalgorithmen, die beim Ausführen einer Pipeline aus einer Orchestrierung unterstützt werden:

  • Auflösung nach Typ

  • Auflösung nach Name

    In Fällen, in denen doppelte Schemas bereitgestellt werden, ist die Logik des Algorithmus für die Auswahl des entsprechenden Schemas identisch mit denen, die beim Ausführen im Kontext der Messaginginfrastruktur verwendet werden.

Transaktionspipelinen

Pipelines, deren Phasen Transaktionskomponenten aufrufen, verfügen nicht über einen Transaktionskontext. Jeder Aufruf von IPipelineContext.GetTransaction() löst NotSupportedException aus. Dies schließt nicht aus, dass eine solche Pipeline von einer Orchestrierung ausgeführt wird, bedeutet jedoch, dass die Pipeline diese Gegebenheit erkennen und handhaben muss.

Nachrichtenziel

Das Steuern des Nachrichtenziels durch Pipelinekomponenten wird in diesem Kontext nicht unterstützt. Durch Festlegen der Kontexteigenschaften MessageDestination oder SuspendOnRoutingFailure wird eine XLANGPipelineManagerException ausgelöst.

Pipelinekomponententypen

Pipelinekomponenten müssen auf Folgendem basieren, um innerhalb einer Orchestrierung aufgerufen zu werden.

  • .NET Framework v1.1

  • .NET Framework v2.0

  • .NET Framework v3.0

  • .NET Framework v3.5

  • .NET Framework v4.0

  • .NET Framework v2.0

  • COM

Einschränkungen

Die folgenden Pipelinetypen können nicht innerhalb einer Orchestrierung ausgeführt werden:

  • Transaktionspipelinen

  • Wiederherstellbare Pipelines

  • Pipelines, die die BAM-Interceptor-API aufrufen (eine NotSupportedException wird ausgelöst).

  • Die gleiche Pipelineinstanz kann nicht in verschiedenen Verzweigungen der parallelen Struktur ausgeführt werden, es sei denn, sie befindet sich in einem synchronisierten Bereich in jeder Verzweigung.

  • Vorhandene Pipelines (Assemblies), die mithilfe des BizTalk Server 2006 SDK erstellt wurden.

Fehlermodi und -effekte

Jeder Fehler bei der Pipelineausführung, der zu einer angehaltenen Nachricht führen würde, wenn diese Pipeline innerhalb der BizTalk Server Messaging-Infrastruktur aufgerufen wird, führt stattdessen zu einer ausgelösten Ausnahme. Die ausgelöste Ausnahme ist vom Typ "Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException". Diese ausgelöste Ausnahme kann in einem Catch-Block innerhalb der aufrufenden Orchestrierung behandelt werden. Wenn die Orchestrierung die ausgelöste Ausnahme nicht abfangen kann, meldet das XLANGs-Modul einen Fehler, dessen Text die Ausnahmeinformationen in der ausgelösten Ausnahme enthält.

Die Ausnahme formatiert die von den Pipelinekomponenten generierten Fehlermeldungen.

Die Message-Eigenschaft der XLANGPipelineManagerException-Klasse enthält Details zum Ausführungsfehler der Pipeline. Dieses Detail weist das folgende Format auf:

  • Fehler beim Ausführen des Pipeline-Pipelinetyps<>. Fehlerdetails <, formatierte Fehlermeldung>.

    In dieser Nachricht <ist der Pipelinetyp> der Name der Pipelineklasse und <die formatierte Fehlermeldung> eine Beschreibung des spezifischen Fehlers, der während der Pipelineausführung aufgetreten ist.

    Wenn z. B. eine Orchestrierung eine Empfangspipeline aufruft und die Ausführung dieser Pipeline fehlschlägt, da keine der Komponenten der Pipeline die Nachricht erkennt, würden die Werte der Eigenschaften von XLANGPipelineManagerException wie folgt sein:

XLANGPipelineManagerException-Eigenschaft Wert
Nachricht Fehler beim Ausführen der Empfangspipeline "MyPipelines.ReceivePipeline". Fehlerdetails: "Keine Komponenten der Zerlegungsphase können die Daten erkennen.
Komponente String.Empty

Ein weiteres Beispiel: Wenn eine Orchestrierung eine Sendepipeline aufruft und die Ausführung dieser Pipeline fehlschlägt, da ein Überprüfungsfehler auftritt, lautet der Text in der Message-Eigenschaft von XLANGPipelineManagerException :

XLANGPipelineManagerException-Eigenschaft Wert
Nachricht Fehler beim Ausführen der Sendepipeline "MyPipelines.SendPipeline". Fehlerdetails: "Fehler beim Überprüfen des Dokuments: "Das <Elementname>-Element ist ungültig - Der Wert <element value> ist gemäß seinem Datentyp 'String' ungültig - Die Mustereinschränkung ist fehlgeschlagen.""
Komponente "Microsoft.BizTalk.Component.XmlValidator"