Dela via


Tjänstslutpunkter och köadressering

I det här avsnittet beskrivs hur klienter hanterar tjänster som läses från köer och hur tjänstslutpunkter mappas till köer. Som en påminnelse visar följande bild den klassiska "Windows Communication Foundation" (WCF) programdistribution med kö.

Diagram över köhanteringsapplikation

För att klienten ska skicka meddelandet till tjänsten adresserar klienten meddelandet till målkön. För att tjänsten ska kunna läsa meddelanden från kön anger den sin lyssningsadress till målkön. Adressering i WCF är URI-baserad (Uniform Resource Identifier) medan MSMQ-könamn (Message Queuing) inte är URI-baserade. Därför är det viktigt att förstå hur du hanterar köer som skapats i MSMQ med hjälp av WCF.

MSMQ-adressering

MSMQ använder sökvägar och formatnamn för att identifiera en kö. Sökvägar anger ett värdnamn och en QueueName. Valfritt kan det finnas en Private$ mellan värdnamnet och QueueName för att ange en privat kö som inte har publicerats i Active Directory-katalogtjänsten.

Sökvägsnamn mappas till "FormatNames" för att fastställa ytterligare aspekter av adressen, inklusive routning och överföringsprotokoll för köhanterare. Queue Manager stöder två överföringsprotokoll: inbyggt MSMQ-protokoll och SOAP Reliable Messaging Protocol (SRMP).

Mer information om MSMQ-sökväg och formatnamn finns i Om meddelandeköer.

NetMsmqBinding och tjänstadressering

När du adresserar ett meddelande till en tjänst väljs schemat i URI:n baserat på den transport som används för kommunikation. Varje transport i WCF har ett unikt schema. Systemet måste återspegla den typ av transport som används för kommunikation. Till exempel net.tcp, net.pipe, HTTP och så vidare.

MSMQ-kötransporten i WCF exponerar ett net.msmq-schema. Alla meddelanden som adresseras med net.msmq-schemat skickas via NetMsmqBinding den MSMQ-köade transportkanalen.

Adressering av en kö i WCF baseras på följande mönster:

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

där:

  • < värdnamn> är namnet på den dator som är värd för målkön.

  • [privat] är valfritt. Den används när du hanterar en målkö som är en privat kö. Om du vill hantera en offentlig kö får du inte ange privat. Observera att det till skillnad från MSMQ-sökvägar inte finns någon "$" i WCF-URI-formuläret.

  • < queue-name> är namnet på kön. Könamnet kan också syfta på en underkö. < Könamn> = <namn på kö>[;sub-queue-name].

Exempel1: Om du vill adressera en privat kö med PurchaseOrders på datorn abc atadatum.com, skulle URI:n vara net.msmq://abc.adatum.com/private/PurchaseOrders.

Exempel 2: För att adressera en offentlig kö AccountsPayable som finns på datorn def.adatum.com skulle URI:n vara net.msmq://def.adatum.com/AccountsPayable.

Köadressen används som Lyssnar-URI av lyssnaren för att läsa meddelanden från. Med andra ord motsvarar köadressen TCP-socketens lyssningsport.

En slutpunkt som läser från en kö måste ange köadressen med samma schema som angavs tidigare när ServiceHost öppnades. Exempel finns i Net MSMQ-bindning.

Flera kontrakt i en kö

Meddelanden i en kö kan implementera olika kontrakt. I det här fallet är det viktigt att något av följande är sant för att kunna läsa och bearbeta alla meddelanden:

  • Ange en slutpunkt för en tjänst som implementerar alla kontrakt. Det här är den rekommenderade metoden.

  • Ange flera slutpunkter med olika kontrakt, men se till att alla slutpunkter använder samma NetMsmqBinding objekt. Utsändningslogiken i ServiceModel använder en meddelandepump som läser in meddelanden från transportkanalen för att distribuera dem, och som så småningom demultiplexerar meddelanden baserat på kontraktet till de olika slutpunkterna. En meddelandepump skapas för ett lyssnings-URI/bindningspar. Köadressen används som Lyssnar-URI av den köade lyssnaren. Om alla slutpunkter använder samma bindningsobjekt säkerställs att en enda meddelandepump används för att läsa meddelandet och demultiplexerar till de relevanta slutpunkterna baserat på kontraktet.

SRMP-meddelanden

Som tidigare nämnts kan du använda SRMP-protokollet för kö-till-kö-överföringar. Detta används ofta när en HTTP-transport överför meddelanden mellan överföringskön och målkön.

Om du vill använda SRMP-överföringsprotokollet adresserar du meddelanden med hjälp av QueueTransferProtocolnet.msmq URI-schemat, som tidigare nämnts, och anger valet av SRMP eller Skyddad SRMP i NetMsmqBinding egenskapen för .

Att ange egenskapen QueueTransferProtocol är en funktion som endast skickas. Detta är en indikation från klienten vilken typ av kööverföringsprotokoll som ska användas.

Använda Active Directory

MSMQ har stöd för Active Directory-integrering. När MSMQ installeras med Active Directory-integrering måste datorn vara en del av en Windows-domän. Active Directory används för att publicera köer för upptäckt; sådana köer kallas offentliga köer. När du hanterar en kö kan kön lösas med hjälp av Active Directory. Detta liknar hur DNS (Domain Name System) används för att matcha IP-adressen för ett nätverksnamn. Egenskapen UseActiveDirectory i NetMsmqBinding är ett booleskt värde som anger om den köade kanalen måste använda Active Directory för att lösa kö-URI:n. Som standard är den inställd på false. Om egenskapen UseActiveDirectory är inställd på true, använder kanalen i kön Active Directory för att konvertera net.msmq:// URI till formatnamn.

Egenskapen UseActiveDirectory är endast relevant för klienten som skickar meddelandet eftersom den används för att lösa köns adress när meddelanden skickas.

Mappa net.msmq URI till Namn på meddelandeköformat

Den köade kanalen hanterar mappningen av URI-namnet net.msmq som angetts till kanalen till MSMQ-formatnamn. I följande tabell sammanfattas de regler som används för att mappa mellan dem.

WCF URI-baserad köadress Använda Active Directory-egenskapen Egenskapen Queue Transfer Protocol Resulterande MSMQ-formatnamn
Net.msmq://<machine-name>/private/abc False (standard) Inbyggd (standard) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc Falsk SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc Sann Infödd PUBLIC=some-guid (GUID för kö)

Läsa meddelanden från Dead-Letter-kön eller Poison-Message-kön

För att läsa meddelanden från en giftmeddelandekö som är en underkö till målkön, öppna ServiceHost med adressen för underkön.

Exempel: En tjänst som läser från giftmeddelandekön i den privata kön PurchaseOrders från den lokala datorn skulle adressera net.msmq://localhost/private/PurchaseOrders;poison.

Om du vill läsa meddelanden från en systemtransaktionskö för obeställbara meddelanden måste URI:n vara av formatet: net.msmq://localhost/system$;DeadXact.

Om du vill läsa meddelanden från en icke-transaktionell kö för dödsbrev måste URI:n vara av formatet: net.msmq://localhost/system$;DeadLetter.

Observera att kön med obeställbara meddelanden måste finnas på den lokala datorn när du använder en anpassad kö med obeställbara meddelanden. Därför är URI:n för dödsbrevkö begränsad till formatet:

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

En WCF-tjänst verifierar att alla meddelanden som den tar emot har adresserats till den specifika kö som den lyssnar på. Om meddelandets målkö inte matchar kön som den hittas i bearbetas inte meddelandet av tjänsten. Det här är ett problem som tjänster som lyssnar på en dead-letter-kö behöver hantera eftersom alla meddelanden där var avsedda att levereras någon annanstans. Om du vill läsa meddelanden från en kö med obeställbara meddelanden eller från en giftkö måste en ServiceBehavior med parametern Any användas. För ett exempel, se Dead Letter-köer.

MsmqIntegrationBinding och tjänst adressering

MsmqIntegrationBinding Används för kommunikation med traditionella MSMQ-program. För att underlätta samverkan med ett befintligt MSMQ-program stöder WCF endast formatnamns adressering. Meddelanden som skickas med den här bindningen måste därför överensstämma med URI-schemat:

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

MSMQ-format-name är av det format som anges av MSMQ i Om Meddelandeköer.

Observera att du bara kan använda direktformatnamn och offentliga och privata formatnamn (kräver Active Directory-integrering) när du tar emot meddelanden från en kö genom att använda MsmqIntegrationBinding. Det rekommenderas dock att du använder direkta formatnamn. Till exempel, om du använder något annat formatnamn på Windows Vista, uppstår ett fel eftersom systemet försöker öppna en underkö som endast kan öppnas med direkta formatnamn.

När du hanterar SRMP med MsmqIntegrationBinding finns det inget krav på att lägga till /msmq/ i det direkta formatnamnet för att hjälpa Internet Information Services (IIS) med dirigeringen. Till exempel: När du hanterar en kö abc med hjälp av SRMP-protokollet, bör du använda DIRECT=http://adatum.com/msmq/private$/abc istället för DIRECT=http://adatum.com/private$/abc.

Observera att du inte kan använda net.msmq://-adressering med MsmqIntegrationBinding. Eftersom MsmqIntegrationBinding har stöd för msmq-formatnamns adressering i fritt format kan du använda en WCF-tjänst som använder den här bindningen för att använda funktioner för multicast- och distributionslistor i MSMQ. Ett undantag är att ange CustomDeadLetterQueue när du använder MsmqIntegrationBinding. Det måste vara i formatet net.msmq://, på samma sätt som det anges med hjälp av NetMsmqBinding.

Se även