WCF Discovery オブジェクト モデル

WCF Discovery は、実行時に探索可能なサービスと、これらのサービスを検索して使用するクライアントの作成を可能にする統合プログラミング モデルを提供する型のセットで構成されています。

探索可能なサービスの作成とサービスの検索

WCF サービスを探索可能にするには、ServiceDiscoveryBehavior をサービス ホストの ServiceDescription に追加し、探索エンドポイントを追加します。サービスがアナウンス メッセージを送信するように構成されている (AnnouncementEndpoint を追加して) 場合は、サービス ホストが開かれるとき、および閉じられるときにアナウンスが送信されます。

サービスのアナウンス メッセージをリッスンするクライアントは、アナウンス サービスをホストし、1 つ以上のアナウンス エンドポイントを追加します。アナウンス サービスは、アナウンス メッセージを受信し、アナウンス イベントを発生させます。

クライアントは、DiscoveryClient クラスを使用して、利用可能なサービスを検索します。クライアント アプリケーションは DiscoveryClient クラスをインスタンス化し、探索メッセージの送信元を指定する探索エンドポイントを渡します。クライアントは Find メソッドを呼び出し、Probe 要求を送ります。探索メッセージをリッスンしているサービスが、この Probe 要求を受信します。サービスが Probe に指定されている条件に一致している場合は、ProbeMatch メッセージがクライアントに返されます。

オブジェクト モデル

WCF Discovery API は、次のクラスを定義します。

AnnouncementClient

AnnouncementClient クラスは、アナウンス メッセージを送信するための同期メソッドと非同期メソッドを提供します。アナウンス メッセージには Hello と Bye の 2 種類があります。Hello メッセージは、サービスが使用可能になったことを示すために送信され、Bye メッセージは、既存のサービスが使用不可になったことを示すために送信されます。開発者は、AnnouncementClient インスタンスを作成して、AnnouncementEndpoint のインスタンスをコンストラクター パラメーターとして渡します。

AnnouncementEndpoint

AnnouncementEndpoint は、固定アナウンス コントラクトが設定されている標準エンドポイントを表します。サービスまたはクライアントは、これを使用して、アナウンス メッセージの送受信を行います。既定では、AnnouncementEndpoint クラスは、WS_Discovery 11 プロトコル バージョンを使用するように設定されています。

AnnouncementService

AnnouncementService は、アナウンス メッセージを受信して処理するアナウンス サービスの実装で、システムによって提供されています。Hello または Bye メッセージが受信されると、AnnouncementService のインスタンスが、適切な仮想メソッド OnBeginOnlineAnnouncement または OnBeginOfflineAnnouncement を呼び出し、アナウンス イベントを発生させます。

DiscoveryClient

DiscoveryClient クラスは、使用可能なサービスを検索および解決するために、クライアント アプリケーションによって使用されます。指定されている FindCriteria を基にサービスを検索し、ResolveCriteria を基にサービスを解決するための同期メソッドと非同期メソッドを提供します。開発者は、DiscoveryClient インスタンスを作成して、DiscoveryEndpoint のインスタンスをコンストラクター パラメーターとして提供します。

サービスを検索するには、同期または非同期の Find メソッドを呼び出し、使用する検索条件が設定された FindCriteria インスタンスを提供します。DiscoveryClient は、適切なヘッダーを設定して Probe メッセージを作成し、検索要求を送信します。どの時点でも、未処理の Find 要求が 1 つ以上存在する可能性があるため、クライアントは、受信した応答を関連付けて、応答を検証します。その後、FindResponse を使用して、結果を Find 操作の呼び出し元に渡します。

既知のサービスを解決するには、既知のサービスの EndpointAddress が設定された ResolveCriteria のインスタンスを提供する同期または非同期の Resolve メソッドを呼び出します。DiscoveryClient は、適切なヘッダーを設定して Resolve メッセージを作成し、解決要求を送信します。受信された応答が未処理の解決要求と関連付けられ、その結果が、ResolveResponse を使用して、Resolve 操作の呼び出し元に渡されます。

ネットワークに探索プロキシが存在し、DiscoveryClient がマルチキャストで探索要求を送信する場合、探索プロキシは、マルチキャスト抑制 Hello メッセージを使用して応答できます。DiscoveryClient は、未処理の Find 要求または Resolve 要求に対する Hello 応答を受信すると、ProxyAvailable イベントを発生させます。ProxyAvailable イベントには、探索プロキシについての EndpointDiscoveryMetadata が含まれています。管理者は、この情報を使用して、アドホック モードからマネージ モードに切り替えるかどうかを制御できます。

DiscoveryEndpoint

DiscoveryEndpoint は、固定探索コントラクトが設定されている標準エンドポイントを表します。サービスまたはクライアントによる探索メッセージの送受信に使用されます。既定では、DiscoveryEndpoint が、Managed モードと WSDiscovery11 WS-Discovery バージョンを使用するように設定されています。

DiscoveryMessageSequenceGenerator

DiscoveryMessageSequenceGenerator は、サービスが探索メッセージまたはアナウンス メッセージを送信するときに、DiscoveryMessageSequence を生成するために使用されます。

DiscoveryService

DiscoveryService 抽象クラスは、Probe メッセージおよび Resolve メッセージの受信と処理のフレームワークを提供します。Probe メッセージが受信されると、DiscoveryService は、受信メッセージに基づいて FindRequestContext のインスタンスを作成し、OnBeginFind 仮想メソッドを呼び出します。Resolve メッセージが受信されると、DiscoveryServiceOnBeginResolve 仮想メソッドを呼び出します。このクラスから継承して、カスタムの探索サービス実装を提供できます。

DiscoveryProxy

DiscoveryProxy 抽象クラスは、探索メッセージおよびアナウンス メッセージの受信と処理のフレームワークを提供します。カスタムの探索プロキシを実装するときは、このクラスを継承します。Probe メッセージがマルチキャストで受信されると、DiscoveryProxy クラスは BeginShouldRedirectFind 仮想メソッドを呼び出して、マルチキャスト抑制メッセージの送信が必要かどうかを決定します。開発者の判断により、マルチキャスト抑制メッセージを送信しない場合、または、Probe メッセージがユニキャストで受信された場合は、受信メッセージに基づいて FindRequestContext クラスのインスタンスを作成し、OnBeginFind 仮想メソッドを呼び出します。Resolve メッセージがマルチキャストで受信されると、DiscoveryProxy クラスは ShouldRedirectResolve 仮想メソッドを呼び出して、マルチキャスト抑制メッセージの送信が必要かどうかを決定します。開発者の判断により、マルチキャスト抑制メッセージを送信しない場合、または、Resolve メッセージがユニキャストで受信された場合は、受信メッセージに基づいて ResolveCriteria クラスのインスタンスを作成し、OnBeginResolve 仮想メソッドを呼び出します。Hello または Bye メッセージが受信されると、DiscoveryProxy のインスタンスが、適切な仮想メソッド (OnBeginOnlineAnnouncement または OnBeingOfflineAnnouncement) を呼び出し、アナウンス イベントを発生させます。

DiscoveryVersion

DiscoveryVersion クラスは、使用する探索プロトコルのバージョンを表します。

EndpointDiscoveryBehavior

EndpointDiscoveryBehavior クラスは、エンドポイントを探索可能にするかどうかの制御と、拡張機能、追加のコントラクト型の名前、およびそのエンドポイントに関連付けるスコープの指定に使用されます。この動作は、アプリケーション エンドポイントに追加されて、そのエンドポイントの EndpointDiscoveryMetadata を構成します。ServiceDiscoveryBehavior がサービス ホストに追加されると、既定では、そのサービス ホストがホストしているすべてのアプリケーション エンドポイントが探索可能になります。Enable プロパティを false に設定すると、特定のエンドポイントの探索を無効化できます。

EndpointDiscoveryMetadata

EndpointDiscoveryMetadata クラスは、サービスによって公開されるエンドポイントのバージョンに依存しない表現を提供します。これには、サービスの開発者によって指定されたエンドポイントのアドレス、リッスン URI、コントラクト型名、スコープ、メタデータのバージョン、および拡張機能が含まれます。FindCriteria は、Probe 操作と EndpointDiscoveryMetadata との照合中に、クライアントによって送信されます。基準が一致した場合は、EndpointDiscoveryMetadata がクライアントに返されます。ResolveCriteria 内のエンドポイント アドレスが、EndpointDiscoveryMetadata のエンドポイント アドレスと照合されます。基準が一致した場合は、EndpointDiscoveryMetadata がクライアントに返されます。

FindCriteria

FindCriteria クラスは、サービスの検索時に使用される条件の指定に使用するバージョンに依存しないクラスです。サービスを照合するための WS-Discovery 定義の条件を完全にサポートします。また、このクラスには、照合プロセス中に使用できるカスタム値を指定するために開発者が使用できる拡張機能もあります。開発者は、開発者が検索するサービスの合計数を指定する MaxResult、またはクライアントが応答を待機する時間を指定する値である Duration を指定して、Find 操作の終了条件を設定できます。

FindRequestContext

FindRequestContext クラスは、クライアントが Find 操作を開始するときに受信する Probe メッセージに基づいて、探索サービスによってインスタンス化されます。これには、クライアントによって指定された FindCriteria のインスタンスが含まれます。

FindResponse

FindResponse クラスは、Find 操作の応答と共に、Find の呼び出し元に返されます。これは、FindCompletedEventArgs にも存在します。これには、探索されたエンドポイントのコレクションである EndpointDiscoveryMetadata のコレクションと、EndpointDiscoveryMetadata および DiscoveryMessageSequence のディクショナリが含まれます。

ResolveCriteria

ResolveCriteria クラスは、既知のサービスの解決時に使用される条件の指定に使用するバージョンに依存しないクラスです。これには、既知のサービスのエンドポイント アドレスが含まれます。開発者は、クライアントが応答を待機する時間を指定する Duration を指定して、解決操作の終了条件を提供できます。

ResolveResponse

ResolveResponse は、Resolve 操作の応答と共に、Resolve メソッドの呼び出し元に返されます。これは、ResolveCompletedEventArgs にも存在します。これには、探索されたエンドポイントである EndpointDiscoveryMetadata のインスタンスと、DiscoveryMessageSequence のインスタンスが含まれます。

ServiceDiscoveryBehavior

ServiceDiscoveryBehavior クラスを使用すると、探索機能をサービスに追加できます。この動作は ServiceHost に追加します。ServiceDiscoveryBehavior クラスは、サービス ホストに追加されているアプリケーション エンドポイントに対して反復処理され、探索可能なエンドポイントに基づいて EndpointDiscoveryMetadata のコレクションを作成します。既定では、すべてのエンドポイントが探索可能です。特定のエンドポイントが探索可能になるかどうかは、EndpointDiscoveryBehavior をその特定のエンドポイントに追加することで制御できます。アナウンス エンドポイントが ServiceDiscoveryBehavior に追加されると、サービス ホストが開かれるときまたは閉じられるときに、すべての探索可能なエンドポイントのアナウンスが、各アナウンス エンドポイントから送られます。

ServiceDiscoveryExtension

ServiceDiscoveryExtension クラスは ServiceDiscoveryBehavior クラスによって作成されます。探索可能にされているエンドポイントは、ServiceDiscoveryExtension から取得できます。このクラスは、カスタムの探索サービス実装を指定する目的でも使用されます。

UdpAnnouncementEndpoint

UdpAnnouncementEndpoint クラスは、UDP マルチキャスト バインディングを使用するアナウンス用に事前に構成しておく標準のアナウンス エンドポイントです。既定では、UdpAnnouncementEndpoint が WSApril2005 WS_Discovery バージョンを使用するように設定されています。

UdpDiscoveryEndpoint

UdpDiscoveryEndpoint クラスは、UDP マルチキャスト バインディングを使用する探索のために事前に構成された標準の探索エンドポイントです。既定では、DiscoveryEndpoint が、WSDiscovery11 WS-Discovery バージョンと Adhoc モードを使用するように設定されています。