Sdílet prostřednictvím


Koncové body služby a adresování front

Toto téma popisuje, jak klienti adresují služby, které čtou z front a jak se koncové body služby mapují na fronty. Připomínáme, že následující obrázek ukazuje klasické nasazení aplikace ve frontě wcf (Windows Communication Foundation).

Queued Application Diagram

Aby klient odeslal zprávu službě, klient odešle zprávu do cílové fronty. Aby služba četla zprávy z fronty, nastaví její naslouchací adresu na cílovou frontu. Adresování ve WCF je založené na identifikátoru URI (Uniform Resource Identifier), zatímco názvy front front zpráv (MSMQ) nejsou založené na identifikátorech URI. Proto je nezbytné pochopit, jak adresovat fronty vytvořené v MSMQ pomocí WCF.

Adresování MSMQ

MSMQ používá k identifikaci fronty cesty a názvy formátů. Cesty určují název hostitele a .QueueName Volitelně může existovat Private$ mezi názvem hostitele a QueueName označit soukromou frontu, která není publikovaná v adresářové službě Active Directory.

Názvy cest se mapují na FormatNames, aby bylo možné určit další aspekty adresy, včetně přenosového protokolu směrování a správce fronty. Správce front podporuje dva přenosové protokoly: nativní protokol MSMQ a protokol SRMP (Reliable Messaging Protocol).

Další informace o názvech cest a formátů MSMQ naleznete v tématu O službě Řízení front zpráv.

NetMsmqBinding a adresování služeb

Při adresování zprávy službě je schéma v identifikátoru URI vybráno na základě přenosu používaného pro komunikaci. Každý přenos ve WCF má jedinečné schéma. Režim musí odrážet povahu dopravy používané ke komunikaci. Například net.tcp, net.pipe, HTTP atd.

Přenos ve frontě MSMQ ve WCF zveřejňuje schéma net.msmq. Všechny zprávy adresované pomocí schématu net.msmq se odesílají pomocí přenosového NetMsmqBinding kanálu ve frontě MSMQ.

Adresování fronty ve WCF vychází z následujícího vzoru:

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

kde:

  • <název> hostitele je název počítače, který je hostitelem cílové fronty.

  • [private] je nepovinný. Používá se při adresování cílové fronty, která je privátní frontou. Chcete-li adresovat veřejnou frontu, nesmíte zadat privátní. Všimněte si, že na rozdíl od cest MSMQ není ve formuláři identifikátoru URI WCF žádný "$".

  • <queue-name> je název fronty. Název fronty může také odkazovat na podkatebí. <Název_fronty> =< name-of-queue>[;sub-queue-name].

Příklad1: Adresa privátní fronty PurchaseOrders hostovaná v počítači abc atadatum.com by identifikátor URI byl net.msmq://abc.adatum.com/private/PurchaseOrders.

Příklad2: Adresa veřejné fronty AccountsPayable hostovaná v počítači def atadatum.com, identifikátor URI by byl net.msmq://def.adatum.com/AccountsPayable.

Adresa fronty se používá jako identifikátor URI naslouchacího procesu ke čtení zpráv. Jinými slovy, adresa fronty je ekvivalentní naslouchacímu portu soketu TCP.

Koncový bod, který čte z fronty, musí zadat adresu fronty pomocí stejného schématu zadaného dříve při otevření ServiceHost. Příklady najdete v tématu Net MSMQ Binding.

Více kontraktů ve frontě

Zprávy ve frontě mohou implementovat různé kontrakty. V tomto případě je nezbytné, aby jedna z následujících skutečností úspěšně četla a zpracovávala všechny zprávy:

  • Zadejte koncový bod pro službu, která implementuje všechny kontrakty. Toto je doporučený postup.

  • Zadejte více koncových bodů s různými kontrakty, ale zajistěte, aby všechny koncové body používaly stejný NetMsmqBinding objekt. Logika odesílání v ServiceModel používá pumpu zpráv, která čte zprávy z přenosového kanálu pro odesílání, což nakonec de-multiplexes zprávy založené na kontraktu na různé koncové body. Pro dvojici identifikátorů URI nebo vazby naslouchání se vytvoří pumpa zpráv. Adresa fronty se používá jako identifikátor URI naslouchacího procesu ve frontě. Když všechny koncové body používají stejný objekt vazby, zajistíte, že se ke čtení zprávy použije jedno čerpadlo zprávy a de-multiplex na relevantní koncové body na základě kontraktu.

Zasílání zpráv SRMP

Jak jsme už dříve probírali, můžete použít protokol SRMP pro přenosy front do fronty. To se běžně používá, když přenos HTTP přenáší zprávy mezi frontou přenosu a cílovou frontou.

Chcete-li použít protokol přenosu SRMP, adresujte zprávy pomocí schématu net.msmq URI, jak je uvedeno výše, a určete volbu SRMP nebo Secured SRMP ve QueueTransferProtocol vlastnosti NetMsmqBinding.

Určení QueueTransferProtocol vlastnosti je funkce jen pro odeslání. To označuje klient, který druh protokolu pro přenos fronty se má použít.

Pomocí Active Directory

MSMQ se dodává s podporou integrace služby Active Directory. Při instalaci MSMQ s integrací služby Active Directory musí být počítač součástí domény Windows. Služba Active Directory se používá k publikování front pro zjišťování; takové fronty se nazývají veřejné fronty. Při adresování fronty je možné frontu vyřešit pomocí služby Active Directory. Podobá se tomu, jak se k překladu IP adresy síťového názvu používá DNS (Domain Name System). Vlastnost UseActiveDirectory je NetMsmqBinding logická hodnota, která označuje, jestli kanál ve frontě musí k překladu identifikátoru URI fronty použít Active Directory. Ve výchozím nastavení je nastavena na falsehodnotu . Pokud je vlastnost nastavena UseActiveDirectory na true, pak kanál ve frontě používá Active Directory k převodu net.msmq:// identifikátor URI na formát názvu.

Vlastnost UseActiveDirectory je smysluplná pouze pro klienta, který zprávu odesílá, protože se používá k překladu adresy fronty při odesílání zpráv.

Mapování identifikátoru URI net.msmq na názvy formátů služby Řízení front zpráv

Kanál ve frontě zpracovává mapování názvu net.msmq URI zadaného do kanálu na názvy formátů MSMQ. Následující tabulka shrnuje pravidla použitá k mapování mezi nimi.

Adresa fronty založená na identifikátoru URI WCF Použití vlastnosti Active Directory Vlastnost Protokolu přenosu fronty Výsledné názvy formátů MSMQ
Net.msmq://<machine-name>/private/abc False (výchozí) Nativní (výchozí) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc False SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc True Nativní PUBLIC=some-guid (IDENTIFIKÁTOR GUID fronty)

Čtení zpráv z fronty nedoručených zpráv nebo fronty jedovatých zpráv

Pokud chcete číst zprávy z fronty jedovatých zpráv, která je podřadí cílové fronty, otevřete ServiceHost ji s adresou podkateře.

Příklad: Služba, která čte z fronty otrávených zpráv privátní fronty PurchaseOrders z místního počítače, by adresovala net.msmq://localhost/private/PurchaseOrders; Jed.

Chcete-li číst zprávy z systémové transakční fronty nedoručených zpráv, musí být identifikátor URI formuláře: net.msmq://localhost/system$; DeadXact.

Pokud chcete číst zprávy z fronty nedoručených zpráv systému, musí být identifikátor URI formuláře: net.msmq://localhost/system$; DeadLetter.

Pokud používáte vlastní frontu nedoručených zpráv, mějte na paměti, že fronta nedoručených zpráv se musí nacházet v místním počítači. Proto je identifikátor URI fronty nedoručených zpráv omezen na formulář:

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

Služba WCF ověřuje, že všechny zprávy, které přijímá, byly adresovány konkrétní frontě, na které naslouchá. Pokud cílová fronta zprávy neodpovídá frontě, ve které se nachází, služba zprávu nezpracuje. Jedná se o problém, kdy služby, které poslouchají frontu nedoručených zpráv, musí adresovat, protože všechny zprávy ve frontě nedoručených zpráv měly být doručeny jinde. Pokud chcete číst zprávy z fronty nedoručených zpráv nebo z jedovaté fronty, musí se použít parametr s parametrem ServiceBehaviorAny . Příklad najdete ve frontách nedoručených zpráv.

Adresování msmqIntegrationBinding a služby

Slouží MsmqIntegrationBinding ke komunikaci s tradičními aplikacemi MSMQ. Kvůli usnadnění spolupráce s existující aplikací MSMQ wcf podporuje pouze adresování názvů formátů. Zprávy odeslané pomocí této vazby proto musí odpovídat schématu identifikátoru URI:

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

Název msMQ-format-name je ve formuláři určeném nástrojem MSMQ v části O řízení front zpráv.

Všimněte si, že při příjmu zpráv z fronty můžete MsmqIntegrationBindingpoužívat pouze názvy přímých formátů a veřejné a privátní formáty (vyžaduje integraci služby Active Directory). Doporučujeme však používat názvy přímých formátů. Například v systému Windows Vista při použití jakéhokoli jiného názvu formátu dojde k chybě, protože se systém pokusí otevřít podkapulu, který lze otevřít pouze s názvy přímých formátů.

Při adresování srmp pomocí MsmqIntegrationBinding, není nutné přidat /msmq/ do názvu přímého formátu, aby pomohl Internetová informační služba (IIS) s odesíláním. Například: Při adresování fronty abc pomocí protokolu SRMP místo DIRECT=http://adatum.com/msmq/private$/abc, byste měli použít DIRECT=http://adatum.com/private$/abc.

Všimněte si, že nelze použít adresu net.msmq:// s MsmqIntegrationBinding. Vzhledem k tomu MsmqIntegrationBinding , že podporuje přidělování názvů formátu MSMQ volného formátu, můžete použít službu WCF, která používá tuto vazbu k použití funkcí vícesměrového vysílání a distribučního seznamu v MSMQ. CustomDeadLetterQueue Při použití parametru MsmqIntegrationBinding. Musí být ve formátu net.msmq://, podobně jako je zadán pomocí NetMsmqBinding.

Viz také