Aracılığıyla paylaş


OperationContextScope

OperationContextScope örneği, üst bilgileri kullanarak bir Windows Communication Foundation (WCF) çağrısında ek bilgi göndermeyi gösterir. Bu örnekte hem sunucu hem de istemci konsol uygulamalarıdır.

Uyarı

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Örnekte, bir istemcinin MessageHeader kullanarak OperationContextScope ek bilgileri nasıl gönderebileceği gösterilmektedir. Bir OperationContextScope nesne bir kanala göre kapsam belirlenerek oluşturulur. Uzak hizmete transfer edilmesi gereken header bilgileri OutgoingMessageHeaders koleksiyonuna eklenebilir. Bu koleksiyona eklenen üst bilgiler hizmetine erişilerek IncomingMessageHeadersalınabilir. Çağrılar birden çok kanalda yapılır ve istemciye eklenen başlıklar yalnızca OperationContextScope oluşturmak için kullanılan kanala uygulanır.

Mesaj Başlık Okuyucu

Bu, istemciden bir ileti alan ve IncomingMessageHeaders koleksiyonunda başlığı bulmaya çalışan örnek bir hizmettir. İstemci, üst bilgilerde gönderdiği GUID'yi geçirir ve hizmet, özel üst bilgiyi alır ve eğer varsa, bunu istemcinin argüman olarak geçirdiği GUID ile karşılaştırır.

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));
}

Mesaj Başlığı İstemcisi

Bu, uzak hizmetle iletişim kurmak için ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından oluşturulan ara sunucuyu kullanan istemci uygulamasıdır. İlk olarak iki ara sunucu nesnesi MessageHeaderReaderClientoluşturur.

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

İstemci daha sonra bir OperationContextScope oluşturur ve kapsamını olarak client1tanımlar. MessageHeader öğesini OutgoingMessageHeaders öğesine ekler ve her iki istemcide de bir çağrı başlatır. client1 çağrısından dönen değeri kontrol ederek başlığın yalnızca client2 üzerine gönderilmesini ve RetrieveHeader üzerinde gönderilmemesini sağlar.

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));
}

Bu örnek kendi sunucusunda barındırılır. Örneği çalıştırmanın aşağıdaki örnek çıktısı sağlanır:

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.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.