OperationContextScope
OperationContextScope のサンプルでは、Windows Communication Foundation (WCF) の呼び出しでヘッダーを使用して追加情報を送信する方法を示します。 このサンプルでは、サーバーとクライアントは両方ともコンソール アプリケーションです。
Note
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。
このサンプルでは、MessageHeader を使用して、クライアントが OperationContextScope として追加情報を送信する方法を示します。 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 メタデータ ユーティリティ ツール (Svcutil.exe) によって生成されたプロキシを使用してリモート サービスと通信するクライアント実装です。 MessageHeaderReaderClient
の 2 つのプロキシ オブジェクトが最初に作成されます。
//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();
次に、クライアントは OperationContextScope を作成し、スコープを client1
に指定します。 MessageHeader が OutgoingMessageHeaders に追加され、両方のクライアントで 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 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));
}
このサンプルは自己ホスト型です。 実行中のサンプルから、次のようなサンプル出力が提供されます。
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.
サンプルをセットアップ、ビルド、および実行するには
Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「 Building the Windows Communication Foundation Samples」の手順に従います。
単一または複数コンピューター構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。