Delen via


Wachtrijen in WCF

In deze sectie wordt beschreven hoe u communicatie in de wachtrij gebruikt in Windows Communication Foundation (WCF).

Wachtrijen als wcf-transportbinding

In WCF geven de contracten aan wat er wordt uitgewisseld. Contracten zijn bedrijfsafhankelijke of toepassingsspecifieke berichtenuitwisseling. Het mechanisme dat wordt gebruikt voor het uitwisselen van berichten (of hoe) wordt opgegeven in de bindingen. Bindingen in WCF inkapselen details van de berichtuitwisseling. Ze maken configuratieknoppen beschikbaar voor de gebruiker om verschillende aspecten van het transport of het protocol te beheren dat de bindingen vertegenwoordigen. Wachtrijen in WCF worden behandeld als elke andere transportbinding, wat een groot voordeel is voor veel wachtrijtoepassingen. Tegenwoordig worden veel wachtrijtoepassingen anders geschreven dan andere gedistribueerde RPC-toepassingen (Remote Procedure Call), waardoor het moeilijker te volgen en te onderhouden is. Met WCF is de stijl van het schrijven van een gedistribueerde toepassing veel hetzelfde, waardoor het gemakkelijker te volgen en te onderhouden is. Bovendien is het eenvoudiger om het transport te configureren of wijzigingen aan te brengen zonder dat dit van invloed is op de toepassingsspecifieke code. In de volgende afbeelding ziet u de structuur van een WCF-service en -client die MSMQ als transport gebruikt.

Queued Application Diagram

Zoals u in de vorige afbeelding kunt zien, moeten de client en service alleen de toepassingsemantiek definiëren, dat wil zeggen, het contract en de implementatie. De service configureert een binding in de wachtrij met voorkeursinstellingen. De client maakt gebruik van het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe) om een WCF-client te genereren voor de service en om een configuratiebestand te genereren dat de bindingen beschrijft die moeten worden gebruikt om berichten naar de service te verzenden. Om een bericht in de wachtrij te verzenden, maakt de client dus een WCF-client en roept deze een bewerking aan. Dit zorgt ervoor dat het bericht naar de overdrachtswachtrij wordt verzonden en naar de doelwachtrij wordt overgebracht. Alle complexiteiten van communicatie in de wachtrij zijn verborgen voor de toepassing die berichten verzendt en ontvangt.

Opmerkingen over in de wachtrij geplaatste binding in WCF zijn onder andere:

  • Alle servicebewerkingen moeten in één richting zijn, omdat de standaardbinding in de wachtrij in WCF geen ondersteuning biedt voor dubbelzijdige communicatie met behulp van wachtrijen. Een voorbeeld van tweerichtingscommunicatie (Tweerichtingscommunicatie) laat zien hoe u tweerichtingscontracten kunt gebruiken om dubbelzijdige communicatie te implementeren met behulp van wachtrijen.

  • Voor het genereren van een WCF-client met behulp van metagegevensuitwisseling is een extra HTTP-eindpunt in de service vereist, zodat deze rechtstreeks kan worden opgevraagd om de WCF-client te genereren en bindingsgegevens te verkrijgen om de communicatie in de wachtrij op de juiste wijze te configureren.

  • Op basis van de binding in de wachtrij is extra configuratie buiten WCF vereist. Voor de NetMsmqBinding klasse die wordt verzonden met WCF, moet u bijvoorbeeld de bindingen configureren en zo min mogelijk Message Queuing (MSMQ) configureren.

In de volgende secties worden de specifieke bindingen in de wachtrij beschreven die zijn verzonden met WCF, die zijn gebaseerd op MSMQ.

MSMQ

Het transport in de wachtrij in WCF maakt gebruik van MSMQ voor de communicatie in de wachtrij.

MSMQ wordt geleverd als een optioneel onderdeel met Windows en wordt uitgevoerd als een NT-service. Hiermee worden berichten vastgelegd voor verzending in een transmissiewachtrij en voor levering in een doelwachtrij. De MSMQ-wachtrijbeheerders implementeren een betrouwbaar protocol voor berichtoverdracht, zodat berichten niet verloren gaan tijdens verzending. Het protocol kan systeemeigen of OP SOAP zijn gebaseerd, zoals het SOAP Reliable Message Protocol (SRMP).

In MSMQ kunnen wachtrijen transactioneel of niet-transactioneel zijn. Met een transactionele wachtrij kunnen berichten worden vastgelegd en afgeleverd in een transactie en vervolgens duurzaam in de wachtrij worden opgeslagen. Berichten die naar een transactionele wachtrij worden verzonden, worden precies eenmaal in volgorde overgedragen. U kunt een niet-transactionele wachtrij gebruiken om zowel vluchtige als duurzame berichten te verzenden. Een bericht dat naar een niet-transactionele wachtrij wordt verzonden, bevat geen betrouwbare overdrachtsgaranties; berichten kunnen dus verloren gaan.

MSMQ-wachtrijen kunnen ook worden beveiligd met behulp van een Windows-identiteit die is geregistreerd bij de Active Directory-adreslijstservice. Wanneer u MSMQ installeert, kunt u Active Directory-integratie installeren. Hiervoor moet de computer deel uitmaken van een Windows-domeinnetwerk.

Zie Message Queuing (MSMQ) installeren voor meer informatie over MSMQ.

NetMsmqBinding

De <netMsmqBinding> is de binding in de wachtrij die WCF biedt voor twee WCF-eindpunten om te communiceren met MSMQ. De binding bevat daarom eigenschappen die specifiek zijn voor MSMQ. Niet alle MSMQ-functies en -eigenschappen worden echter weergegeven in de NetMsmqBinding. De compact NetMsmqBinding is ontworpen met een optimale set functies die de meeste klanten voldoende moeten vinden.

De NetMsmqBinding belangrijkste wachtrijconcepten die tot nu toe in de vorm van eigenschappen op de bindingen zijn besproken, worden manifesteerd. Deze eigenschappen communiceren op hun beurt met MSMQ om de berichten over te dragen en af te leveren. Een bespreking van de eigenschapscategorieën vindt u in de volgende secties. Zie de conceptuele onderwerpen waarin specifieke eigenschappen volledig worden beschreven voor meer informatie.

ExactlyOnce en Durable Properties

De ExactlyOnce en Durable eigenschappen zijn van invloed op de wijze waarop berichten worden overgebracht tussen wachtrijen:

  • ExactlyOnce: Als dit is ingesteld op true (de standaardinstelling), zorgt het in de wachtrij geplaatste kanaal ervoor dat het bericht, indien bezorgd, niet wordt gedupliceerd. Het zorgt er ook voor dat het bericht niet verloren gaat. Als het bericht niet kan worden bezorgd of het bericht Time-To Live verloopt voordat het bericht kan worden bezorgd, wordt het mislukte bericht samen met de reden van de bezorgingsfout vastgelegd in een wachtrij met onbestelbare berichten. Als dit is ingesteld false, doet het kanaal in de wachtrij een poging om het bericht over te dragen. In dit geval kunt u desgewenst een wachtrij met dode letters kiezen.

  • Durable: Wanneer dit is ingesteld op true (de standaardinstelling), zorgt het wachtrijkanaal ervoor dat MSMQ het bericht duurzaam op de schijf opslaat. Dus als de MSMQ-service zou stoppen en opnieuw opstarten, worden de berichten op schijf overgebracht naar de doelwachtrij of bezorgd bij de service. Als dit is ingesteld false, worden de berichten opgeslagen in vluchtig archief en gaan ze verloren bij het stoppen en opnieuw opstarten van de MSMQ-service.

Voor ExactlyOnce betrouwbare overdracht vereist MSMQ dat de wachtrij transactioneel is. MSMQ vereist ook een transactie om te lezen uit een transactionele wachtrij. Als u de NetMsmqBindingtransactie gebruikt, moet u er rekening mee houden dat een transactie is vereist voor het verzenden of ontvangen van berichten wanneer ExactlyOnce deze is ingesteld op true. Op dezelfde manier vereist MSMQ dat de wachtrij niet-transactioneel is voor best effort-garanties, zoals wanneer ExactlyOncefalse en voor vluchtige berichten. Wanneer u dus instelt ExactlyOnce op false of duurzaam is false, kunt u een transactie niet verzenden of ontvangen.

Notitie

Zorg ervoor dat de juiste wachtrij (transactioneel of niet-transactioneel) is gemaakt op basis van instellingen in de bindingen. Als ExactlyOnce dat het is true, gebruikt u een transactionele wachtrij; anders gebruikt u een niet-transactionele wachtrij.

Eigenschappen van wachtrij met dead-letter

De wachtrij met onbestelbare berichten wordt gebruikt om berichten op te slaan die niet worden bezorgd. De gebruiker kan compenserende logica schrijven waarmee berichten uit de wachtrij voor onbestelbare berichten worden gelezen.

Veel wachtrijsystemen bieden een systeembrede wachtrij met dode letters. MSMQ biedt een systeembrede wachtrij met niet-transactionele dead-letter voor berichten die niet kunnen worden geleverd aan niet-transactionele wachtrijen en een systeembrede transactionele wachtrij voor berichten die niet kunnen worden bezorgd bij transactionele wachtrijen.

Als meerdere clients die berichten verzenden naar verschillende doelwachtrijen de MSMQ-service delen, gaan alle berichten die door de clients worden verzonden naar dezelfde wachtrij met dode letters. Dit is niet altijd de voorkeur. Voor een betere isolatie bieden WCF en MSMQ in Windows Vista een aangepaste wachtrij met dode brieven (of toepassingsspecifieke wachtrij voor dode brieven) die de gebruiker kan opgeven om berichten op te slaan die niet worden bezorgd. Daarom delen verschillende clients niet dezelfde wachtrij met dode letters.

De binding heeft twee eigenschappen van belang:

  • DeadLetterQueue: Deze eigenschap is een opsomming die aangeeft of er een wachtrij met dode letters wordt aangevraagd. De opsomming bevat ook het soort wachtrij met dode letters, als er een wordt aangevraagd. De waarden zijn None, Systemen Custom. Zie Voor meer informatie over de interpretatie van deze eigenschappen het gebruik van wachtrijen met dode letters voor het afhandelen van fouten bij berichtoverdracht

  • CustomDeadLetterQueue: Deze eigenschap is het URI-adres (Uniform Resource Identifier) van de toepassingsspecifieke wachtrij met dode letters. Dit is vereist als DeadLetterQueue.Custom is gekozen.

Eigenschappen voor afhandeling van gifberichten

Wanneer de service berichten uit de doelwachtrij onder een transactie leest, kan de service het bericht om verschillende redenen niet verwerken. Het bericht wordt vervolgens weer in de wachtrij geplaatst om opnieuw te worden gelezen. Als u berichten wilt verwerken die herhaaldelijk mislukken, kan een set eigenschappen voor de verwerking van gifberichten in de binding worden geconfigureerd. Er zijn vier eigenschappen: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelayen ReceiveErrorHandling. Zie Afhandeling van gifberichten voor meer informatie over deze eigenschappen.

Beveiligingseigenschappen

MSMQ maakt een eigen beveiligingsmodel beschikbaar, zoals toegangsbeheerlijsten (ACL's) in een wachtrij of het verzenden van geverifieerde berichten. Deze NetMsmqBinding beveiligingseigenschappen worden weergegeven als onderdeel van de transportbeveiligingsinstellingen. Er zijn twee eigenschappen in de binding voor transportbeveiliging: MsmqAuthenticationMode en MsmqProtectionLevel. Instellingen in deze eigenschappen zijn afhankelijk van hoe MSMQ is geconfigureerd. Zie Berichten beveiligen met transportbeveiliging voor meer informatie.

Naast transportbeveiliging kan het feitelijke SOAP-bericht zelf worden beveiligd met behulp van berichtbeveiliging. Zie Berichten beveiligen met berichtbeveiliging voor meer informatie.

MsmqTransportSecurity geeft ook twee eigenschappen weer, MsmqEncryptionAlgorithm en MsmqHashAlgorithm. Dit zijn opsommingen van verschillende algoritmen die moeten worden gekozen voor versleuteling van berichten en hashing van de handtekeningen voor wachtrij-naar-wachtrijoverdracht.

Andere eigenschappen

Naast de voorgaande eigenschappen bevatten andere MSMQ-specifieke eigenschappen die in de binding worden weergegeven:

  • UseSourceJournal: Een eigenschap die aangeeft dat bronlogboeken zijn ingeschakeld. Bronlogboeken is een MSMQ-functie waarmee berichten worden bijgehouden die zijn verzonden vanuit de transmissiewachtrij.

  • UseMsmqTracing: Een eigenschap die aangeeft dat MSMQ-tracering is ingeschakeld. MSMQ-tracering verzendt rapportberichten naar een rapportwachtrij telkens wanneer een bericht vertrekt of arriveert op een computer waarop een MSMQ-wachtrijbeheer wordt gehost.

  • QueueTransferProtocol: Een opsomming van het protocol dat moet worden gebruikt voor berichtenoverdracht tussen wachtrijen. MSMQ implementeert een systeemeigen protocol voor wachtrij-naar-wachtrijoverdracht en een SOAP-protocol met de naam SOAP Reliable Messaging Protocol (SRMP). SRMP wordt gebruikt bij het gebruik van HTTP-transport voor overdrachten tussen wachtrijen. SRMP-beveiliging wordt gebruikt bij het gebruik van HTTPS voor overdrachten tussen wachtrijen.

  • UseActiveDirectory: Een Booleaanse waarde om aan te geven of de Active Directory moet worden gebruikt voor de oplossing van wachtrijadressen. Dit is standaard uitgeschakeld. Zie Service-eindpunten en Wachtrijadressering voor meer informatie.

MsmqIntegrationBinding

Dit MsmqIntegrationBinding wordt gebruikt wanneer u wilt dat een WCF-eindpunt communiceert met een bestaande MSMQ-toepassing die is geschreven in C,C++, COM of System.Messaging-API's.

De bindingseigenschappen zijn hetzelfde als voor NetMsmqBinding. De volgende verschillen zijn echter van toepassing:

  • Het bewerkingscontract voor MsmqIntegrationBinding is beperkt tot het nemen van één parameter van het type MsmqMessage<T> waarbij de typeparameter het type hoofdtekst is.

  • Veel van de systeemeigen MSMQ-berichteigenschappen worden weergegeven in het MsmqMessage<T> voor gebruik.

  • Voor hulp bij serialisatie en deserialisatie van de berichttekst worden serialisatieprogramma's zoals XML en ActiveX geleverd.

Voorbeeldcode

Zie de volgende onderwerpen voor stapsgewijze instructies voor het schrijven van WCF-services die MSMQ gebruiken:

Zie de volgende onderwerpen voor een voltooid codevoorbeeld dat het gebruik van MSMQ in WCF illustreert:

Zie ook