Filter Pesan Kustom
Sampel MessageFilter menunjukkan cara mengganti filter pesan yang digunakan Windows Communication Foundation (WCF) untuk mengirim pesan ke titik akhir.
Catatan
Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.
Ketika pesan pertama pada saluran tiba di server, server harus menentukan mana (jika ada) titik akhir yang terkait dengan URI yang harus menerima pesan. Proses ini dikontrol oleh objek MessageFilter yang dilampirkan ke EndpointDispatcher.
Setiap titik akhir layanan memiliki satu EndpointDispatcher. EndpointDispatcher memiliki AddressFilter dan ContractFilter. Penyatuan kedua filter ini adalah filter pesan yang digunakan untuk titik akhir tersebut.
Secara default, AddressFilter untuk titik akhir cocok dengan pesan apa pun yang ditujukan ke alamat yang cocok dengan EndpointAddresstitik akhir layanan. Secara default, ContractFilter untuk titik akhir memeriksa tindakan pesan masuk dan mencocokkan pesan apa pun dengan tindakan yang sesuai dengan salah satu tindakan operasi kontrak titik akhir layanan (hanya tindakan IsInitiating
=true
yang dipertimbangkan). Akibatnya, secara default, filter untuk titik akhir hanya cocok jika header To pesan adalah EndpointAddress dari titik akhir dan tindakan pesan yang cocok dengan salah satu tindakan operasi titik akhir.
Filter ini dapat diubah menggunakan perilaku. Dalam sampel, layanan membuat IEndpointBehavior yang menggantikan AddressFilter dan ContractFilter pada EndpointDispatcher:
class FilteringEndpointBehavior : IEndpointBehavior
{
//...
}
Dua filter alamat ditentukan:
// Matches any message whose To address contains the letter 'e'
class MatchEAddressFilter : MessageFilter { }
// Matches any message whose To address does not contain the letter 'e'
class MatchNoEAddressFilter : MessageFilter { }
FilteringEndpointBehavior
dibuat agar dapat dikonfigurasi dan memungkinkan dua variasi yang berbeda.
public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }
Variasi 1 hanya cocok dengan alamat yang berisi 'e' (tetapi memiliki Tindakan apa pun), sedangkan Variasi 2 hanya cocok dengan alamat yang tidak memiliki 'e':
if (Variation == 1)
return new FilteringEndpointBehavior(
new MatchEAddressFilter(), new MatchAllMessageFilter());
else
return new FilteringEndpointBehavior(
new MatchNoEAddressFilter(), new MatchAllMessageFilter());
Dalam file konfigurasi, layanan mendaftarkan perilaku baru:
<extensions>
<behaviorExtensions>
<add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />
</behaviorExtensions>
</extensions>
Kemudian layanan membuat konfigurasi endpointBehavior
untuk setiap variasi:
<endpointBehaviors>
<behavior name="endpoint1">
<filteringEndpointBehavior variation="1" />
</behavior>
<behavior name="endpoint2">
<filteringEndpointBehavior variation="2" />
</behavior>
</endpointBehaviors>
Terakhir, titik akhir layanan mereferensikan salah satu dari behaviorConfigurations
:
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint2" />
Implementasi aplikasi klien sangat mudah; ini membuat dua saluran ke URI layanan (dengan meneruskan nilai tersebut sebagai parameter (via
) kedua ke CreateChannel(EndpointAddress) dan mengirim satu pesan di setiap saluran, tetapi masing-masing menggunakan alamat titik akhir yang berbeda. Akibatnya, pesan keluar dari klien memiliki penamaan To yang berbeda, dan server merespons dengan sesuai, seperti yang ditunjukkan oleh output klien:
Sending message to urn:e...
Exception: The message with To 'urn:e' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.
Sending message to urn:a...
Hello
Mengalihkan variasi dalam file konfigurasi server menyebabkan filter ditukar dan klien melihat perilaku yang berlawanan (pesan ke urn:e
berhasil, sedangkan pesan ke urn:a
gagal).
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint1" />
Untuk menyiapkan, membangun, dan menjalankan sampel
Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu komputer, ikuti instruksi dalam Menjalankan Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi lintas komputer, ikuti instruksi dalam Menjalankan Sampel Windows Communication Foundation dan ubah baris berikut di Client.cs.
Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");
Ganti localhost dengan nama server.
Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");