Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met berichtenactiviteiten kunnen werkstromen WCF-berichten verzenden en ontvangen. Door berichtenactiviteiten toe te voegen aan een werkstroom, kunt u willekeurige willekeurige complexe berichtenuitwisselingspatronen (MEP) modelleren.
Patronen voor berichtuitwisseling
Er zijn drie basispatronen voor het uitwisselen van berichten:
Datagram : wanneer u de datagram-MEP gebruikt, verzendt de client een bericht naar de service, maar reageert de service niet. Dit wordt ook wel 'vuur en vergeet' genoemd. Een 'fire-and-forget'-transactie is er een die een out-of-band bevestiging van geslaagde levering vereist. Het bericht gaat mogelijk verloren tijdens de overdracht en bereikt nooit de service. Als de client een bericht heeft verzonden, wordt niet gegarandeerd dat de service het bericht heeft ontvangen. Het datagram is een fundamentele bouwsteen voor berichten, omdat u er uw eigen parlementsleden bovenop kunt bouwen.
Request-Response : wanneer u de aanvraag-antwoord-MEP gebruikt, verzendt de client een bericht naar de service, voert de service de vereiste verwerking uit en stuurt vervolgens een antwoord terug naar de client. Het patroon bestaat uit aanvraag-antwoordparen. Voorbeelden van aanvragen-antwoordoproepen zijn externe procedure-aanroepen (RPC) en GET-aanvragen voor browsers. Dit patroon wordt ook wel half-duplex genoemd.
Duplex- Wanneer u de duplex-MEP gebruikt, kunnen de client en service berichten in elke willekeurige volgorde naar elkaar verzenden. Het duplex-MEP is net als een telefoongesprek, waarbij elk woord dat wordt gesproken een bericht is.
Met de berichtenactiviteiten kunt u een eenvoudige MEP en elke willekeurig complex MEP implementeren.
Activiteiten met berichten
In .NET Framework 4.6.1 worden de volgende berichtenactiviteiten gedefinieerd:
Send- Gebruik de Send activiteit om een bericht te verzenden.
SendReply - Gebruik de SendReply activiteit om een antwoord te verzenden naar een ontvangen bericht. Deze activiteit wordt gebruikt door workflowdiensten bij het implementeren van een aanvraag-/antwoord-MEP.
Receive- Gebruik de Receive activiteit om een bericht te ontvangen.
ReceiveReply - Gebruik de ReceiveReply activiteit om een antwoordbericht te ontvangen. Deze activiteit wordt gebruikt door werkstroomserviceclients bij het implementeren van een aanvraag-/antwoord-MEP.
Berichtenactiviteiten en patronen voor het uitwisselen van berichten
Een datagram-MEP omvat een client die een bericht verzendt en een service die het bericht ontvangt. Als de client een workflow is, gebruikt u een Send activiteit om het bericht te verzenden. Als u dat bericht in een werkstroom wilt ontvangen, gebruikt u een Receive activiteit. De Send en Receive activiteiten hebben elk een eigenschap met de naam Content. Deze eigenschap bevat de gegevens die worden verzonden of ontvangen. Bij het implementeren van de aanvraag-antwoord-MEP gebruiken zowel de client als de service paren van activiteiten. De client gebruikt een Send activiteit om het bericht en een ReceiveReply activiteit te verzenden om het antwoord van de service te ontvangen. Deze twee activiteiten zijn aan elkaar gekoppeld door de Request accommodatie. Deze eigenschap is ingesteld op de Send activiteit die het oorspronkelijke bericht heeft verzonden. De service maakt ook gebruik van een paar gekoppelde activiteiten: Receive en SendReply. Deze twee activiteiten zijn gekoppeld aan de Request eigenschap. Deze eigenschap is ingesteld op de Receive activiteit die het oorspronkelijke bericht heeft ontvangen. De ReceiveReply en SendReply activiteiten, zoals Send en Receive stellen u in staat om een Message exemplaar of een berichtcontracttype te verzenden.
Vanwege de langdurige aard van werkstromen is het belangrijk dat het dubbelzijdige communicatiepatroon ook langdurige gesprekken ondersteunt. Om langlopende gesprekken te ondersteunen, moeten clients die het gesprek initiëren, de service de mogelijkheid bieden om deze op een later tijdstip terug te bellen wanneer de gegevens beschikbaar komen. Een aanvraag voor een inkooporder wordt bijvoorbeeld ingediend voor goedkeuring van de manager, maar wordt mogelijk niet verwerkt voor een dag, een week of zelfs een jaar; de werkstroom die de goedkeuring van de inkooporder beheert, moet weten te hervatten nadat de goedkeuring is gegeven. Dit patroon van duplexcommunicatie wordt ondersteund in werkstromen met behulp van correlatie. Gebruik Send- en Receive-activiteiten om een duplexpatroon te implementeren. Op de Receive-activiteit een correlatie initialiseren met behulp van CorrelationHandle. In de Send activiteitsset die correlatie-handle als de CorrelatesWith eigenschapswaarde. Zie Durable Duplex voor meer informatie.
Opmerking
De implementatie van duplex door Workflow met behulp van een callbackcorrelatie (Durable Duplex) is bedoeld voor langdurige gesprekken. Dit is niet hetzelfde als WCF duplex met callbackcontracten waarbij het gesprek kortlopend is (de levensduur van het kanaal).
Berichtopmaak en berichtenactiviteiten
De Receive en ReceiveReply activiteiten hebben een eigenschap met de naam Content. Deze eigenschap is van het type ReceiveContent en vertegenwoordigt gegevens die de Receive of ReceiveReply activiteit ontvangt. Het .NET Framework definieert twee gerelateerde klassen die worden aangeroepen ReceiveMessageContent en ReceiveParametersContent waarvan beide zijn afgeleid van ReceiveContent. Stel de Receive eigenschap van de activiteit ReceiveReply of Content in op een exemplaar van een van deze typen om gegevens te ontvangen in een werkstroomservice. Het type dat moet worden gebruikt, is afhankelijk van het type gegevens dat de activiteit ontvangt. Als de activiteit een Message object of een berichtcontracttype ontvangt, gebruikt u ReceiveMessageContent. Als de activiteit een set gegevenscontract- of XML-typen ontvangt die kunnen worden geserialiseerd, gebruikt u ReceiveParametersContent.
ReceiveParametersContent hiermee kunt u meerdere parameters verzenden, terwijl ReceiveMessageContent u slechts één object, het bericht (of het type berichtcontract) kunt verzenden.
Opmerking
ReceiveMessageContent kan ook worden gebruikt met één gegevenscontract of XML-type dat kan worden geserialiseerd. Het verschil tussen het gebruik van ReceiveParametersContent met één parameter en het object dat rechtstreeks aan ReceiveMessageContent wordt doorgegeven, is het wire-formaat. De inhoud van de parameter wordt verpakt in een XML-element dat overeenkomt met de naam van de bewerking en het geserialiseerde object wordt verpakt in een XML-element met behulp van de parameternaam (bijvoorbeeld <Echo><msg>Hello, World</msg></Echo>). De berichtinhoud wordt niet verpakt door de naam van de bewerking. In plaats daarvan wordt het geserialiseerde object in een XML-element geplaatst met behulp van de naam van het XML-gekwalificeerde type (bijvoorbeeld <string>Hello, World</string>).
De Send en SendReply activiteiten hebben ook een eigenschap met de naam Content. Deze eigenschap is van het type SendContent en vertegenwoordigt gegevens die door de Send of SendReply activiteit worden verzonden. Het .NET Framework definieert twee gerelateerde typen die worden aangeroepen SendMessageContent en SendParametersContent beide zijn afgeleid van SendContent. Stel de Send-eigenschap van de activiteit SendReply of Content in op een exemplaar van een van deze typen om gegevens vanuit een workflowservice te verzenden. Het type dat moet worden gebruikt, is afhankelijk van het type gegevens dat de activiteit verzendt. Als de activiteit een Message object of een type berichtcontract verzendt, gebruikt u SendMessageContent. Als de activiteit een gegevenscontracttype verzendt, gebruikt SendParametersContentu .
SendParametersContent hiermee kunt u meerdere parameters verzenden, terwijl SendMessageContent u slechts één object, het bericht (of het type berichtcontract) kunt verzenden.
Wanneer u imperatief programmeert met de berichtenactiviteiten, gebruikt u de generieke InArgument<T> en OutArgument<T> om de objecten te verpakken die u toewijst aan de bericht- of parameter-eigenschappen van de Send, SendReply, Receive en ReceiveReply activiteiten. Gebruiken InArgument<T> voor de Send en SendReply activiteiten en OutArgument<T> voor Receive en ReceiveReply activiteiten.
In argumenten worden gebruikt bij de verzendactiviteiten omdat de gegevens worden doorgegeven aan de activiteiten.
Out argumenten worden gebruikt bij de ontvangstactiviteiten omdat gegevens worden doorgegeven uit de activiteiten, zoals wordt weergegeven in het volgende voorbeeld.
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) }
}
},
};
Bij het implementeren van een werkstroomservice die een aanvraag-/antwoordbewerking definieert die een ongeldige bewerking retourneert, moet u een SendReply activiteit instantiëren en de Content eigenschap instellen op een leeg exemplaar van een van de inhoudstypen (SendMessageContent of SendParametersContent) zoals wordt weergegeven in het volgende voorbeeld.
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();
};
Servicereferentie toevoegen
Wanneer u een werkstroomservice aanroept vanuit een werkstroomtoepassing, genereert Visual Studio 2012 aangepaste berichtenactiviteiten die de gebruikelijke Send en ReceiveReply activiteiten omvatten die worden gebruikt in een aanvraag-antwoord MEP. Als u deze functie wilt gebruiken, klikt u met de rechtermuisknop op het clientproject in Visual Studio en selecteert uServiceverwijzing>. Typ het basisadres van de service in het adresvak en klik op Go. De beschikbare services worden weergegeven in het vak Services: Vouw het serviceknooppunt uit om de ondersteunde contracten weer te geven. Selecteer het contract dat u wilt aanroepen en de lijst met beschikbare bewerkingen wordt weergegeven in het vak Bewerkingen . Vervolgens kunt u de naamruimte voor de gegenereerde activiteit opgeven en op OK klikken. Vervolgens ziet u een dialoogvenster waarin wordt aangegeven dat de bewerking is voltooid en dat de gegenereerde aangepaste activiteiten zich in de werkset bevinden nadat u het project opnieuw hebt opgebouwd. Er is één activiteit voor elke bewerking die in het servicecontract is gedefinieerd. Nadat u het project opnieuw hebt opgebouwd, kunt u de aangepaste activiteiten naar uw werkstroom slepen en neerzetten en eventuele vereiste eigenschappen instellen in het eigenschappenvenster.
Sjablonen voor berichtenactiviteit
Visual Studio 2012 biedt twee sjablonen voor berichtactiviteiten om het instellen van een aanvraag/antwoord-MEP op de client en service eenvoudiger te maken.
System.ServiceModel.Activities.Design.ReceiveAndSendReply wordt gebruikt voor de service en System.ServiceModel.Activities.Design.SendAndReceiveReply wordt gebruikt op de client. In beide gevallen voegen de sjablonen de juiste berichtenactiviteiten toe aan uw werkstroom. Op de service voegt de System.ServiceModel.Activities.Design.ReceiveAndSendReply een Receive activiteit toe, gevolgd door een SendReply activiteit. De Request eigenschap wordt automatisch ingesteld op de Receive activiteit. Op de client System.ServiceModel.Activities.Design.SendAndReceiveReply wordt een Send activiteit toegevoegd gevolgd door een ReceiveReply. De Request eigenschap wordt automatisch ingesteld op de Send activiteit. Gebruik deze sjablonen door simpelweg de juiste sjabloon naar uw workflow te slepen en los te laten.
Berichtenactiviteiten en transacties
Wanneer een werkstroomservice wordt aangeroepen, wilt u mogelijk een transactie naar de serviceoperatie overdragen. Hiervoor plaatst u de Receive activiteit binnen een TransactedReceiveScope activiteit. De TransactedReceiveScope activiteit bevat een Receive activiteit en een hoofdtekst. De transactie die naar de service is gestroomd, blijft consistent tijdens de uitvoering van het hoofdgedeelte van de TransactedReceiveScope. De transactie wordt voltooid wanneer de uitvoering van de code is afgerond. Zie Werkstroomtransacties voor meer informatie over werkstromen en transacties.