Verwenden von Ausdrücken zum Ausführen von Pipelines
BizTalk Server kann eine Pipeline aus einer Orchestrierung synchron aufrufen. Auf diese Weise können Orchestrierungen die in einer Pipeline gekapselte Nachrichtenverarbeitung (entweder Senden oder Empfangen) für eine Datenmenge nutzen, ohne diese Daten über die Messaginginfrastruktur senden zu müssen.
Mit dieser Funktion können Sie von einer Orchestrierung eine Sendepipeline aufrufen lassen, um mehrere Nachrichten in einem ausgehenden Austausch zusammenzufassen. Umgekehrt kann eine Orchestrierung eine Empfangspipeline aufrufen, um einen außerhalb der Messaginginfrastruktur empfangenen Austausch zu decodieren und zu disassemblieren, ohne dass Verarbeitungskosten wie beim Durchlaufen der MessageBox entstehen.
Details
Orchestrierungen verwenden Methoden in der XLANGPipelineManager-Klasse (im Microsoft.XLANGs.Pipeline-Namespace ), um Sende- oder Empfangspipelines aufzurufen. Eine Empfangspipeline verwendet entweder eine einzelne Nachricht oder einen Austausch und gibt null oder mehr Nachrichten zurück. Dies entspricht der Ausführung der Pipeline beim Empfang einer Nachricht in BizTalk-Messaging. Eine Sendepipeline verwendet mindestens eine Nachricht und gibt eine einzelne Nachricht oder einen Austausch zurück. Dies entspricht ebenfalls der Ausführung der Pipeline beim Senden einer Nachricht in BizTalk-Messaging.
Aufrufen einer Empfangspipeline
Um eine Empfangspipeline innerhalb einer Orchestrierung aufzurufen, ruft die Anwendung die ExecuteReceivePipeline() -Methode der XLANGPipelineManager-Klasse auf. Diese Methode nutzt einen einzelnen Austausch und gibt eine Auflistung von null oder mehr Nachrichten zurück (enthalten in einem instance der ReceivePipelineOutputMessages-Klasse). Die Syntax dieser Methode wird in der Referenz zur .NET-Klassenbibliothek für die XLANGPipelineManager-Klasse beschrieben.
Die API zum Ausführen einer Empfangspipeline in einer Orchestrierung lautet:
// Execute receive pipeline
static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);
Ein Aufruf einer Empfangspipeline erfolgt in der Regel in einer Ausdrucksform innerhalb der Orchestrierung.
Für den Aufruf einer Empfangspipeline in einer Orchestrierung muss der Entwickler auf die Pipelineassembly im Orchestrierungsprojekt verweisen. Es folgt ein Beispiel für eine Orchestrierung, die eine Empfangspipeline aufruft:
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 atomaren Bereichs in einer Orchestrierung deklariert werden. Dies liegt daran, dass Variablen dieses Typs nicht serialisierbar sind und eine persistente Orchestrierung nicht überstehen würden und dass Orchestrierungen niemals persistent gespeichert werden, wenn sie innerhalb eines atomaren Bereichs ausgeführt werden. Das heißt, dass eine Empfangspipeline nur innerhalb eines atomaren Bereichs 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 deklarieren. XmlDocument ist trotz des eingehenden Nachrichtentyps XML oder nicht. Daher tritt eventuell eine Ausnahme auf, wenn Sie versuchen, eine eingehende Nicht-XML-Nachricht, beispielsweise eine Nachricht im Flatfile-Format, zu verarbeiten. Dies liegt darin begründet, dass die Orchestrierungs-Engine im oben beschriebenen Szenario versucht, den Typ "System.Xml.XmlDocument" für jeden Typ eingehender Nachrichten zu verwenden.
Aufrufen einer Sendepipeline
Um eine Sendepipeline aus einer Orchestrierung aufzurufen, ruft die Anwendung die ExecuteSendPipeline() -Methode der XLANGPipelineManager-Klasse auf. Diese Methode nutzt eine Auflistung von mindestens einer Nachricht (enthalten in einem instance der SendPipelineInputMessages-Klasse) und gibt einen einzelnen Austausch zurück. Die Syntax dieser Methode wird in der Referenz zur .NET-Klassenbibliothek für die XLANGPipelineManager-Klasse beschrieben. Da die Ausführung einer Sendepipeline einen neuen Austausch ergibt, muss der Aufruf der ExecuteSendPipeline() -Methode innerhalb einer Nachrichtenzuweisungsform erfolgen:
Die API zum Ausführen einer Sendepipeline in 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.
Für den Aufruf einer Sendepipeline in einer Orchestrierung muss der Entwickler auf die Pipelineassembly im Orchestrierungsprojekt verweisen. Beispiel für eine Orchestrierung, die eine Sendepipeline aufruft:
Hinweis
Beim Aufrufen der Standardpipeline "XMLTransmit" müssen Sie die Nachrichtenkontexteigenschaft "XMLNORM.EnvelopeSpecName" auf den vollqualifizierten Namen des Umschlagschemas 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 Beispiel).
Pipelineausführung - Verhaltensunterschiede
Die Ausführung einer Sende- oder Empfangspipeline, die von einer Orchestrierung aufgerufen wird, ist weitgehend identisch mit der Ausführung der gleichen Pipeline innerhalb der Messaginginfrastruktur (d. h. am Empfangsspeicherort oder Sendeport). Es gibt jedoch bestimmte Verhaltensunterschiede, auf die im Folgenden hingewiesen wird.
Unterschiede innerhalb der Pipelinestufen
Die Ausführung der Stufen in einer Sende- oder Empfangspipeline, die in einer Orchestrierung aufgerufen wird, ist nahezu identisch mit der Ausführung dieser Stufen, wenn die Pipeline in der Messaginginfrastruktur von BizTalk aufgerufen wird. (d. h. am Empfangsspeicherort oder Sendeport). Ausnahmen für die verschiedenen Stufen sind unten angegeben.
Assembler/Disassembler: Die Assembler- und Disassemblerphasen verarbeiten keine Daten zum Nachverfolgen des Profils .
Encoder/Decoder: Der MIME-Encoder signiert Nachrichten digital mithilfe des Zertifikats, das auf dem Host konfiguriert ist, dem der Host zugeordnet ist. Der SMIME-Encoder verschlüsselt Nachrichten mithilfe des Zertifikats im Kontext der Nachricht, die an die Pipeline übergeben wird.
Schemaauflösung
Beim Ausführen einer Pipeline aus einer Orchestrierung werden zwei Algorithmen zur Schemasuche unterstützt:
Auflösung nach Typ
Auflösung nach Namen
Falls doppelte Schemas bereitgestellt werden, ist die Logik des Algorithmus zur Auswahl des entsprechenden Schemas identisch mit derjenigen, die beim Ausführen einer Pipeline im Kontext der Messaginginfrastruktur verwendet wird.
Transaktionspipelines
Für Pipelines, auf deren Stufen Transaktionskomponenten aufgerufen werden, steht kein Transaktionskontext zur Verfügung. Jeder Aufruf von IPipelineContext.GetTransaction() löst NotSupportedException aus. Damit wird die Ausführung einer solchen Pipeline in einer Orchestrierung zwar nicht ausgeschlossen, es bedeutet jedoch, dass die Pipeline diese Situation erkennen und lösen können muss.
Nachrichtenziel
Das Steuern des Nachrichtenziels durch Pipelinekomponenten wird in diesem Kontext nicht unterstützt. Wenn Sie die Kontexteigenschaften MessageDestination oder SuspendOnRoutingFailure festlegen, wird eine XLANGPipelineManagerException ausgelöst.
Pipelinekomponententypen
Pipelinekomponenten müssen auf den folgenden Systemkomponenten beruhen, damit sie in einer Orchestrierung aufgerufen werden können:
NET Framework Version 1.1
.NET Framework v2.0
.NET Framework v3.0
.NET Framework v3.5
.NET Framework v4.0
.NET Framework v2.0
COM
Beschränkungen
Die folgenden Pipelinetypen können nicht innerhalb einer Orchestrierung ausgeführt werden:
Transaktionale Pipelines
Wiederherstellbare Pipelines
Pipelines, die die BAM-Interceptor-API aufrufen (eine NotSupportedException wird ausgelöst).
Die gleiche Pipelineinstanz kann nur dann in verschiedenen Zweigen der parallelen Form ausgeführt werden, wenn sie in jedem Zweig in einem synchronisierten Bereich platziert wird.
Vorhandene Pipelines (Assemblys), die für das BizTalk Server 2006 SDK erstellt wurden.
Fehlermodi und -auswirkungen
Fehler bei der Pipelineausführung, die eine angehaltene Nachricht hervorgerufen hätten, wenn diese Pipeline in der BizTalk Server-Messaginginfrastruktur aufgerufen worden wäre, lösen stattdessen eine Ausnahme aus. Die ausgelöste Ausnahme ist vom Typ Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException. Diese ausgelöste Ausnahme kann in einem Erfassungsblock innerhalb der aufrufenden Orchestrierung behandelt werden. Wenn die Orchestrierung die ausgelöste Ausnahme nicht abfängt, zeigt die XLANGs-Engine eine Fehlermeldung mit Informationen über die ausgelöste Ausnahme an.
Die Ausnahme übernimmt die Formatierung der durch die Pipelinekomponenten generierten Fehlermeldungen.
Die Message-Eigenschaft der XLANGPipelineManagerException-Klasse enthält Details zum Ausführungsfehler der Pipeline. Diese ausführlichen Informationen haben folgendes Format:
Bei der Ausführung des Pipelinepipelinetyps <ist ein Fehler aufgetreten>. Fehlerdetails <formatierte Fehlermeldung>.
In dieser Nachricht <ist der Pipelinetyp> der Name der Pipelineklasse, und <die formatierte Fehlermeldung> ist eine Beschreibung des spezifischen Fehlers, der während der Pipelineausführung aufgetreten ist.
Wenn eine Orchestrierung beispielsweise eine Empfangspipeline aufruft und die Ausführung dieser Pipeline fehlschlägt, weil keine der Komponenten der Pipeline die Nachricht erkennt, lauten die Werte der Eigenschaften von XLANGPipelineManagerException wie folgt:
Eigenschaft "XLANGPipelineManagerException" | Wert |
---|---|
Meldung | Fehler beim Ausführen der Empfangspipeline: "MeinePipelines.EmpfangsPipeline". Fehlerdetails: "Keine Komponenten der Disassemblierungsphase können die Daten erkennen. |
Komponente | String.Empty |
Ein weiteres Beispiel: Wenn eine Orchestrierung eine Sendepipeline aufruft und die Ausführung dieser Pipeline aufgrund eines Überprüfungsfehlers fehlschlägt, lautet der Text in der Message-Eigenschaft von XLANGPipelineManagerException wie folgt:
Eigenschaft "XLANGPipelineManagerException" | Wert |
---|---|
Meldung | Fehler beim Ausführen der Sendepipeline: "MeinePipelines.SendePipeline". Fehlerdetails: "Fehler beim Überprüfen des Dokuments: "Das <Elementname-Element> ist ungültig – Der Wert des Wertelementwerts <> ist gemäß seinem Datentyp 'String' ungültig – Die Mustereinschränkung fehlgeschlagen."" |
Komponente | Microsoft.BizTalk.Component.XmlValidator |