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.

Nota

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

Sampel menunjukkan bagaimana klien dapat mengirim informasi tambahan sebagai MessageHeader menggunakan OperationContextScope. Objek OperationContextScope dibuat dengan mengaitkannya ke saluran. Header yang perlu diterjemahkan untuk layanan jarak jauh dapat ditambahkan ke dalam koleksi OutgoingMessageHeaders. Header yang ditambahkan ke koleksi ini dapat diambil dari layanan dengan mengakses IncomingMessageHeaders. Panggilannya dilakukan pada 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 dalam koleksi IncomingMessageHeaders. Klien meneruskan GUID yang dikirim di header, dan layanan kemudian mengambil header kustom tersebut. Jika tersedia, layanan membandingkannya dengan GUID yang telah 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 ServiceModel Metadata Utility Tool (Svcutil.exe) untuk berkomunikasi dengan layanan jarak jauh. Ini pertama-tama membuat dua objek proksi dari 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 pada kedua klien. Ini memastikan bahwa header hanya dikirim di client1 dan tidak di client2 dengan memeriksa nilai pengembalian dari pemanggilan 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 dihost sendiri. Contoh output 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, mengompilasi, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.