Bagikan melalui


OperationContextScope

Sampel OperationContextScope menunjukkan cara mengirim informasi tambahan pada panggilan Windows Communication Foundation (WCF) menggunakan header. Dalam sampel ini, server dan klien adalah aplikasi konsol.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Sampel menunjukkan bagaimana klien dapat mengirim informasi tambahan sebagai MessageHeader menggunakan OperationContextScope. Objek OperationContextScope dibuat dengan mencakupnya ke saluran. Header yang harus diterjemahkan ke layanan jarak jauh dapat ditambahkan ke kumpulan OutgoingMessageHeaders. Header yang ditambahkan ke kumpulan ini dapat diambil pada layanan dengan mengakses IncomingMessageHeaders. Panggilannya dilakukan di beberapa saluran dan kemudian header yang ditambahkan ke klien hanya berlaku untuk saluran yang digunakan untuk membuat OperationContextScope.

MessageHeaderReader

Ini adalah layanan contoh yang menerima pesan dari klien dan mencoba mencari header di kumpulan IncomingMessageHeaders. Klien melewati GUID yang dikirim di header dan layanan mengambil header kustom dan, jika ada, membandingkannya dengan GUID yang diteruskan sebagai argumen oleh klien.

public bool RetrieveHeader(string guid)
{
     MessageHeaders messageHeaderCollection =
             OperationContext.Current.IncomingMessageHeaders;
     String guidHeader = null;

     Console.WriteLine("Trying to check if IncomingMessageHeader " +
               " collection contains header with value {0}", guid);
     if (messageHeaderCollection.FindHeader(
                       CustomHeader.HeaderName,
                       CustomHeader.HeaderNamespace) != -1)
     {
          guidHeader = messageHeaderCollection.GetHeader<String>(
           CustomHeader.HeaderName, CustomHeader.HeaderNamespace);
     }
     else
     {
          Console.WriteLine("No header was found");
     }
     if (guidHeader != null)
     {
          Console.WriteLine("Found header with value {0}. "+
         "Does it match with GUID sent as parameter: {1}",
          guidHeader, guidHeader.Equals(guid));
      }

      Console.WriteLine();
      //Return true if header is present and equals the guid sent by
      // client as argument
      return (guidHeader != null && guidHeader.Equals(guid));
}

MessageHeaderClient

Ini adalah implementasi klien yang menggunakan proksi yang dihasilkan oleh Alat Utilitas Metadata ServiceModel (Svcutil.exe) untuk berkomunikasi dengan layanan jarak jauh. Ini pertama-tama membuat dua objek proksi MessageHeaderReaderClient.

//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();

Klien kemudian membuat OperationContextScope dan mencakupnya ke client1. Ini menambahkan MessageHeader ke OutgoingMessageHeaders dan memanggil satu panggilan di kedua klien. Ini memastikan bahwa header dikirim hanya pada client1 dan bukan pada client2 dengan memeriksa nilai pengembalian dari panggilan RetrieveHeader.

using (new OperationContextScope(client1.InnerChannel))
{
    //Create a new GUID that is sent as the header.
    String guid = Guid.NewGuid().ToString();

    //Create a MessageHeader for the GUID we just created.
    MessageHeader customHeader = MessageHeader.CreateHeader(CustomHeader.HeaderName, CustomHeader.HeaderNamespace, guid);

    //Add the header to the OutgoingMessageHeader collection.
    OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);

    //Now call RetrieveHeader on both the proxies. Since the OperationContextScope is tied to
    //client1's InnerChannel, the header should only be added to calls made on that client.
    //Calls made on client2 should not be sending the header across even though the call
    //is made in the same OperationContextScope.
    Console.WriteLine("Using client1 to send message");
    Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: True", client1.RetrieveHeader(guid));

    Console.WriteLine();
    Console.WriteLine("Using client2 to send message");
    Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: False", client2.RetrieveHeader(guid));
}

Sampel ini dihosting sendiri. Output sampel berikut dari menjalankan sampel disediakan:

Prompt> Service.exe
The service is ready.
Press <ENTER> to terminate service.

Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
Found header with value 2239da67-546f-42d4-89dc-8eb3c06215d8. Does it match with GUID sent as parameter: True

Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
No header was found

Prompt>Client.exe
Using client1 to send message
Did server retrieve the header? : Actual: True, Expected: True

Using client2 to send message
Did server retrieve the header? : Actual: False, Expected: False

Press <ENTER> to terminate client.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.