Messagingaktivitäten
Messagingaktivitäten ermöglichen Workflows das Senden und Empfangen von WCF-Nachrichten. Indem Sie einem Workflow Messagingaktivitäten hinzufügen, können Sie beliebige komplexe Nachrichtenaustauschmuster (MEPs) modellieren.
Nachrichtenaustauschmuster
Es gibt drei grundlegende Nachrichtenaustauschmuster:
Datagramm – Beim Verwenden des Datagramm-Nachrichtenaustauschmusters sendet der Client eine Nachricht an den Dienst, aber der Dienst antwortet nicht. Dies wird auch als "fire and forget" bezeichnet. Ein "fire and forget"-Austausch erfordert eine Out-of-Band-Bestätigung für die erfolgreiche Zustellung. Die Nachricht könnte unterwegs verloren gehen und den Dienst nicht erreichen. Wenn der Client das Senden einer Nachricht erfolgreich abgeschlossen hat, ist dies keine Garantie dafür, dass der Dienst die Nachricht erhalten hat. Das Datagramm ist ein wichtiger Baustein für das Messaging, da Sie darauf Ihre eigenen Nachrichtenaustauschmuster aufbauen können.
Anforderung-Antwort – Wenn Sie das Nachrichtenaustauschmuster "Anforderung-Antwort" verwenden, sendet der Client eine Nachricht an den Dienst, und der Dienst führt die erforderliche Verarbeitung aus und sendet dann eine Antwort zurück an den Client. Das Muster besteht aus Anforderungs-Antwort-Paaren. Beispiele für Anforderung-Antwort-Aufrufe sind Remoteprozeduraufrufe (RPC) und Browser-GET-Anforderungen. Dieses Muster wird auch als Halbduplex bezeichnet.
Duplex – Beim Verwenden des Nachrichtenaustauschmusters "Duplex" können der Client und der einander in beliebiger Reihenfolge Nachrichten senden. Das Duplex-Nachrichtenaustauschmuster ist mit einem Telefongespräch vergleichbar, bei dem jedes gesprochene Wort einer Nachricht entspricht.
Mithilfe der Messagingaktivitäten können Sie diese grundlegenden Nachrichtenaustauschmuster sowie andere komplexe Nachrichtenaustauschmuster nach Belieben implementieren.
Messagingaktivitäten
Die .NET Framework 4.6.1 definiert die folgenden Messagingaktivitäten:
Send – Verwenden Sie die Send-Aktivität zum Senden einer Nachricht.
SendReply – Verwenden Sie die SendReply-Aktivität zum Senden einer Antwort auf eine empfangene Nachricht. Diese Aktivität wird von Workflowdiensten beim Implementieren eines Anforderung-Antwort-Nachrichtenaustauschmusters verwendet.
Receive – Verwenden Sie die Receive-Aktivität zum Empfangen einer Nachricht.
ReceiveReply – Verwenden Sie die ReceiveReply-Aktivität zum Empfangen einer Antwortnachricht. Diese Aktivität wird von Workflowdienstclients beim Implementieren eines Anforderung-Antwort-Nachrichtenaustauschmusters verwendet.
Messagingaktivitäten und Nachrichtenaustauschmuster
Ein Datagramm-Nachrichtenaustauschmuster umfasst einen Client, der eine Nachricht sendet, und einen Dienst, der die Nachricht empfängt. Verwenden Sie eine Send-Aktivität zum Senden der Nachricht, wenn der Client ein Workflow ist. Um diese Nachricht in einem Workflow zu empfangen, verwenden Sie eine Receive-Aktivität. Die Aktivitäten Send und Receive verfügen jeweils über eine Eigenschaft mit dem Namen Content
. Diese Eigenschaft enthält die Daten, die gesendet oder empfangen werden. Beim Implementieren des Anforderung-Antwort-Nachrichtenaustauschmusters verwendet sowohl der Client als auch der Dienst Aktivitätspaare. Der Client verwendet eine Send-Aktivität, um die Nachricht zu senden, und eine ReceiveReply-Aktivität, um die Antwort vom Dienst zu empfangen. Diese zwei Aktivitäten sind einander über die Request-Eigenschaft zugeordnet. Diese Eigenschaft wird auf die Send-Aktivität festgelegt, die die ursprüngliche Nachricht gesendet hat. Der Dienst verwendet ebenfalls ein Paar zugeordneter Aktivitäten: Receive und SendReply. Diese beiden Aktivitäten werden von der Request-Eigenschaft zugeordnet. Diese Eigenschaft wird auf die Receive-Aktivität festgelegt, die die ursprüngliche Nachricht empfangen hat. Die Aktivitäten ReceiveReply und SendReply ermöglichen Ihnen wie Send und Receive das Senden einer Message-Instanz oder eines Nachrichtenvertragstyps.
Aufgrund der langen Ausführungsdauer von Workflows ist es für das Duplexmuster der Kommunikation wichtig, dass es auch Konversationen mit langer Laufzeit unterstützt. Um Konversationen mit langer Laufzeit zu unterstützen, müssen Clients, die die Konversation initiieren, dem Dienst die Möglichkeit eines Rückrufs zu einem späteren Zeitpunkt geben, sobald die Daten verfügbar sind. Eine Auftragsanforderung wird z. B. zur Genehmigung durch den Manager eingereicht. Sie wird ggf. jedoch erst nach einem Tag, einer Woche oder sogar einem Jahr verarbeitet. Der Workflow, der die Genehmigung von Bestellungen verwaltet, muss den Vorgang wiederaufnehmen können, nachdem die Genehmigung erteilt wurde. Dieses Muster der Duplexkommunikation wird in Workflows unterstützt, die die Korrelation verwenden. Um ein Duplexmuster zu implementieren, verwenden Sie die Aktivitäten Send und Receive. Initialisieren Sie für die Receive-Aktivität eine Korrelation mithilfe von CorrelationHandle. Legen Sie dieses Korrelationshandle für die Send-Aktivität als CorrelatesWith-Eigenschaftswert fest. Weitere Informationen finden Sie unter Permanenter Duplex.
Hinweis
Die Dupleximplementierung des Workflows mithilfe einer Rückrufkorrelation („Permanenter Duplex“) ist für Konversationen mit langer Laufzeit bestimmt. Dies ist nicht das Gleiche wie WCF-Duplex mit Rückrufverträgen, wo die Konversation nur über eine kurze Ausführungsdauer verfügt (die Lebensdauer des Kanals).
Nachrichtenformatierung und Messagingaktivitäten
Die Aktivitäten Receive und ReceiveReply verfügen über eine Eigenschaft mit dem Namen Content
. Diese Eigenschaft hat den Typ ReceiveContent und stellt Daten dar, die die Receive-Aktivität oder die ReceiveReply-Aktivität empfängt. .NET Framework definiert zwei verknüpfte Klassen mit den Namen ReceiveMessageContent und ReceiveParametersContent, die beide von ReceiveContent abgeleitet sind. Legen Sie die Receive-Eigenschaft der ReceiveReply- oder der Content
-Aktivität auf eine Instanz einer dieser Typen fest, um Daten in einem Workflowdienst zu empfangen. Der zu verwendende Typ hängt vom Typ der Daten ab, die die Aktivität empfängt. Wenn die Aktivität ein Message
-Objekt oder einen Nachrichtenvertragstyp empfängt, verwenden Sie ReceiveMessageContent. Wenn die Aktivität einen Satz von Datenvertrags- oder XML-Typen empfängt, die serialisiert werden können, verwenden Sie ReceiveParametersContent. Mit ReceiveParametersContent können Sie mehrere Parameter senden, während Sie mit ReceiveMessageContent nur ein Objekt senden können, nämlich die Nachricht (bzw. den Nachrichtenvertragstyp).
Hinweis
ReceiveMessageContent kann auch mit einem einzelnen Datenvertrag oder XML-Typ verwendet werden, der serialisiert werden kann. Der Unterschied zwischen der Verwendung von ReceiveParametersContent mit einem einzelnen Parameter und dem direkten Übergeben des Objekts an ReceiveMessageContent ist das Übertragungsformat. Der Inhalt des Parameters wird mit einem XML-Element als Wrapper versehen, das dem Vorgangsnamen entspricht, und das serialisierte Objekt wird mit einem XML-Element als Wrapper versehen, indem der Parametername (z. B. <Echo><msg>Hello, World</msg></Echo>
) verwendet wird. Der Meldungsinhalt weist keinen Vorgangsnamen als Wrapper auf. Stattdessen wird das serialisierte Objekt in einem XML-Element platziert, indem der Typname mit XML-Qualifizierung (z. B. <string>Hello, World</string>
) verwendet wird.
Die Aktivitäten Send und SendReply verfügen auch über eine Eigenschaft mit dem Namen Content
. Diese Eigenschaft hat den Typ SendContent und stellt Daten dar, die die Send-Aktivität oder die SendReply-Aktivität sendet. .NET Framework definiert zwei verknüpfte Typen mit den Namen SendMessageContent und SendParametersContent, die beide von SendContent abgeleitet sind. Legen Sie die Send-Eigenschaft der SendReply-Aktivität oder Content
-Aktivität auf eine Instanz mit einem dieser Typen fest, um Daten von einem Workflowdienst zu senden. Der zu verwendende Typ hängt vom Typ der Daten ab, die die Aktivität sendet. Wenn die Aktivität ein Message
-Objekt oder einen Nachrichtenvertragstyp sendet, verwenden Sie SendMessageContent. Wenn die Aktivität einen Datenvertragstyp sendet, verwenden Sie SendParametersContent. Mit SendParametersContent können Sie mehrere Parameter senden, während Sie mit SendMessageContent nur ein Objekt senden können, nämlich die Nachricht (bzw. den Nachrichtenvertragstyp).
Falls Sie nur mithilfe der Messagingaktivitäten programmieren müssen, verwenden Sie die generischen Objekte InArgument<T> und OutArgument<T> zum Versehen der Objekte mit Wrappern, die Sie den Nachrichten- oder Parametereigenschaften der Aktivitäten Send, SendReply, Receive und ReceiveReply zuweisen. Verwenden Sie InArgument<T> für die Send-Aktivität und die SendReply-Aktivität und OutArgument<T> für die Receive-Aktivität und die ReceiveReply-Aktivität. Für die Sendeaktivitäten werden In
-Argumente verwendet, da die Daten an die Aktivitäten übergeben werden. Für die Empfangsaktivitäten werden Out
-Argumente verwendet, da die Daten aus den Aktivitäten übergeben werden. Dies wird im folgenden Beispiel veranschaulicht.
Receive reserveSeat = new Receive
{
...
Content = new ReceiveParametersContent
{
Parameters =
{
{ "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
}
}
};
SendReply reserveSeat = new SendReply
{
...
Request = reserveSeat,
Content = new SendParametersContent
{
Parameters =
{
{ "ReservationId", new InArgument<string>(reservationId) }
}
},
};
Beim Implementieren eines Workflowdiensts, der einen Anforderung/Antwort-Vorgang mit void-Rückgabe definiert, müssen Sie eine SendReply-Aktivität instanziieren und die Content-Eigenschaft auf eine leere Instanz von einem der Inhaltstypen (SendMessageContent oder SendParametersContent) festlegen. Dies wird im folgenden Beispiel veranschaulicht.
Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
Content = new SendParametersContent();
};
Dienstverweis hinzufügen
Beim Aufrufen eines Workflowdiensts aus einer Workflowanwendung generiert Visual Studio 2012 benutzerdefinierte Messagingaktivitäten. Diese Messagingaktivitäten kapseln die üblichen Aktivitäten Send und ReceiveReply, die in Anforderung/Antwort-Nachrichtenaustauschmustern verwendet werden. Klicken Sie zum Verwenden dieser Funktion in Visual Studio 2010 mit der rechten Maustaste auf das Clientprojekt, und wählen Sie Hinzufügen>Dienstverweis. Geben Sie im Adressfeld die Basisadresse des Diensts ein, und klicken Sie auf "Gehe zu". Die verfügbaren Dienste werden im Feld Dienste: angezeigt. Erweitern Sie den Dienstknoten, um die unterstützten Verträge anzuzeigen. Wählen Sie den Vertrag aus, den Sie aufrufen möchten. Die Liste der verfügbaren Vorgänge wird im Feld Vorgänge angezeigt. Sie können dann den Namespace für die generierte Aktivität angeben und auf OK klicken. In einem Meldungsdialogfeld wird angegeben, dass der Vorgang erfolgreich abgeschlossen wurden und dass sich die generierten benutzerdefinierten Aktivitäten in der Toolbox befinden, nachdem Sie das Projekt neu erstellt haben. Für jeden im Dienstvertrag definierten Vorgang ist eine Aktivität vorhanden. Nach der Neuerstellung des Projekts können Sie die benutzerdefinierten Aktivitäten per Drag & Drop im Workflow ablegen und im Eigenschaftenfenster alle erforderlichen Eigenschaften festlegen.
Vorlagen für Messagingaktivitäten
Zur Vereinfachung der Einrichtung eines Anforderung-Antwort-Nachrichtenaustauschmusters für den Client und Dienst stellt Visual Studio 2012 zwei Vorlagen für Messagingaktivitäten bereit. System.ServiceModel.Activities.Design.ReceiveAndSendReply
wird für den Dienst und System.ServiceModel.Activities.Design.SendAndReceiveReply
wird für den Client verwendet. In beiden Fällen fügen die Vorlagen dem Workflow die entsprechenden Messagingaktivitäten hinzu. Für den Dienst fügt System.ServiceModel.Activities.Design.ReceiveAndSendReply
eine Receive-Aktivität gefolgt von einer SendReply-Aktivität hinzu. Die Request-Eigenschaft wird automatisch auf die Receive-Aktivität festgelegt. Auf dem Client fügt System.ServiceModel.Activities.Design.SendAndReceiveReply
eine Send-Aktivität gefolgt von einer ReceiveReply-Aktivität hinzu. Die Request-Eigenschaft wird automatisch auf die Send-Aktivität festgelegt. Um diese Vorlagen zu verwenden, legen Sie die entsprechende Vorlage einfach per Drag & Drop auf dem Workflow ab.
Messagingaktivitäten und Transaktionen
Wenn einen Aufruf an einen Workflowdienst ausgeführt wird, kann es ratsam sein, eine Transaktion zum Dienstvorgang auszuführen. Platzieren Sie dazu die Receive-Aktivität innerhalb einer TransactedReceiveScope-Aktivität. Die TransactedReceiveScope-Aktivität enthält eine Receive
-Aktivität und einen Textteil. Die für den Dienst ausgeführte Transaktion wird während der Ausführung des Textteils von TransactedReceiveScope in der Umgebung beibehalten. Die Transaktion ist abgeschlossen, wenn die Ausführung des Textteils beendet ist. Weitere Informationen zu Workflows und Transaktionen finden Sie unter Workflowtransaktionen.