Aracılığıyla paylaş


Hizmet Uç Noktaları ve Kuyruk Adresleme

Bu konuda istemcilerin kuyruklardan okunan hizmetleri nasıl ele aldıklarını ve hizmet uç noktalarının kuyruklarla nasıl eşlendiğini anlatılmaktadır. Hatırlatma olarak, aşağıdaki çizimde klasik Windows Communication Foundation (WCF) kuyruğa alınmış uygulama dağıtımı gösterilmektedir.

Kuyruğa Alınan Uygulama Diyagramı

İstemcinin iletiyi hizmete göndermesi için, istemci iletiyi Hedef Kuyruğa giderir. Hizmetin kuyruktan iletileri okuması için dinleme adresini Hedef Kuyruk olarak ayarlar. WCF'de adresleme Tekdüzen Kaynak Tanımlayıcısı (URI) tabanlıyken Message Queuing (MSMQ) kuyruğu adları URI tabanlı değildir. Bu nedenle, WCF kullanarak MSMQ'da oluşturulan kuyrukların nasıl ele alınduğunu anlamak önemlidir.

MSMQ Adresleme

MSMQ bir kuyruğu tanımlamak için yolları ve biçim adlarını kullanır. Yollar bir konak adı ve bir QueueNamebelirtir. İsteğe bağlı olarak, ana bilgisayar adı ile Private$ arasında, Active Directory dizin hizmetinde yayımlanmamış bir özel kuyruğu belirtmek için bir olabilirQueueName.

Yol adları, yönlendirme ve kuyruk yöneticisi aktarım protokolü de dahil olmak üzere adresin ek yönlerini belirlemek için "FormatNames" ile eşlenir. Kuyruk Yöneticisi iki aktarım protokolünü destekler: yerel MSMQ protokolü ve SOAP Reliable Messaging Protokolü (SRMP).

MSMQ yolu ve biçim adları hakkında daha fazla bilgi için bkz. Message Queuing Hakkında.

NetMsmqBinding ve Hizmet Adresleme

Bir iletiyi bir hizmete yönlendirirken, iletişim için kullanılan aktarıma göre URI'deki düzen seçilir. WCF'deki her taşımanın benzersiz bir şeması vardır. Şema, iletişim için kullanılan taşımanın doğasını yansıtmalıdır. Örneğin, net.tcp, net.pipe, HTTP vb.

WCF'de kuyruğa alınmış MSMQ aktarımı, bir net.msmq şemasını kullanıma sunar. net.msmq şeması kullanılarak adreslenen tüm iletiler MSMQ kuyruğa alınmış aktarım kanalı üzerinden kullanılarak NetMsmqBinding gönderilir.

WCF'de bir kuyruğun adreslenmesi aşağıdaki deseni temel alır:

net.msmq: // <konak-adı> / [private/] <kuyruk-adı>

nerede:

  • < ana bilgisayar adı> , Hedef Kuyruğu barındıran makinenin adıdır.

  • [private] isteğe bağlıdır. Özel kuyruk olan bir Hedef Kuyruğu ele alırken kullanılır. Bir genel kuyruğu ele almak için "özel" belirtmemeniz gerekir. MSMQ yollarından farklı olarak WCF URI formunda "$" olmadığını unutmayın.

  • < kuyruk adı> kuyruğun adıdır. Kuyruk adı bir alt kuyruğa da başvurabilir. Bu nedenle <kuyruk-adı> = <kuyruğun-adi>[;alt-kuyruk-adi].

Örnek1: abc atadatum.com bilgisayarında barındırılan PurchaseOrders adlı özel kuyruğu ele almak için URI net.msmq://abc.adatum.com/private/PurchaseOrders olabilir.

Örnek 2: def.adatum.com'da barındırılan bilgisayarda bir genel kuyruk olan AccountsPayable'i ele almak için URI net.msmq://def.adatum.com/AccountsPayable olabilir.

Kuyruk adresi, dinleyici tarafından iletilerin okunması için dinleme URI'si olarak kullanılır. Başka bir deyişle, kuyruk adresi TCP yuvasının dinleme bağlantı noktasına eşdeğerdir.

Bir kuyruktan okuyan bir uç nokta, ServiceHost açılırken daha önce belirtilen aynı düzeni kullanarak kuyruğun adresini belirtmelidir. Örnekler için bkz. Net MSMQ Bağlama.

Kuyrukta Birden Çok Sözleşme

Kuyruktaki iletiler farklı sözleşmeler uygulayabilir. Bu durumda, tüm iletileri başarıyla okumak ve işlemek için aşağıdakilerden birinin doğru olması önemlidir:

  • Tüm sözleşmeleri uygulayan bir hizmet için bir uç nokta belirtin. Önerilen yaklaşım budur.

  • Farklı anlaşmalara sahip birden çok uç nokta belirtin, ancak tüm uç noktaların aynı NetMsmqBinding nesneyi kullandığından emin olun. ServiceModel'deki gönderim mantığı, aktarım kanalındaki iletileri okumak için bir ileti pompası kullanır; bu pompa, sonunda iletileri sözleşmeye göre farklı uç noktalara ayırır. Dinleme URI'si/Bağlayıcı çifti için bir ileti pompası oluşturulur. Kuyruk adresi, kuyruğa alınan dinleyici tarafından Dinleme URI'si olarak kullanılır. Tüm uç noktaların aynı bağlama nesnesini kullanmasını sağlamak, iletiyi okumak için tek bir ileti pompasının kullanılmasını ve sözleşmeye bağlı olarak ilgili uç noktaların çoğullanmasını kaldırmayı sağlar.

SRMP Mesajlaşma

Daha önce açıklandığı gibi kuyruktan kuyruğa aktarımlar için SRMP protokolunu kullanabilirsiniz. Bu genellikle bir HTTP aktarımı İletim Kuyruğu ile Hedef Kuyruk arasında ileti iletirken kullanılır.

SRMP aktarım protokolünü kullanmak için, daha önce belirtildiği gibi net.msmq URI düzenini kullanarak iletileri adresleyip özelliğinde QueueTransferProtocolNetMsmqBindingSRMP veya Güvenli SRMP seçimini belirtin.

QueueTransferProtocol özelliğinin belirtilmesi yalnızca gönderme işlevine sahiptir. Bu, istemci tarafından hangi tür bir kuyruk aktarım protokolünün kullanılacağının göstergesidir.

Active Directory kullanma

MSMQ, Active Directory tümleştirmesi desteğiyle birlikte gelir. MSMQ Active Directory tümleştirmesi ile yüklendiğinde, makinenin bir Windows etki alanının parçası olması gerekir. Active Directory bulma kuyruklarını yayımlamak için kullanılır; bu tür kuyruklar genel kuyruklar olarak adlandırılır. Kuyruk adreslenirken, kuyruk Active Directory kullanılarak çözümlenebilir. Bu, bir ağ adının IP adresini çözümlemek için Etki Alanı Adı Sistemi'nin (DNS) kullanılmasına benzer. UseActiveDirectory içindeki NetMsmqBinding özelliği, kuyruğa alınan kanalın kuyruk URI'sini çözümlemek için Active Directory kullanması gerekip gerekmediğini gösteren bir Boole değeridir. Varsayılan olarak olarak falseolarak ayarlanır. UseActiveDirectory özelliği true olarak ayarlanırsa, kuyruğa alınan kanal Active Directory'yi kullanarak net.msmq:// URI'sini ad biçimine dönüştürür.

UseActiveDirectory özelliği yalnızca ileti gönderirken kuyruğun adresini çözümlemek için kullanıldığından ileti gönderen istemci için anlamlıdır.

net.msmq URI'sini Message Queuing Biçim Adlarına Eşleme

Kuyruğa alınan kanal, kanala verilen net.msmq URI adını MSMQ biçim adlarıyla eşleştirme işini yürütür. Aşağıdaki tabloda, bunlar arasında eşleme yapmak için kullanılan kurallar özetlenmektedir.

WCF URI tabanlı kuyruk adresi Active Directory özelliğini kullanma Kuyruk Aktarım Protokolü özelliği Sonuçta elde edilen MSMQ biçim adları
Net.msmq://<machine-name>/private/abc False (varsayılan) Yerel (varsayılan) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc Yanlış SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc Doğru Yerli PUBLIC=some-guid (kuyruğun GUID'i)

Dead-Letter Kuyruğundan veya Poison-Message Kuyruğundan İletileri Okuma

Hedef kuyruğun alt kuyruğu olan bir zehirli ileti kuyruğundan mesajları okumak için, alt kuyruğun adresiyle ServiceHost öğesini açın.

Örnek: Yerel makineden PurchaseOrders özel kuyruğunun zehirli ileti kuyruğundan okuyan bir hizmet, net.msmq://localhost/private/PurchaseOrders;zehir adresini kullanır.

Sistem işlemsel teslim edilemeyen ileti kuyruğundan gelen iletileri okumak için URI şu biçimde olmalıdır: net.msmq://localhost/system$;DeadXact.

Sistem işlem dışı bir teslim edilemeyen ileti kuyruğundan gelen iletileri okumak için URI şu biçimde olmalıdır: net.msmq://localhost/system$;DeadLetter.

Özel bir teslim edilemeyen ileti kuyruğu kullanırken, teslim edilemeyen ileti kuyruğunun yerel bilgisayarda bulunması gerektiğini unutmayın. Bu nedenle, teslim edilemeyen ileti kuyruğunun URI'si şu biçimle sınırlıdır:

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

WCF hizmeti, aldığı tüm iletilerin dinlediği belirli kuyruğa adreslendiğini doğrular. İletinin hedef kuyruğu içinde bulunduğu kuyrukla eşleşmiyorsa, hizmet iletiyi işlemez. Bu, teslim edilemeyen ileti kuyruğundaki tüm iletilerin başka bir yere teslim edilmesi amaçlandığından, teslim edilemeyen ileti kuyruğunu dinleyen hizmetlerin çözmesi gereken bir sorundur. Ölü harf kuyruğundan ya da bozuk bir kuyruktan mesajları okumak için, parametre olarak ServiceBehavior'e sahip bir Any kullanılmalıdır. Bir örnek için bkz Teslim Edilemeyen İleti Kuyrukları.

MsmqIntegrationBinding ve Hizmet Adresleme

MsmqIntegrationBinding, geleneksel MSMQ uygulamalarıyla iletişim için kullanılır. WcF, mevcut msmq uygulamasıyla birlikte çalışabilirliği kolaylaştırmak için yalnızca biçim adı adreslemesi destekler. Bu nedenle, bu bağlama kullanılarak gönderilen iletiler URI düzenine uygun olmalıdır:

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

MSMQ biçimli adı, MESSAGE Queuing Hakkında bölümünde MSMQ tarafından belirtilen forma ait.

kullanarak MsmqIntegrationBindingbir kuyruktan ileti alırken yalnızca doğrudan biçim adlarını ve genel ve özel biçim adlarını (Active Directory tümleştirmesi gerektirir) kullanabileceğinizi unutmayın. Ancak, doğrudan biçim adları kullanmanız tavsiye edilir. Örneğin, Windows Vista'da, sistem yalnızca doğrudan biçim adlarıyla açilebilen bir alt sıra açmayı denediğinden, başka bir biçim adı kullanmak hataya neden olur.

SRMP'yi MsmqIntegrationBinding kullanarak ele alırken, Internet Information Services'in (IIS) yönlendirme işlemlerine yardımcı olması için doğrudan biçim adına /msmq/ eklenmesi gerekmez. Örneğin: SRMP protokolünü kullanarak bir abc kuyruğuna adreslerken, DIRECT=http://adatum.com/msmq/private$/abc yerine DIRECT=http://adatum.com/private$/abc kullanmalısınız.

ile MsmqIntegrationBindingnet.msmq:// adreslemeyi kullanamayacağınızı unutmayın. MsmqIntegrationBinding serbest biçimli MSMQ format adı adreslemesini desteklediği için, bu bağı kullanarak bir WCF hizmeti ile MSMQ'da çok noktaya yayın ve dağıtım listesi özelliklerini kullanabilirsiniz. Biri istisna olmak üzere, CustomDeadLetterQueue kullanılırken MsmqIntegrationBinding belirtiliyor. kullanılarak belirtildiği NetMsmqBindinggibi net.msmq:// biçiminde olmalıdır.

Ayrıca bakınız