Aracılığıyla paylaş


Hizmet Uç Noktaları ve Kuyruk İşleme

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. Aşağıdaki çizimde klasik Windows Communication Foundation (WCF) kuyruğa alınmış uygulama dağıtımı gösterilmektedir.

Queued Application Diagram

İ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 QueueName arasında, Active Directory dizin hizmetinde yayımlanmamış bir özel kuyruğu belirtmek için bir olabilirPrivate$.

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 MSMQ kuyruğa alınmış 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ı>

konumu:

  • <host-name> , 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 olarak belirtmemelisiniz. MSMQ yollarından farklı olarak WCF URI formunda "$" olmadığını unutmayın.

  • <queue-name> , kuyruğun adıdır. Kuyruk adı bir alt sorguya da başvurabilir. Bu nedenle kuyruk-adı <>= <name-of-queue>[;sub-queue-name].

Ö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.

Örnek2: Bilgisayar def atadatum.com barındırılan bir genel kuyruk Hesapları Ödemeli'yi ele almak için URI net.msmq://def.adatum.com/AccountsPayable olabilir.

Kuyruk adresi, dinleyici tarafından iletilerin okunduğu 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. Bu, önerilen yaklaşımdır.

  • Farklı anlaşmalara sahip birden çok uç nokta belirtin, ancak tüm uç noktaların aynı NetMsmqBinding nesneyi kullandığından emin olun. ServiceModel'deki dağıtım mantığı, gönderim için aktarım kanalındaki iletileri okuyan bir ileti pompası kullanır ve bu da sonunda sözleşmeye göre iletileri farklı uç noktalara göre çoğullamadan çıkarır. Dinleme URI'sini/Bağlama ç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.

Özelliğin QueueTransferProtocol belirtilmesi yalnızca gönderme özelliğidir. Bu, istemci tarafından hangi tür bir kuyruk aktarım protokolünün kullanılacağının göstergesidir.

Active Directory kullanarak

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 olarak trueayarlanırsa, kuyruğa alınan kanal active directory kullanarak net.msmq:// URI'sini adı biçimlendirecek şekilde 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 sağlanan net.msmq URI adını MSMQ biçim adlarına eşlemeyi işler. Aşağıdaki tabloda, bunlar arasında eşlemek için kullanılan kurallar özetlemektedir.

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 False SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc True Yerel PUBLIC=some-guid (kuyruğun GUID'i)

Teslim Edilemeyen İleti Kuyruğundan veya Zehirli İleti Kuyruğundan İletileri Okuma

Hedef kuyruğun alt sırası olan bir zehirli ileti kuyruğundan gelen iletileri okumak için, alt sıranın adresiyle dosyasını açın ServiceHost .

Örnek: Yerel makineden PurchaseOrders özel kuyruğunun zehirli ileti kuyruğundan okuyan bir hizmet net.msmq://localhost/private/PurchaseOrders; Zehir.

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 formla 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. Teslim edilemeyen bir kuyruktan veya bir zehir kuyruğundan gelen iletileri okumak için parametresine Any sahip bir ServiceBehavior 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.

kullanarak MsmqIntegrationBindingSRMP'yi ele alırken, Internet Information Services'in (IIS) gönderime yardımcı olması için doğrudan biçim adına /msmq/ eklenmesi gerekmez. Örneğin: SRMP protokolünün yerine DIRECT=http://adatum.com/msmq/private$/abcabc kuyruğuna adreslerken kullanmanız DIRECT=http://adatum.com/private$/abcgerekir.

ile MsmqIntegrationBindingnet.msmq:// adreslemeyi kullanamayacağınızı unutmayın. MsmqIntegrationBinding Serbest biçimli MSMQ biçimli ad adresleme özelliğini desteklediği için, MSMQ'da çok noktaya yayın ve dağıtım listesi özelliklerini kullanmak için bu bağlamayı kullanan bir WCF hizmeti kullanabilirsiniz. bir özel durum kullanılırken belirtiliyor CustomDeadLetterQueueMsmqIntegrationBinding. kullanılarak belirtildiği NetMsmqBindinggibi net.msmq:// biçiminde olmalıdır.

Ayrıca bkz.