Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 "skjut och glöm". En automatiserad transaktion är en som kräver bekräftelse av leverans via en separat kanal. 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 begäran-svar-par. 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. Den duplexa MEP är som ett telefonsamtal, där varje ord som sägs är ett meddelande.
Med meddelandeaktiviteter kan du implementera valfri av dessa grundläggande MEP:er och alla godtyckligt komplexa MEP:er.
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 man implementerar en begäran/svar-MEP.
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 vid implementering av en request/reply-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 begäran-svar MEP använder både klienten och tjänsten aktivitetspar. 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 på en dag, en vecka eller till och med ett år; arbetsflödet som hanterar godkännandet av inköpsordern måste veta att återuppta när godkännandet har getts. Det här mönstret för dubbelsidig kommunikation stöds i arbetsflöden med korrelation. För att implementera ett duplexmönster, använd Send och Receive aktiviteter. Initiera en korrelation på Receive-aktiviteten med hjälp av CorrelationHandle. På aktivitetsuppsättningen Send ställ in korrelationshanteraren som egenskapsvärdet CorrelatesWith. Mer information finns i Durable Duplex.
Anmärkning
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. Ange Receive- eller ReceiveReply-aktivitetens Content-egenskap till en instans av någon av dessa typer för att ta emot data i en arbetsflödestjänst. 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).
Anmärkning
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. Ange Send eller SendReply-aktivitetens Content-egenskap till en instans av dessa typer för att skicka data från en arbetsflödestjänst. 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 aktiviteterna Send och ReceiveReply som används i ett meddelandemönster 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 tillhandahåller två mallar för meddelandeaktiviteter för att göra det enklare att ställa in ett begäran/svar-meddelandemönster 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. På tjänsten lägger System.ServiceModel.Activities.Design.ReceiveAndSendReply till en Receive-aktivitet följt av en SendReply-aktivitet. Egenskapen Request anges automatiskt till Receive aktiviteten. På klienten lägger System.ServiceModel.Activities.Design.SendAndReceiveReply till en Send aktivitet som följs 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 workflow-tjänst kanske du vill överföra en transaktion till operationen. Det gör du genom att Receive placera aktiviteten i en TransactedReceiveScope aktivitet. Aktiviteten TransactedReceiveScope innehåller en Receive aktivitet och en kropp. Transaktionen som skickas till tjänsten förblir aktiv genom hela körningen av TransactedReceiveScope. Transaktionen slutförs när funktionens kropp är klar att köra. Mer information om arbetsflöden och transaktioner finns i Arbetsflödestransaktioner.