Delen via


Berichtenactiviteiten

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 brand en vergeet uitwisseling is een die 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 van deze eenvoudige LEDEN en elke willekeurig complexe MEP implementeren.

Berichtenactiviteiten

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 werkstroomservices 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 werkstroom 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 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 type berichtcontract 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 en Receive activiteiten om een dubbelzijdig patroon Send te implementeren. Initialiseer een correlatie met behulp van CorrelationHandlede Receive activiteit. In de Send activiteitsset die correlatie-handle als de CorrelatesWith eigenschapswaarde. Zie Durable Duplex voor meer informatie.

Notitie

De implementatie van duplex van de werkstroom 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 eigenschap van de Receive activiteit ContentReceiveReply 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.

Notitie

ReceiveMessageContent kan ook worden gebruikt met één gegevenscontract of XML-type dat kan worden geserialiseerd. Het verschil tussen het gebruik met ReceiveParametersContent één parameter en het object dat rechtstreeks wordt ReceiveMessageContent doorgegeven, is de draadindeling. 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 eigenschap van de Send activiteit in SendReplyContent op een exemplaar van een van deze typen om gegevens te verzenden vanuit een werkstroomservice. 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 algemene InArgument<T> activiteiten en OutArgument<T> verpakt u de objecten die u toewijst aan de eigenschappen van het bericht of de parameters van de Send, SendReplyen ReceiveReceiveReply 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 activiteiten ReceiveReply en activiteiten inkapselen 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 u Serviceverwijzing toevoegen>. 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. In de service voegt de System.ServiceModel.Activities.Design.ReceiveAndSendReply service 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. Als u deze sjablonen wilt gebruiken, sleept u de juiste sjabloon naar uw werkstroom en zet u deze neer.

Berichtenactiviteiten en transacties

Wanneer een aanroep naar een werkstroomservice wordt gedaan, wilt u mogelijk een transactie naar de servicebewerking doorstromen. 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 omgeving tijdens de uitvoering van de hoofdtekst van de TransactedReceiveScopeservice. De transactie wordt voltooid wanneer de hoofdtekst is voltooid. Zie Werkstroomtransacties voor meer informatie over werkstromen en transacties.

Zie ook