次の方法で共有


OperationContextScope

Download sample

OperationContextScope サンプルでは、ヘッダーを使用する Windows Communication Foundation (WCF) 呼び出しに追加情報を送信する方法を示します。このサンプルでは、サーバーとクライアントは両方ともコンソール アプリケーションです。

Noteメモ :

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

このサンプルでは、OperationContextScope を使用して、クライアントが MessageHeader として追加情報を送信する方法を示します。OperationContextScope オブジェクトのスコープをチャネルに指定することにより、このオブジェクトが作成されます。リモート サービスに変換される必要があるヘッダーは、OutgoingMessageHeaders コレクションに追加できます。このコレクションに追加されたヘッダーは、IncomingMessageHeaders にアクセスすることによってサービス上で取得できます。このヘッダー呼び出しは複数のチャネル上で行われ、クライアントに追加されたヘッダーは、OperationContextScope の作成に使用されたチャネルのみに適用されます。

MessageHeaderReader

このサンプルは、クライアントからメッセージを受信し、IncomingMessageHeaders コレクション内のヘッダーの検索を試行するサービスです。クライアントは送信した GUID をヘッダー内に渡し、サービスはカスタム ヘッダーを取得します。カスタム ヘッダーがある場合は、引数としてクライアントによって渡された GUID と比較します。

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

これは、ServiceModel Metadata Utility Tool (Svcutil.exe) によって生成されたプロキシを使用してリモート サービスと通信するクライアント実装です。MessageHeaderReaderClient の 2 つのプロキシ オブジェクトが最初に作成されます。

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

次に、クライアントは OperationContextScope を作成し、スコープを client1 に指定します。MessageHeaderOutgoingMessageHeaders に追加され、両方のクライアントで 1 つの呼び出しが行われます。そのため、RetrieveHeader 呼び出しからの戻り値をチェックすることによって、ヘッダーは client1 のみに送信され、client2 には送信されません。

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

このサンプルは自己ホスト型です。実行中のサンプルから、次のようなサンプル出力が提供されます。

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.

サンプルを設定、ビルド、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一コンピュータ構成か複数コンピュータ構成かに応じて、「Windows Communication Foundation サンプルの実行」の手順に従います。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.