Bagikan melalui


Filter Pesan

Untuk menerapkan perutean berbasis konten, Layanan Perutean menggunakan MessageFilter implementasi yang memeriksa bagian tertentu dari pesan, seperti alamat, nama titik akhir, atau pernyataan JalurX tertentu. Jika tidak ada filter pesan yang disediakan dengan .NET Framework 4.6.1 yang memenuhi kebutuhan Anda, Anda dapat membuat filter kustom dengan membuat implementasi baru MessageFilter kelas dasar.

Saat mengonfigurasi Layanan Perutean, Anda harus menentukan elemen filter (FilterElement objek) yang menjelaskan jenis MessageFilter dan data pendukung apa pun yang diperlukan untuk membuat filter, seperti nilai string tertentu untuk dicari dalam pesan. Perhatikan bahwa membuat elemen filter hanya menentukan filter pesan individual; untuk menggunakan filter untuk mengevaluasi dan merutekan pesan, Anda juga harus menentukan tabel filter (FilterTableEntryCollection).

Setiap entri dalam tabel filter mereferensikan elemen filter dan menentukan titik akhir klien tempat pesan akan dirutekan jika pesan cocok dengan filter. Entri tabel filter juga memungkinkan Anda untuk menentukan kumpulan titik akhir cadangan (BackupEndpointCollection), yang menentukan daftar titik akhir tempat pesan akan dikirim jika terjadi kegagalan transmisi saat mengirim ke titik akhir utama. Titik akhir ini akan dicoba dalam urutan yang ditentukan hingga titik akhir berhasil.

Filter Pesan

Filter pesan yang digunakan oleh Layanan Perutean menyediakan fungsionalitas pemilihan pesan umum, seperti mengevaluasi nama titik akhir tempat pesan dikirim, tindakan SOAP, atau alamat atau awalan alamat tempat pesan dikirim. Filter juga dapat digabungkan dengan AND kondisi, sehingga pesan hanya akan dirutekan ke titik akhir jika pesan cocok dengan kedua filter. Anda juga dapat membuat filter kustom dengan membuat implementasi Anda sendiri dari MessageFilter.

Tabel berikut mencantumkan FilterType yang digunakan oleh Layanan Perutean, kelas yang menerapkan filter pesan tertentu, dan FilterData parameter yang diperlukan.

Jenis Filter Deskripsi Memfilter Arti Data Contoh Filter
Perbuatan Menggunakan kelas ActionMessageFilter untuk mencocokkan pesan yang berisi tindakan tertentu. Tindakan untuk memfilter. <filter name="action1" filterType="Action" filterData="http://namespace/contract/operation" />
EndpointAddress Menggunakan kelas EndpointAddressMessageFilter, dengan IncludeHostNameInComparison == true untuk mencocokkan pesan yang berisi alamat tertentu. Alamat yang akan difilter (di header Kepada). <filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressPrefix Menggunakan kelas PrefixEndpointAddressMessageFilter, dengan IncludeHostNameInComparison == true untuk mencocokkan pesan yang berisi awalan tertentu. Alamat untuk memfilter saat menggunakan pencocokan awalan terpanjang. <filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/" />
Dan Menggunakan kelas StrictAndMessageFilter yang selalu mengevaluasi kedua kondisi sebelum kembali. filterData tidak digunakan; sebagai gantinya filter1 dan filter2 memiliki nama filter pesan yang sesuai (juga dalam tabel), yang harus DANbersama-sama. <filter name="and1" filterType="And" filter1="address1" filter2="action1" />
Kustom Jenis yang ditentukan pengguna yang memperluas MessageFilter kelas dan memiliki konstruktor yang mengambil string. Atribut customType adalah nama jenis kelas yang sepenuhnya memenuhi syarat untuk dibuat; filterData adalah string yang akan diteruskan ke konstruktor saat membuat filter. <filter name="custom1" filterType="Custom" customType="CustomAssembly.CustomMsgFilter, CustomAssembly" filterData="Custom Data" />
EndpointName Menggunakan EndpointNameMessageFilter kelas untuk mencocokkan pesan berdasarkan nama titik akhir layanan tempat mereka tiba. Nama titik akhir layanan, misalnya: "serviceEndpoint1". Ini harus menjadi salah satu titik akhir yang diekspos pada Layanan Perutean. <filter name="stock1" filterType="Endpoint" filterData="SvcEndpoint" />
MatchAll Menggunakan MatchAllMessageFilter kelas. Filter ini cocok dengan semua pesan yang masuk. filterData tidak digunakan. Filter ini akan selalu cocok dengan semua pesan. <filter name="matchAll1" filterType="MatchAll" />
XPath Menggunakan XPathMessageFilter kelas untuk mencocokkan kueri JalurX tertentu dalam pesan. Kueri JalurX yang akan digunakan saat mencocokkan pesan. <filter name="XPath1" filterType="XPath" filterData="//ns:element" />

Contoh berikut menentukan entri filter yang menggunakan filter pesan JalurX, EndpointName, dan PrefixEndpointAddress. Contoh ini juga menunjukkan penggunaan filter kustom untuk entri RoundRobinFilter1 dan RoundRobinFilter2.

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

Catatan

Hanya menentukan filter tidak menyebabkan pesan agar dievaluasi terhadap filter. Filter harus ditambahkan ke tabel filter, yang kemudian dikaitkan dengan titik akhir layanan yang diekspos oleh Layanan Perutean.

Tabel Namespace layanan

Saat menggunakan filter JalurX, data filter yang berisi kueri JalurX bisa menjadi sangat besar karena penggunaan namespace layanan. Untuk mengatasi masalah ini, Layanan Perutean menyediakan kemampuan untuk menentukan awalan namespace layanan Anda sendiri dengan menggunakan tabel namespace layanan.

Tabel namespace layanan adalah kumpulan NamespaceElement objek yang menentukan awalan namespace layanan untuk namespace layanan umum yang dapat digunakan dalam JalurX.. Berikut ini adalah namespace layanan dan awalan namespace layanan default yang terkandung dalam tabel namespace layanan.

Awalan Ruang nama
s11 http://schemas.xmlsoap.org/soap/envelope
s12 http://www.w3.org/2003/05/soap-envelope
wsaAugust2004 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

Ketika Anda tahu bahwa Anda akan menggunakan namespace layanan tertentu dalam kueri JalurX, Anda dapat menambahkannya ke tabel namespace layanan bersama dengan awalan namespace layanan unik dan menggunakan awalan dalam kueri JalurX apa pun bukan namespace layanan lengkap. Contoh berikut menentukan awalan "kustom" untuk namespace layanan "http://my.custom.namespace", yang kemudian digunakan dalam kueri JalurX yang terkandung dalam filterData.

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

Tabel Filter

Meskipun setiap elemen filter menentukan perbandingan logis yang dapat diterapkan ke pesan, tabel filter menyediakan hubungan antara elemen filter dan titik akhir klien tujuan. Tabel filter adalah kumpulan FilterTableEntryElement objek bernama yang menentukan hubungan antara filter, titik akhir tujuan utama, dan daftar titik akhir cadangan alternatif. Entri tabel filter juga memungkinkan Anda menentukan prioritas opsional untuk setiap kondisi filter. Contoh berikut menentukan dua filter lalu menentukan tabel filter yang menghubungkan setiap filter dengan titik akhir tujuan.

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

Prioritas Evaluasi Filter

Secara default, semua entri dalam tabel filter dievaluasi secara bersamaan, dan pesan yang dievaluasi dirutekan ke titik akhir yang terkait dengan setiap entri filter yang cocok. Jika beberapa filter mengevaluasi ke true, dan pesan adalah satu arah atau dupleks, pesannya dikirimkan ke titik akhir untuk semua filter yang cocok. Pesan permintaan-balasan tidak dapat dikirimkan karena hanya satu balasan yang dapat dikembalikan ke klien.

Logika perutean yang lebih kompleks dapat diimplementasikan dengan menentukan tingkat prioritas untuk setiap filter; Layanan Perutean mengevaluasi semua filter pada tingkat prioritas tertinggi terlebih dahulu. Jika pesan cocok dengan filter tingkat ini, tidak ada filter prioritas yang lebih rendah yang diproses. Misalnya, pesan satu arah yang masuk dievaluasi terlebih dahulu terhadap semua filter dengan prioritas 2. Pesan tidak cocok dengan filter apa pun pada tingkat prioritas ini, jadi selanjutnya pesan dibandingkan terhadap filter dengan prioritas 1. Dua filter prioritas 1 cocok dengan pesan, dan karena merupakan pesan satu arah, filter tersebut dirutekan ke kedua titik akhir tujuan. Karena kecocokan ditemukan di antara filter prioritas 1, tidak ada filter prioritas 0 yang dievaluasi.

Catatan

Jika tidak ada prioritas yang ditentukan, prioritas default 0 akan digunakan.

Contoh berikut menentukan tabel filter yang menentukan prioritas 2, 1, dan 0 untuk filter yang dirujuk dalam tabel.

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

Dalam contoh sebelumnya, jika pesan cocok dengan XPathFilter, pesan akan dirutekan ke roundingCalcEndpoint dan tidak ada filter lebih lanjut dalam tabel yang akan dievaluasi karena semua filter lain memiliki prioritas yang lebih rendah. Namun, jika pesan tidak cocok dengan XPathFilter, pesan tersebut akan dievaluasi terhadap semua filter prioritas lebih rendah berikutnya, EndpointNameFilter dan PrefixAddressFilter.

Catatan

Jika memungkinkan, gunakan filter eksklusif daripada menentukan prioritas karena evaluasi prioritas dapat mengakibatkan penurunan kinerja.

Daftar Cadangan

Setiap filter dalam tabel filter dapat secara opsional menentukan daftar cadangan, yang merupakan kumpulan titik akhir bernama (BackupEndpointCollection). Kumpulan ini berisi daftar titik akhir yang diurutkan tempat pesan akan dikirim jika terjadi CommunicationException saat mengirim ke titik akhir utama yang ditentukan dalam EndpointName. Contoh berikut menentukan daftar cadangan bernama "backupServiceEndpoints" yang berisi dua titik akhir.

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

Dalam contoh sebelumnya, jika pengiriman ke titik akhir utama "Tujuan" gagal, Layanan Perutean akan mencoba mengirim ke setiap titik akhir dalam urutan yang tercantum, pertama-tama mengirim ke backupServiceQueue dan kemudian mengirim ke alternateServiceQueue jika pengiriman ke backupServiceQueue gagal. Jika semua titik akhir cadangan gagal, kesalahan dikembalikan.