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.
İ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 QueueName
belirtir. İ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 QueueTransferProtocol
NetMsmqBinding
SRMP 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 false
olarak ayarlanır. UseActiveDirectory
Özelliği olarak true
ayarlanı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 MsmqIntegrationBinding
bir 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 MsmqIntegrationBinding
SRMP'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$/abc
abc kuyruğuna adreslerken kullanmanız DIRECT=http://adatum.com/private$/abc
gerekir.
ile MsmqIntegrationBinding
net.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 CustomDeadLetterQueue
MsmqIntegrationBinding
. kullanılarak belirtildiği NetMsmqBinding
gibi net.msmq:// biçiminde olmalıdır.