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) köade programdistributionen.

Queued Application Diagram

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. Om du vill kan det finnas en Private$ mellan värdnamnet och för QueueName 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änst adressering

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å referera till en underfråga. <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: Om du vill hantera en offentlig kökontonBetalas på datorn def atadatum.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 adressen till kön 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. Detta är den rekommenderade metoden.

  • Ange flera slutpunkter med olika kontrakt, men se till att alla slutpunkter använder samma NetMsmqBinding objekt. Sändningslogik i ServiceModel använder en meddelandepump som läser meddelanden från transportkanalen för sändning, som så småningom de-multiplexes meddelanden baserat på kontraktet till olika slutpunkter. 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 ser du till att en enda meddelandepump används för att läsa meddelandet och de-multiplex till relevanta slutpunkter 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 NetMsmqBindingnet.msmq URI-schemat, som tidigare nämnts, och anger valet av SRMP eller Skyddad SRMP i QueueTransferProtocol 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 identifiering. 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 truepå använder den köade kanalen Active Directory för att konvertera URI:n net.msmq:// till att formatera namnet.

Egenskapen UseActiveDirectory är endast meningsfull för klienten som skickar meddelandet eftersom den används för att matcha 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) Intern (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 Sant Inbyggd PUBLIC=some-guid (GUID för kön)

Läsa meddelanden från kön med obeställbara meddelanden eller giftmeddelandekön

Om du vill läsa meddelanden från en giftmeddelandekö som är en underfråga i målkön öppnar ServiceHost du med adressen för underfrågan.

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

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

Om du vill läsa meddelanden från en systemlös kö med obeställbara meddelanden 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 kön med obeställbara meddelanden begränsad till formuläret:

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 kö med obeställbara meddelanden måste åtgärda eftersom alla meddelanden i kön med obeställbara meddelanden 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. Ett exempel finns i Köer med obeställbara meddelanden.

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 formulär som anges av MSMQ i About Message Queuing.

Observera att du bara kan använda namn på direktformat och namn på offentliga och privata format (kräver Active Directory-integrering) när du tar emot meddelanden från en kö med .MsmqIntegrationBinding Det rekommenderas dock att du använder namn på direktformat. Om du till exempel använder ett annat formatnamn i Windows Vista uppstår ett fel eftersom systemet försöker öppna en underfråga, som bara kan öppnas med namn på direktformat.

När du hanterar SRMP med , MsmqIntegrationBindingfinns det inget krav på att lägga till /msmq/ i det direkta formatnamnet för att hjälpa Internet Information Services (IIS) med sändning. Till exempel: När du hanterar en kö abc med hjälp av DIRECT=http://adatum.com/msmq/private$/abcSRMP-protokollet, i stället för , bör du använda 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 CustomDeadLetterQueue ange när du använder MsmqIntegrationBinding. Det måste vara av formuläret net.msmq://, ungefär som det anges med hjälp av NetMsmqBinding.

Se även