Aracılığıyla paylaş


İleti Filtreleri

İçerik tabanlı yönlendirme uygulamak için Yönlendirme Hizmeti, iletinin adres, uç nokta adı veya belirli bir XPath deyimi gibi belirli bölümlerini inceleyen uygulamaları kullanır MessageFilter . .NET Framework 4.6.1 ile sağlanan ileti filtrelerinden hiçbiri gereksinimlerinizi karşılamıyorsa, temel MessageFilter sınıfın yeni bir uygulamasını oluşturarak özel bir filtre oluşturabilirsiniz.

Yönlendirme Hizmeti'ni yapılandırırken FilterElement türünü ve filtreyi oluşturmak için gereken tüm destekleyici verileri (örneğin, ileti içinde aranacak belirli dize değerleri) tanımlayan filtre öğelerini (nesneleri) tanımlamanız gerekir. Filtre öğelerini oluşturmanın yalnızca tek tek ileti filtrelerini tanımladığını unutmayın; iletileri değerlendirmek ve yönlendirmek için filtreleri kullanmak için bir filtre tablosu () tanımlamanız gerekirFilterTableEntryCollection.

Filtre tablosundaki her girdi bir filtre öğesine başvurur ve ileti filtreyle eşleşiyorsa iletinin yönlendirileceği istemci uç noktasını belirtir. Filtre tablosu girişleri, birincil uç noktaya gönderirken iletinin iletim hatası durumunda iletinin iletileceği uç noktaların listesini tanımlayan bir yedekleme uç noktaları koleksiyonu (BackupEndpointCollection ) belirtmenize de olanak sağlar. Bu uç noktalar, biri başarılı olana kadar belirtilen sırayla denenecek.

İleti Filtreleri

Yönlendirme Hizmeti tarafından kullanılan ileti filtreleri, iletinin gönderildiği uç noktanın adını, SOAP eylemini veya iletinin gönderildiği adres veya adres ön ekini değerlendirme gibi yaygın ileti seçimi işlevleri sağlar. Filtreler bir AND koşulla da birleştirilebilir, böylece iletiler yalnızca ileti her iki filtreyle de eşleşiyorsa bir uç noktaya yönlendirilir. Kendi uygulamanızı MessageFilteroluşturarak da özel filtreler oluşturabilirsiniz.

Aşağıdaki tabloda Yönlendirme Hizmeti tarafından kullanılan FilterType, belirli ileti filtresini uygulayan sınıf ve gerekli parametreler FilterData listelenir.

Filtre Türü Açıklama Filtre Verileri Anlamı Örnek Filtre
Eylem Sınıfını ActionMessageFilter , belirli bir eylemi içeren iletileri eşleştirmek için kullanır. Filtre uygulama eylemi. <filter name="action1" filterType="Action" filterData="http://namespace/contract/operation" />
Uç Nokta Adresi EndpointAddressMessageFilter belirli bir adres içeren iletileri eşleştirmek için ile IncludeHostNameInComparison == true sınıfını kullanır. Filtre uygulamak için adres (Son üst bilgisinde). <filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressPrefix PrefixEndpointAddressMessageFilter belirli bir adres ön eki içeren iletileri eşleştirmek için ile IncludeHostNameInComparison == true sınıfını kullanır. En uzun ön ek eşleştirmesi kullanılarak üzerinde filtreme yapılacak adres. <filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/" />
Ve StrictAndMessageFilter sınıfını, döndürmeden önce her iki koşulu da değerlendiren şekilde kullanır. filterData kullanılmaz; bunun yerine, karşılık gelen ileti filtrelerinin (tabloda da yer alan) adlarını içeren filter1 ve filter2 kullanılır, bu filtreler birlikte VE yapılmalıdır. <filter name="and1" filterType="And" filter1="address1" filter2="action1" />
Özelleştirilmiş MessageFilter sınıfını genişleten ve dize alan bir oluşturucuya sahip kullanıcı tanımlı bir tür. customType özniteliği, oluşturulacak sınıfın tam tür adıdır; filterData, filtreyi oluştururken oluşturucuya geçirilir dizedir. <filter name="custom1" filterType="Custom" customType="CustomAssembly.CustomMsgFilter, CustomAssembly" filterData="Custom Data" />
Uç Nokta Adı sınıfını EndpointNameMessageFilter , iletileri geldikleri hizmet uç noktasının adına göre eşleştirmek için kullanır. Hizmet uç noktasının adı, örneğin: "serviceEndpoint1". Bu, Yönlendirme Hizmeti'ne sunulan uç noktalardan biri olmalıdır. <filter name="stock1" filterType="Endpoint" filterData="SvcEndpoint" />
MatchAll (Hepsini Eşle) sınıfını MatchAllMessageFilter kullanır. Bu filtre tüm gelen iletilerle eşleşir. filterData kullanılmaz. Bu filtre her zaman tüm iletilerde eşleşecektir. <filter name="matchAll1" filterType="MatchAll" />
XPath sınıfını XPathMessageFilter , iletideki belirli XPath sorgularını eşleştirmek için kullanır. İletileri eşleştirirken kullanılacak XPath sorgusu. <filter name="XPath1" filterType="XPath" filterData="//ns:element" />

Aşağıdaki örnek XPath, EndpointName ve PrefixEndpointAddress ileti filtrelerini kullanan filtre girdilerini tanımlar. Bu örnek, RoundRobinFilter1 ve RoundRobinFilter2 girişleri için özel bir filtre kullanmayı da gösterir.

<filters>  
     <filter name="XPathFilter" filterType="XPath"
             filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 1"/>  
     <filter name="EndpointNameFilter" filterType="EndpointName"
             filterData="calculatorEndpoint"/>  
     <filter name="PrefixAddressFilter" filterType="PrefixEndpointAddress"
             filterData="http://localhost/routingservice/router/rounding/"/>  
     <filter name="RoundRobinFilter1" filterType="Custom"
             customType="RoutingServiceFilters.RoundRobinMessageFilter,
             RoutingService" filterData="group1"/>  
     <filter name="RoundRobinFilter2" filterType="Custom"
             customType="RoutingServiceFilters.RoundRobinMessageFilter,
             RoutingService" filterData="group1"/>  
</filters>  

Uyarı

Basitçe bir filtre tanımlamak, iletilerin filtreye göre değerlendirilmesine neden olmaz. Filtrenin bir filtre tablosuna eklenmesi gerekir; bu tablo daha sonra Yönlendirme Hizmeti tarafından kullanıma sunulan hizmet uç noktasıyla ilişkilendirilir.

Ad Alanı Tablosu

XPath filtresi kullanılırken, ad alanlarının kullanılması nedeniyle XPath sorgusunu içeren filtre verileri son derece büyük hale gelebilir. Bu sorunu gidermek için Yönlendirme Hizmeti, ad alanı tablosunu kullanarak kendi ad alanı ön eklerinizi tanımlama olanağı sağlar.

Ad alanı tablosu, bir XPath'te kullanılabilecek ortak ad alanları için ad alanı ön eklerini tanımlayan bir nesne koleksiyonudur NamespaceElement . Aşağıda, ad alanı tablosunda yer alan varsayılan ad alanları ve ad alanı ön ekleri yer alır.

Önek Namespace
s11 http://schemas.xmlsoap.org/soap/envelope
s12 http://www.w3.org/2003/05/soap-envelope
wsaAğustos2004 http://schemas.xmlsoap.org/ws/2004/08/addressing
wsa10 http://www.w3.org/2005/08/addressing
Sm http://schemas.microsoft.com/serviceModel/2004/05/xpathfunctions
tempuri http://tempuri.org
ser http://schemas.microsoft.com/2003/10/Serialization

XPath sorgularınızda belirli bir ad alanı kullanacağınızı bildiğinizde, bunu benzersiz bir ad alanı ön eki ile birlikte ad alanı tablosuna ekleyebilir ve ön eki tam ad alanı yerine herhangi bir XPath sorgusunda kullanabilirsiniz. Aşağıdaki örnek, ad alanı "http://my.custom.namespace"için bir "özel" ön eki tanımlar. Bu ön ek, filterData içinde yer alan XPath sorgusunda kullanılır.

<namespaceTable>  
     <add prefix="custom" namespace="http://my.custom.namespace/"/>  
</namespaceTable>  
<filters>  
     <filter name="XPathFilter" filterType="XPath" filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 1"/>  
</filters>  

Tabloları Filtrele

Her filtre öğesi bir iletiye uygulanabilecek mantıksal bir karşılaştırma tanımlasa da, filtre tablosu filtre öğesi ile hedef istemci uç noktası arasındaki ilişkiyi sağlar. Filtre tablosu, filtre, birincil hedef uç nokta ve alternatif yedekleme uç noktalarının listesi arasındaki ilişkiyi tanımlayan adlandırılmış bir nesne koleksiyonudur FilterTableEntryElement . Filtre tablosu girişleri, her filtre koşulu için isteğe bağlı bir öncelik belirtmenize de olanak sağlar. Aşağıdaki örnek iki filtre tanımlar ve ardından her filtreyi bir hedef uç noktayla ilişkilendiren bir filtre tablosu tanımlar.

<routing>  
     <filters>  
       <filter name="AddAction" filterType="Action" filterData="Add" />  
       <filter name="SubtractAction" filterType="Action" filterData="Subtract" />  
     </filters>  
     <filterTables>  
       <table name="routingTable1">  
         <filters>  
           <add filterName="AddAction" endpointName="Addition" />  
           <add filterName="SubtractAction" endpointName="Subtraction" />  
         </filters>  
       </table>  
     </filterTables>
</routing>  

Filtre Değerlendirme Önceliği

Varsayılan olarak, filtre tablosundaki tüm girişler aynı anda değerlendirilir ve değerlendirilen ileti eşleşen her filtre girişiyle ilişkili uç noktalara yönlendirilir. Birden çok filtre true ile değerlendirilirse ve mesaj tek yönlü veya çift yönlüyse, mesaj tüm eşleşen filtreler için uç noktalara çok noktaya yayın yapılır. İstemciye yalnızca bir yanıt döndürülebildiğinden, istek-yanıt iletileri çok noktaya yayın yapılamaz.

Her filtre için öncelik düzeyleri belirtilerek daha karmaşık yönlendirme mantığı uygulanabilir; Yönlendirme Hizmeti önce tüm filtreleri en yüksek öncelik düzeyinde değerlendirir. İleti bu düzeydeki bir filtreyle eşleşiyorsa, daha düşük öncelikli hiçbir filtre işlenmez. Örneğin, gelen tek yönlü ileti önce 2 önceliğine sahip tüm filtrelere göre değerlendirilir. İleti bu öncelik düzeyindeki hiçbir filtreyle eşleşmiyor, bu nedenle sonraki ileti 1 önceliğine sahip filtrelerle karşılaştırılır. İki öncelik 1 filtresi iletiyle eşleşer ve tek yönlü bir ileti olduğundan her iki hedef uç noktaya da yönlendirilir. Öncelik 1 filtreleri arasında bir eşleşme bulunduğundan, öncelik 0 filtresi değerlendirilmez.

Uyarı

Öncelik belirtilmezse varsayılan öncelik olan 0 kullanılır.

Aşağıdaki örnek, tabloda başvuruda bulunan filtreler için 2, 1 ve 0 önceliklerini belirten bir filtre tablosu tanımlar.

<filterTables>  
     <filterTable name="filterTable1">  
          <add filterName="XPathFilter" endpointName="roundingCalcEndpoint"
               priority="2"/>  
          <add filterName="EndpointNameFilter" endpointName="regularCalcEndpoint"
               priority="1"/>  
          <add filterName="PrefixAddressFilter" endpointName="roundingCalcEndpoint"
               priority="1"/>  
          <add filterName="MatchAllMessageFilter" endpointName="defaultCalcEndpoint"
               priority="0"/>  
     </filterTable>  
</filterTables>  

Yukarıdaki örnekte, bir ileti XPathFilter ile eşleşiyorsa, bu ileti roundingCalcEndpoint'e yönlendirilir ve diğer tüm filtreler daha düşük öncelikli olduğundan tablodaki başka hiçbir filtre değerlendirilmez. Ancak, ileti XPathFilter ile eşleşmezse, sonraki düşük öncelikli EndpointNameFilter ve PrefixAddressFilter filtrelerine göre değerlendirilir.

Uyarı

Mümkün olduğunda, öncelik değerlendirmesi performans düşüşüyle sonuçlandığından öncelik belirtmek yerine özel kullanım filtreleri kullanın.

Yedekleme Listeleri

Filtre tablosundaki her filtre isteğe bağlı olarak adlandırılmış bir uç nokta koleksiyonuBackupEndpointCollection () olan bir yedekleme listesi belirtebilir. Belirtilen CommunicationException birincil uç noktaya gönderim esnasında EndpointName durumunda, bu koleksiyon, iletinin aktarılacağı uç noktaların sıralı bir listesini içerir. Aşağıdaki örnek, iki uç nokta içeren "backupServiceEndpoints" adlı bir yedekleme listesi tanımlar.

<filterTables>  
     <filterTable name="filterTable1">  
          <add filterName="MatchAllFilter1" endpointName="Destination" backupList="backupEndpointList"/>  
     </filterTable>  
</filterTables>  
<backupLists>  
     <backupList name="backupEndpointList">  
          <add endpointName="backupServiceQueue" />  
          <add endpointName="alternateServiceQueue" />  
     </backupList>  
</backupLists>  

Yukarıdaki örnekte, birincil "Hedef" uç noktasına gönderme başarısız olursa, Yönlendirme Hizmeti listelenen sırayla her uç noktaya göndermeyi dener, önce backupServiceQueue'ye gönderir ve ardından backupServiceQueue'ye gönderme başarısız olursa alternateServiceQueue'ye gönderir. Tüm yedekleme uç noktaları başarısız olursa bir hata döndürülür.