Bagikan melalui


Filter Pesan Kustom

Sampel MessageFilter menunjukkan cara mengganti filter pesan yang digunakan Windows Communication Foundation (WCF) untuk mengirim pesan ke titik akhir.

Nota

Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.

Ketika pesan pertama pada saluran tiba di server, server harus menentukan mana (jika ada) dari titik akhir yang terkait dengan URI tersebut yang harus menerima pesan. Proses ini dikendalikan oleh objek yang MessageFilter dilampirkan ke EndpointDispatcher.

Setiap titik akhir layanan memiliki satu EndpointDispatcher. EndpointDispatcher memiliki AddressFilter dan ContractFilter. Gabungan dari kedua filter ini adalah filter pesan yang digunakan untuk titik akhir.

Secara bawaan, AddressFilter untuk titik akhir cocok dengan pesan apa pun yang ditujukan ke alamat yang cocok dengan titik akhir layanan EndpointAddress. 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 IsInitiating=true tindakan yang dipertimbangkan). Sebagai hasilnya, secara default, filter untuk titik akhir hanya cocok jika header To dari pesan adalah EndpointAddress dari titik akhir dan tindakan pesan cocok dengan salah satu tindakan dari 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 telah 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 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 endpointBehavior konfigurasi 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 mudah; ini membuat dua saluran ke URI layanan (dengan meneruskan nilai tersebut sebagai parameter kedua (via) ke CreateChannel(EndpointAddress) dan mengirim satu pesan di setiap saluran, tetapi menggunakan alamat titik akhir yang berbeda untuk masing-masing. Akibatnya, pesan keluar dari klien memiliki alamat tujuan yang berbeda, dan server merespons sesuai, seperti yang ditunjukkan oleh keluaran dari 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 urn:e berhasil, sedangkan pesan urn:a gagal).

<endpoint address=""
          bindingConfiguration="ws"
          listenUri=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.IHello"
          behaviorConfiguration="endpoint1" />

Untuk menyiapkan, mengompilasi, dan menjalankan sampel

  1. Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

  2. Untuk menjalankan sampel dalam konfigurasi komputer tunggal, ikuti instruksi dalam Menjalankan Sampel Windows Communication Foundation.

  3. Untuk menjalankan sampel dalam konfigurasi lintas komputer, ikuti instruksi di 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");