ピア チャネル セキュア チャット
このサンプルでは、PeerChannel を使用してマルチパーティ通信を実現する、NetPeerTcpBinding バインディングをパスワード ベースの認証で使用する方法を示します。このサンプルは、「入門サンプル」の変化形です。Windows Communication Foundation (WCF) の概要については、「入門サンプル」を参照してください。
このサンプルでは、アプリケーション インスタンスは、自己ホスト型コンソール アプリケーションです。
他のトランスポート バインディング サンプルとは異なり、このサンプルではマルチパーティ通信を表す目的で IChat
コントラクト インターフェイスが使用されます。すべてのインスタンスでは、メッセージを受信して、同じコントラクトのプロキシを作成してメッセージをメッシュに送信するために、このコントラクトが実装されます。これは、メッシュへの二重チャネルを作成することで表されます。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
このサンプルでバインディングの構成プロセスを理解するには、次の PeerChannel の概念を理解する必要があります。
ピア リゾルバは、メッシュ ID をメッシュ内のノードのエンドポイント アドレスに解決します。
メッシュは、メッシュ ID によって識別されるピア ノードの名前付きコレクションです。
ピア ノードは、メッシュに参加するアプリケーションのインスタンスです。
メッシュ ID は、メッシュ内のエンドポイント アドレスのホスト部分を識別します。こうしたアドレスの例としては、"net.p2p://chatMesh/servicemodelsamples/chat" や "net.p2p://broadcastMesh/servicemodelsamples/announcements" などがあります。chatMesh と broadcastMesh はメッシュ ID です。
メッシュに参加するすべてのクライアントでは、同じメッシュ ID を使用しますが、異なるパスとサービスを使用できる場合もあります。特定のエンドポイント アドレス宛のメッセージは、そのアドレスを使用するすべてのピア チャネルに配信されます。
(ピア チャネルを開いた結果として) 開いているピア ノードは、ピア リゾルバを使用してメッシュ ID を解決し、接続先となる他のいくつかのピア ノードのアドレスを取得します。これにより、相互接続されたノードによるメッシュが作成され、メッセージがメッシュ内で伝達されるようになります。
PeerTransportCredentialType では、メッシュ内のピアが互いに認証する方法を指定します。このプロパティはバインディング構成または NetPeerTcpBinding オブジェクトのどちらでも指定できます。または、PeerTransportBindingElement を使用して指定することもできます。Peer プロパティで指定された適切な資格情報を持つ ClientCredentialSettings (または ServiceCredentialSettings) インスタンスは、使用方法に応じて、チャネル ファクトリまたは ServiceHost の動作コレクションに追加する必要があります。
- このサンプルでは、PeerChannel をセキュリティ保護するためにパスワード認証モード (既定のモード) を使用します。これは、隣接ノード間でセキュリティで保護された接続を確立し、このパスワードの変換を行うことにより、実現されます。Password が指定されると、ClientCredentialSettings.Peer プロパティは有効なパスワードと、必要に応じて X509Certificate2 インスタンスを転送する必要があります (SetSelfCertificate を使用)。
バインディングは、アプリケーションの構成ファイルに指定されます。バインディングの種類は、エンドポイント要素の Binding 属性に指定します。次のサンプル構成を参照してください。
<client>
<!-- chat instance participating in the mesh -->
<endpoint name="SecureChatEndpoint"
address="net.p2p://SecureChatMesh/servicemodelsamples/chat"
binding="netPeerTcpBinding"
bindingConfiguration="SecureChatBinding"
contract="Microsoft.ServiceModel.Samples.IChat">
</endpoint>
</client>
既定の動作で NetPeerTcpBinding バインディングを使用する場合、パスワード ベースのセキュリティが有効です。バインディング要素には、ポート、リッスンする IP アドレス、リゾルバの種類、最大メッセージ サイズ、最大バッファ プール サイズ、リーダー クォータ、ピア ノード認証モード、メッセージ認証、およびタイムアウト (閉じる、開く、送信、受信) の属性が用意されています。
メモ : このサンプルでは既定のピア リゾルバ (PNRP) を使用します。これは Windows Server 2003 では利用できないので、このサンプルを Windows Server 2003 で実行する場合は、カスタム ピア リゾルバを使用する必要があります。カスタム ピア リゾルバを使用するサンプルについては、「ピア チャネル チャット」を参照してください。たとえば、次のようになります。
<netPeerTcpBinding>
<binding configurationName="Binding1">
<resolver mode="Custom">
<customResolver
type="MyAppNameSpace.MyCustomPeerResolver, myApp"/>
</resolver>
</binding>
</netPeerTcpBinding>
MyCustomPeerResolver
が含まれるファイルは、アプリケーションでコンパイルする必要があります。サンプルをプラットフォームが異なる複数のコンピュータで実行する場合は、各コンピュータで同じリゾルバを使用する必要があります。
このチャットの実装では、受信側または送信側のインスタンスに関連付けられたピア ノードを取得する方法と、そのピア ノードのオンライン イベントとオフライン イベントでの登録方法も示されます。ピア ノードがメッシュ内の少なくとも 1 つのピア ノードに接続されると、オンライン イベントが発生します。ピア ノードがメッシュ内のすべてのピア ノードとの接続を失うと、オフライン イベントが発生します。
現時点では、ピア チャネルはService Model Metadata Utility Tool (Svcutil.exe) と統合されていません。このため、型指定されたチャネルを送信側用に生成するために Svcutil.exe を使用することはできません。
サンプルを実行すると、クライアントではニックネームとパスワードの入力が求められます。その後、メッセージを送信する準備ができたことを示すメッセージがクライアントに表示されます。チャット メッセージは、他のクライアント コンソール ウィンドウに表示されます。クライアントを終了するには、クライアントのコンソール ウィンドウで Q キーを押してから Enter キーを押します。
トレースまたはメッセージ ログを有効にすると、送信側や受信側のアクティビティをより詳細に監視できます。トレースやメッセージ ログを有効にする方法については、Procedures セクションを参照してください。
メモ : |
---|
このサンプルでは現在、インフラストラクチャでスローされる可能性のあるすべての例外が扱われているわけではないことに注意してください。これらのサンプルを商用/本運用環境で使用する場合は、適切な例外処理に関するベスト プラクティスに従うようにしてください。 |
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順を参照してください。
単一コンピュータ構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。
Windows XP SP2 で PNRP をインストールするには (1 回限りのセットアップ):
[コントロール パネル] で [プログラムの追加と削除] をダブルクリックします。
[プログラムの追加と削除] ダイアログ ボックスで [Windows コンポーネントの追加と削除] をクリックします。
[Windows コンポーネント ウィザード] で、[ネットワーク サービス] チェック ボックスをオンにし、[詳細] をクリックします。
[ピア ツー ピア] チェック ボックスをオンにして、[OK] をクリックします。
[Windows コンポーネント ウィザード] で [次へ] をクリックします。
インストールが完了したら、[完了] をクリックします。
コマンド シェル プロンプトで、コマンド net start pnrpsvc を実行して PNRP サービスを起動します。
サンプルの複数のインスタンスを開始するたび、ニックネームとパスワードを入力します。各クライアントのニックネームはそれぞれ固有である必要があり、パスワードはすべてのインスタンスで同じである必要があります。ニックネームが異なりパスワードが一致している場合、アプリケーションの 1 つのインスタンスから送信されるチャット メッセージは、他のすべてのインスタンスで受信されます。複数のクライアントで同じニックネームを使用できますが、同じニックネームを持つクライアントから送信されたメッセージは表示されません。
Copyright © 2007 by Microsoft Corporation.All rights reserved.