Dela via


Meddelandeaktiviteter

Med meddelandeaktiviteter kan arbetsflöden skicka och ta emot WCF-meddelanden. Genom att lägga till meddelandeaktiviteter i ett arbetsflöde kan du modellera godtyckligt komplexa mönster för meddelandeutbyte (MEP).

Mönster för meddelandeutbyte

Det finns tre grundläggande mönster för meddelandeutbyte:

  • Datagram – När du använder datagrammets MEP skickar klienten ett meddelande till tjänsten, men tjänsten svarar inte. Detta kallas ibland "eld och glöm". En brand och glöm utbyte är en som kräver out-of-band bekräftelse av lyckad leverans. Meddelandet kan gå förlorat under överföring och aldrig nå tjänsten. Om klienten skickar ett meddelande garanterar det inte att tjänsten har tagit emot meddelandet. Datagrammet är en grundläggande byggsten för meddelanden, eftersom du kan bygga dina egna parlamentsledamöter ovanpå det.

  • Begärandesvar – När du använder MEP för begäran-svar skickar klienten ett meddelande till tjänsten, tjänsten utför den nödvändiga bearbetningen och skickar sedan ett svar tillbaka till klienten. Mönstret består av par för begäran-svar. Exempel på begärandesvarsanrop är fjärrproceduranrop (RPC) och get-begäranden i webbläsaren. Det här mönstret kallas även för halv duplex.

  • Duplex – När du använder duplex-MEP kan klienten och tjänsten skicka meddelanden till varandra i valfri ordning. Parparlamentarikern är som ett telefonsamtal, där varje ord som talas är ett meddelande.

Med meddelandeaktiviteterna kan du implementera någon av dessa grundläggande parlamentsledamöter och alla godtyckligt komplexa parlamentsledamöter.

Meddelandeaktiviteter

.NET Framework 4.6.1 definierar följande meddelandeaktiviteter:

  • Send– Använd Send aktiviteten för att skicka ett meddelande.

  • SendReply – Använd SendReply aktiviteten för att skicka ett svar till ett mottaget meddelande. Den här aktiviteten används av arbetsflödestjänster när du implementerar en parlamentsledamot för begäran/svar.

  • Receive– Använd Receive aktiviteten för att ta emot ett meddelande.

  • ReceiveReply – Använd ReceiveReply aktiviteten för att ta emot ett svarsmeddelande. Den här aktiviteten används av arbetsflödestjänstklienter när du implementerar en begäran/svars-MEP.

Meddelandeaktiviteter och mönster för meddelandeutbyte

En datagram-MEP innebär att en klient skickar ett meddelande och en tjänst som tar emot meddelandet. Om klienten är ett arbetsflöde använder du en Send aktivitet för att skicka meddelandet. Om du vill ta emot meddelandet i ett arbetsflöde använder du en Receive aktivitet. Aktiviteterna Send och Receive har var och en en egenskap med namnet Content. Den här egenskapen innehåller de data som skickas eller tas emot. När du implementerar MEP för begärandesvar använder både klienten och tjänsten par med aktiviteter. Klienten använder en Send aktivitet för att skicka meddelandet och en ReceiveReply aktivitet för att ta emot svaret från tjänsten. Dessa två aktiviteter associeras med varandra av Request egenskapen . Den här egenskapen är inställd på aktiviteten Send som skickade det ursprungliga meddelandet. Tjänsten använder också ett par associerade aktiviteter: Receive och SendReply. De här två aktiviteterna är associerade med Request egenskapen. Den här egenskapen är inställd på aktiviteten Receive som tog emot det ursprungliga meddelandet. Aktiviteterna ReceiveReply och SendReply , som Send och Receive gör att du kan skicka en Message instans eller en meddelandekontraktstyp.

På grund av arbetsflödenas långvariga karaktär är det viktigt att duplex-mönstret för kommunikation även stöder långvariga konversationer. För att stödja långvariga konversationer måste klienter som initierar konversationen ge tjänsten möjlighet att anropa den igen vid ett senare tillfälle när data blir tillgängliga. En inköpsorderbegäran skickas till exempel för godkännande av chefen, men den kanske inte bearbetas för en dag, en vecka eller till och med ett år. arbetsflödet som hanterar godkännandet av inköpsordern måste vara känt för att återupptas när godkännandet har getts. Det här mönstret för dubbelsidig kommunikation stöds i arbetsflöden med korrelation. Om du vill implementera ett duplexmönster använder Send du och Receive aktiviteter. Initiera en korrelation med hjälp av ReceiveCorrelationHandlei aktiviteten . På den aktivitetsuppsättning Send som korrelationen hanterar som egenskapsvärde CorrelatesWith . Mer information finns i Durable Duplex.

Kommentar

Arbetsflödets implementering av duplex med hjälp av en återanropskorrelation ("Durable Duplex") är avsedd för långvariga konversationer. Detta är inte samma sak som WCF-duplex med återanropskontrakt där konversationen är kortvarig (kanalens livslängd).

Meddelandeformatering och meddelandeaktiviteter

Aktiviteterna Receive och ReceiveReply har en egenskap med namnet Content. Den här egenskapen är av typen ReceiveContent och representerar data som Receive aktiviteten eller ReceiveReply tar emot. .NET Framework definierar två relaterade klasser som heter ReceiveMessageContent och ReceiveParametersContent som båda härleds från ReceiveContent. Receive Ange egenskapen eller ReceiveReply aktiviteten till en instans av någon av dessa typer för att ta emot data till en arbetsflödestjänstContent. Vilken typ som ska användas beror på vilken typ av data aktiviteten tar emot. Om aktiviteten tar emot ett Message objekt eller en meddelandekontraktstyp använder du ReceiveMessageContent. Om aktiviteten tar emot en uppsättning datakontrakt eller XML-typer som kan serialiseras använder du ReceiveParametersContent. ReceiveParametersContent gör att du kan skicka flera parametrar, medan ReceiveMessageContent du bara kan skicka ett objekt, meddelandet (eller meddelandekontraktstypen).

Kommentar

ReceiveMessageContent kan också användas med ett enda datakontrakt eller en XML-typ som kan serialiseras. Skillnaden mellan att använda ReceiveParametersContent med en enda parameter och objektet som skickas direkt till ReceiveMessageContent är trådformatet. Parameterns innehåll omsluts i ett XML-element som motsvarar åtgärdsnamnet och det serialiserade objektet omsluts i ett XML-element med parameternamnet (till exempel <Echo><msg>Hello, World</msg></Echo>). Meddelandeinnehållet omsluts inte av åtgärdsnamnet. I stället placeras det serialiserade objektet i ett XML-element med hjälp av det XML-kvalificerade typnamnet (till exempel <string>Hello, World</string>).

Aktiviteterna Send och SendReply har också en egenskap med namnet Content. Den här egenskapen är av typen SendContent och representerar data som Send aktiviteten eller SendReply skickar. .NET Framework definierar två relaterade typer som kallas SendMessageContent och SendParametersContent som båda härleds från SendContent. Send Ange egenskapen eller SendReply aktiviteten till en instans av någon av dessa typer för att skicka data från en arbetsflödestjänstContent. Vilken typ som ska användas beror på vilken typ av data aktiviteten skickar. Om aktiviteten skickar ett Message objekt eller en meddelandekontraktstyp använder du SendMessageContent. Om aktiviteten skickar en datakontraktstyp använder du SendParametersContent. SendParametersContent gör att du kan skicka flera parametrar, medan SendMessageContent du bara kan skicka ett objekt, meddelandet (eller meddelandekontraktstypen).

När du programmerar imperativt med meddelandeaktiviteterna använder du det allmänna InArgument<T> objektet och OutArgument<T> omsluter de objekt som du tilldelar till egenskaperna för meddelandet eller parametrarna för aktiviteterna Send, SendReply, Receiveoch ReceiveReply . Använd InArgument<T> för aktiviteterna Send och SendReply och OutArgument<T> för Receive och ReceiveReply aktiviteterna. In argument används med sändningsaktiviteterna eftersom data skickas till aktiviteterna. Out argument används med mottagningsaktiviteterna eftersom data skickas ut från aktiviteterna, som du ser i följande exempel.

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) }
        }
    },
};

När du implementerar en arbetsflödestjänst som definierar en begäran/svar-åtgärd som returnerar ogiltighet, måste du instansiera en SendReply aktivitet och ange Content egenskapen till en tom instans av en av innehållstyperna (SendMessageContent eller SendParametersContent) som visas i följande exempel.

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();
};

Lägg till tjänstreferens

När du anropar en arbetsflödestjänst från ett arbetsflödesprogram genererar Visual Studio 2012 anpassade meddelandeaktiviteter som kapslar in de vanliga Send aktiviteterna och ReceiveReply aktiviteterna som används i en parlamentsledamot för begäran/svar. Om du vill använda den här funktionen högerklickar du på klientprojektet i Visual Studio och väljer Lägg till>tjänstreferens. Skriv basadressen för tjänsten i adressrutan och klicka på Gå. De tillgängliga tjänsterna visas i rutan Tjänster: Expandera tjänstnoden för att visa kontrakten som stöds. Välj det kontrakt som du vill anropa och listan över tillgängliga åtgärder visas i rutan Åtgärder . Du kan sedan ange namnområdet för den genererade aktiviteten och klicka på OK. Sedan visas en dialogruta där det står att åtgärden har slutförts och att de genererade anpassade aktiviteterna finns i verktygslådan när du har återskapat projektet. Det finns en aktivitet för varje åtgärd som definierats i tjänstkontraktet. När du har återskapat projektet kan du dra och släppa de anpassade aktiviteterna till arbetsflödet och ange nödvändiga egenskaper i egenskapsfönstret.

Mallar för meddelandeaktivitet

Visual Studio 2012 innehåller två mallar för meddelandeaktivitet för att göra det enklare att konfigurera en parlamentsledamot för begäran/svar på klienten och tjänsten. System.ServiceModel.Activities.Design.ReceiveAndSendReply används på tjänsten och System.ServiceModel.Activities.Design.SendAndReceiveReply används på klienten. I båda fallen lägger mallarna till lämpliga meddelandeaktiviteter i arbetsflödet. I tjänsten System.ServiceModel.Activities.Design.ReceiveAndSendReply lägger till en Receive aktivitet följt av en SendReply aktivitet. Egenskapen Request anges automatiskt till Receive aktiviteten. På klienten System.ServiceModel.Activities.Design.SendAndReceiveReply lägger till en Send aktivitet följt av en ReceiveReply. Egenskapen Request anges automatiskt till Send aktiviteten. Om du vill använda dessa mallar drar och släpper du bara rätt mall i arbetsflödet.

Meddelandeaktiviteter och transaktioner

När ett anrop görs till en arbetsflödestjänst kanske du vill flöda en transaktion till tjänståtgärden. Det gör du genom att Receive placera aktiviteten i en TransactedReceiveScope aktivitet. Aktiviteten TransactedReceiveScope innehåller en Receive aktivitet och en brödtext. Transaktionen som flödas till tjänsten förblir omgivande under körningen av brödtexten i TransactedReceiveScope. Transaktionen slutförs när brödtexten är klar. Mer information om arbetsflöden och transaktioner finns i Arbetsflödestransaktioner.

Se även