Delen via


Service-eindpunten en wachtrijadressering

In dit onderwerp wordt beschreven hoe clients services adresseren die uit wachtrijen lezen en hoe service-eindpunten worden toegewezen aan wachtrijen. Ter herinnering: in de volgende afbeelding ziet u de klassieke implementatie van windows Communication Foundation (WCF) in de wachtrij.

Queued Application Diagram

De client stuurt het bericht naar de service om het bericht naar de doelwachtrij te verzenden. De service kan berichten uit de wachtrij lezen door het luisteradres in te stellen op de doelwachtrij. Adressering in WCF is op basis van Uniform Resource Identifier (URI), terwijl de wachtrijnamen van Message Queuing (MSMQ) niet op URI's zijn gebaseerd. Het is daarom essentieel om te begrijpen hoe wachtrijen die zijn gemaakt in MSMQ, kunnen worden aangepakt met behulp van WCF.

MSMQ-adressering

MSMQ maakt gebruik van paden en indelingsnamen om een wachtrij te identificeren. Paden geven een hostnaam en een QueueName. Desgewenst kan er een Private$ tussen de hostnaam en de QueueName om een privéwachtrij aan te geven die niet is gepubliceerd in de Active Directory-adreslijstservice.

Padnamen worden toegewezen aan FormatNames om aanvullende aspecten van het adres te bepalen, waaronder routerings- en wachtrijbeheeroverdrachtprotocol. Queue Manager ondersteunt twee overdrachtsprotocollen: systeemeigen MSMQ-protocol en SOAP Reliable Messaging Protocol (SRMP).

Zie Over Message Queuing voor meer informatie over MSMQ-pad- en indelingsnamen.

NetMsmqBinding en serviceadressering

Wanneer u een bericht aan een service adresseert, wordt het schema in de URI gekozen op basis van het transport dat wordt gebruikt voor communicatie. Elk transport in WCF heeft een uniek schema. De regeling moet de aard van het vervoer weerspiegelen dat voor communicatie wordt gebruikt. Bijvoorbeeld net.tcp, net.pipe, HTTP, enzovoort.

Het MSMQ-transport in de wachtrij in WCF maakt een net.msmq-schema beschikbaar. Elk bericht dat is geadresseerd met behulp van het net.msmq-schema, wordt verzonden via het NetMsmqBinding transportkanaal in de wachtrij van MSMQ.

De adressering van een wachtrij in WCF is gebaseerd op het volgende patroon:

net.msmq: // <host-name> / [private/] <queue-name>

waarbij geldt:

  • <hostnaam> is de naam van de computer die als host fungeert voor de doelwachtrij.

  • [privé] is optioneel. Deze wordt gebruikt bij het adresseren van een doelwachtrij die een privéwachtrij is. Als u een openbare wachtrij wilt aanpakken, moet u geen privé opgeven. In tegenstelling tot MSMQ-paden is er geen '$' in het WCF-URI-formulier.

  • <De wachtrijnaam> is de naam van de wachtrij. De wachtrijnaam kan ook verwijzen naar een subqueue. Dus, <wachtrijnaam> =< naam-van-wachtrij>[;subwachtrijnaam].

Voorbeeld1: Als u een persoonlijke wachtrij PurchaseOrders wilt aanpakken die worden gehost op computer abc atadatum.com, is de URI net.msmq://abc.adatum.com/private/PurchaseOrders.

Voorbeeld 2: De URI zou net.msmq://def.adatum.com/AccountsPayable zijn om een openbare wachtrij aan te pakken die wordt gehost op computerdef atadatum.com.

Het wachtrijadres wordt gebruikt als de listen-URI door de listener om berichten van te lezen. Met andere woorden, het wachtrijadres is gelijk aan de listen-poort van TCP-socket.

Een eindpunt dat uit een wachtrij leest, moet het adres van de wachtrij opgeven met hetzelfde schema dat eerder is opgegeven bij het openen van De ServiceHost. Zie Net MSMQ Binding voor voorbeelden.

Meerdere contracten in een wachtrij

Berichten in een wachtrij kunnen verschillende contracten implementeren. In dit geval is het essentieel dat een van de volgende waar is om alle berichten te lezen en te verwerken:

  • Geef een eindpunt op voor een service die alle contracten implementeert. Dit is de aanbevolen methode.

  • Geef meerdere eindpunten met verschillende contracten op, maar zorg ervoor dat alle eindpunten hetzelfde NetMsmqBinding object gebruiken. De verzendlogica in ServiceModel maakt gebruik van een berichtpomp waarmee berichten uit het transportkanaal worden gelezen voor verzending, waardoor berichten uiteindelijk worden gede multiplexen op basis van het contract naar verschillende eindpunten. Er wordt een berichtpomp gemaakt voor een listen-URI/bindingspaar. Het wachtrijadres wordt gebruikt als de listen-URI door de listener in de wachtrij. Als alle eindpunten hetzelfde bindingsobject gebruiken, zorgt u ervoor dat één berichtpomp wordt gebruikt voor het lezen van het bericht en de multiplex voor relevante eindpunten op basis van het contract.

SRMP-berichten

Zoals eerder besproken, kunt u het SRMP-protocol gebruiken voor overdrachten tussen wachtrijen. Dit wordt vaak gebruikt wanneer een HTTP-transport berichten verzendt tussen de transmissiewachtrij en de doelwachtrij.

Als u het SRMP-overdrachtsprotocol wilt gebruiken, adresberichten met behulp van het net.msmq URI-schema, zoals eerder vermeld, en geeft u de keuze van SRMP of beveiligde SRMP op in de QueueTransferProtocol eigenschap van de NetMsmqBinding.

Het opgeven van de QueueTransferProtocol eigenschap is een functie voor alleen verzenden. Dit is een indicatie door de client welk type wachtrijoverdrachtprotocol moet worden gebruikt.

Met Active Directory

MSMQ wordt geleverd met ondersteuning voor Active Directory-integratie. Wanneer MSMQ is geïnstalleerd met Active Directory-integratie, moet de computer deel uitmaken van een Windows-domein. Active Directory wordt gebruikt voor het publiceren van wachtrijen voor detectie; dergelijke wachtrijen worden openbare wachtrijen genoemd. Wanneer u een wachtrij adresseren, kan de wachtrij worden omgezet met Behulp van Active Directory. Dit is vergelijkbaar met de manier waarop DOMAIN Name System (DNS) wordt gebruikt om het IP-adres van een netwerknaam op te lossen. De UseActiveDirectory eigenschap in NetMsmqBinding is een Booleaanse waarde die aangeeft of het kanaal in de wachtrij Active Directory moet gebruiken om de wachtrij-URI om te zetten. De standaardinstelling is ingesteld op false. Als de UseActiveDirectory eigenschap is ingesteld op true, gebruikt het wachtrijkanaal Active Directory om de URI net.msmq:// te converteren naar de indelingsnaam.

De UseActiveDirectory eigenschap is alleen zinvol voor de client die het bericht verzendt, omdat het wordt gebruikt om het adres van de wachtrij op te lossen bij het verzenden van berichten.

Net.msmq-URI toewijzen aan Message Queuing Format Names

Het kanaal in de wachtrij verwerkt de toewijzing van de net.msmq URI-naam die aan het kanaal is opgegeven voor MSMQ-indelingsnamen. De volgende tabel bevat een overzicht van de regels die worden gebruikt om ertussen toe te wijzen.

Wachtrijadres op basis van WCF-URI Active Directory-eigenschap gebruiken Eigenschap Queue Transfer Protocol Resulterende MSMQ-indelingsnamen
Net.msmq://<machine-name>/private/abc False (standaard) Systeemeigen (standaard) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc Onwaar SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc Waar Native PUBLIC=some-guid (de GUID van de wachtrij)

Berichten lezen uit de wachtrij voor dode letters of de wachtrij voor gifberichten

Als u berichten wilt lezen uit een gif-berichtenwachtrij die een subquee van de doelwachtrij is, opent u het ServiceHost bericht met het adres van de submap.

Voorbeeld: Een service die leest uit de gif-berichtenwachtrij van de private wachtrij PurchaseOrders van de lokale computer, adres net.msmq://localhost/private/PurchaseOrders; Poison.

Als u berichten wilt lezen uit een wachtrij met transactionele dode letters van het systeem, moet de URI van het formulier zijn: net.msmq://localhost/system$; DeadXact.

Als u berichten wilt lezen uit een niet-transactional dead-letter-wachtrij van een systeem, moet de URI van het formulier zijn: net.msmq://localhost/system$; DeadLetter.

Wanneer u een aangepaste wachtrij voor dead-letter gebruikt, moet de wachtrij met dode letters zich op de lokale computer bevinden. Als zodanig is de URI voor de wachtrij met dode letters beperkt tot het formulier:

net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.

Een WCF-service controleert of alle berichten die worden ontvangen, zijn geadresseerd aan de specifieke wachtrij waarop deze luistert. Als de doelwachtrij van het bericht niet overeenkomt met de wachtrij waarin het is gevonden, verwerkt de service het bericht niet. Dit is een probleem dat services die naar een wachtrij met dode letters luisteren, moeten worden opgelost, omdat elk bericht in de wachtrij met dode letters ergens anders moet worden bezorgd. Als u berichten wilt lezen uit een wachtrij met dode letters of uit een gifwachtrij, moet u een ServiceBehavior met de Any parameter gebruiken. Zie wachtrijen met dode letters voor een voorbeeld.

MsmqIntegrationBinding en serviceadressering

De MsmqIntegrationBinding wordt gebruikt voor communicatie met traditionele MSMQ-toepassingen. Om de interoperation met een bestaande MSMQ-toepassing te vereenvoudigen, ondersteunt WCF alleen adressering van indelingsnamen. Berichten die met deze binding worden verzonden, moeten dus voldoen aan het URI-schema:

msmq.formatname:<MSMQ-format-name>>

De MSMQ-format-name is van het formulier dat is opgegeven door MSMQ in About Message Queuing.

Houd er rekening mee dat u alleen namen van directe indelingen en openbare en persoonlijke indelingsnamen (vereist Active Directory-integratie) kunt gebruiken bij het ontvangen van berichten uit een wachtrij met behulp van MsmqIntegrationBinding. Het is echter raadzaam dat u namen van directe indelingen gebruikt. Als u bijvoorbeeld windows Vista gebruikt, veroorzaakt een andere indelingsnaam een fout omdat het systeem probeert een submap te openen, die alleen kan worden geopend met namen van directe indelingen.

Als u SRMP MsmqIntegrationBindinggebruikt, hoeft u /msmq/ niet toe te voegen in de naam van de directe indeling om Internet Information Services (IIS) te helpen met verzending. Bijvoorbeeld: wanneer u een wachtrij abc adresseren met behulp van het SRMP-protocol, in plaats van DIRECT=http://adatum.com/msmq/private$/abc, moet u gebruiken DIRECT=http://adatum.com/private$/abc.

Houd er rekening mee dat u net.msmq://-adressering niet kunt gebruiken met MsmqIntegrationBinding. Omdat MsmqIntegrationBinding ondersteuning biedt voor naamadressering van de vrije MSMQ-indeling, kunt u een WCF-service gebruiken die deze binding gebruikt voor het gebruik van multicast- en distributielijstfuncties in MSMQ. Er wordt één uitzondering opgegeven CustomDeadLetterQueue bij het gebruik van de MsmqIntegrationBinding. Het moet van het formulier net.msmq://zijn, vergelijkbaar met hoe deze wordt opgegeven met behulp van de NetMsmqBinding.

Zie ook