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 つ以上存在する可能性があるため、クライアントは、受信した応答を関連付けて、応答を検証します。 その後、Find
を使用して、結果を FindResponse 操作の呼び出し元に渡します。
既知のサービスを解決するには、既知のサービスの EndpointAddress が設定された ResolveCriteria のインスタンスを提供する同期または非同期の Resolve
メソッドを呼び出します。 DiscoveryClient は、適切なヘッダーを設定して Resolve
メッセージを作成し、解決要求を送信します。 受信された応答が未処理の解決要求と関連付けられ、その結果が、Resolve
を使用して、ResolveResponse 操作の呼び出し元に渡されます。
ネットワークに探索プロキシが存在し、DiscoveryClient がマルチキャストで探索要求を送信する場合、探索プロキシは、マルチキャスト抑制 Hello メッセージを使用して応答できます。 DiscoveryClient は、未処理の ProxyAvailable
要求または Find
要求に対する Hello 応答を受信すると、Resolve
イベントを発生させます。 ProxyAvailable
イベントには、探索プロキシについての EndpointDiscoveryMetadata が含まれています。 管理者は、この情報を使用して、アドホック モードからマネージド モードに切り替えるかどうかを制御できます。
DiscoveryEndpoint
DiscoveryEndpoint は、固定探索コントラクトが設定されている標準エンドポイントを表します。 サービスまたはクライアントによる探索メッセージの送受信に使用されます。 既定では、DiscoveryEndpoint が、ServiceDiscoveryMode.Managed モードと WSDiscovery11 WS-Discovery バージョンを使用するように設定されています。
DiscoveryMessageSequenceGenerator
DiscoveryMessageSequenceGenerator は、サービスが探索メッセージまたはアナウンス メッセージを送信するときに、DiscoveryMessageSequence を生成するために使用されます。
DiscoveryService
DiscoveryService 抽象クラスは、Probe
メッセージおよび Resolve
メッセージの受信と処理のフレームワークを提供します。 Probe
メッセージが受信されると、DiscoveryService は、受信メッセージに基づいて FindRequestContext のインスタンスを作成し、OnBeginFind 仮想メソッドを呼び出します。 Resolve
メッセージが受信されると、DiscoveryService は OnBeginResolve 仮想メソッドを呼び出します。 このクラスから継承して、カスタムの探索サービス実装を提供できます。
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 がサービス ホストに追加されると、既定では、そのサービス ホストがホストしているすべてのアプリケーション エンドポイントが探索可能になります。 Enabled プロパティを false
に設定すると、特定のエンドポイントの探索を無効化できます。
EndpointDiscoveryMetadata
EndpointDiscoveryMetadata クラスは、サービスによって公開されるエンドポイントのバージョンに依存しない表現を提供します。 これには、サービスの開発者によって指定されたエンドポイントのアドレス、リッスン URI、コントラクト型名、スコープ、メタデータのバージョン、および拡張機能が含まれます。 FindCriteria は、Probe
操作と EndpointDiscoveryMetadata との照合中に、クライアントによって送信されます。 基準が一致した場合は、EndpointDiscoveryMetadata がクライアントに返されます。 ResolveCriteria 内のエンドポイント アドレスが、EndpointDiscoveryMetadata のエンドポイント アドレスと照合されます。 基準が一致した場合は、EndpointDiscoveryMetadata がクライアントに返されます。
FindCriteria
FindCriteria クラスは、サービスの検索時に使用される条件の指定に使用するバージョンに依存しないクラスです。 サービスを照合するための WS-Discovery 定義の条件を完全にサポートします。 また、このクラスには、照合プロセス中に使用できるカスタム値を指定するために開発者が使用できる拡張機能もあります。 開発者は、開発者が検索するサービスの合計数を指定する Find
、またはクライアントが応答を待機する時間を指定する値である MaxResults を指定して、Duration 操作の終了条件を設定できます。
FindRequestContext
FindRequestContext クラスは、クライアントが Probe
操作を開始するときに受信する Find
メッセージに基づいて、探索サービスによってインスタンス化されます。 これには、クライアントによって指定された 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 に追加されると、サービス ホストが開かれるときまたは閉じられるときに、すべての探索可能なエンドポイントのアナウンスが、各アナウンス エンドポイントから送られます。
UdpAnnouncementEndpoint
UdpAnnouncementEndpoint クラスは、UDP マルチキャスト バインディングを使用するアナウンス用に事前に構成しておく標準のアナウンス エンドポイントです。 既定では、UdpAnnouncementEndpoint が WSApril2005 WS_Discovery バージョンを使用するように設定されています。
UdpDiscoveryEndpoint
UdpDiscoveryEndpoint クラスは、UDP マルチキャスト バインディングを使用する探索のために事前に構成された標準の探索エンドポイントです。 既定では、DiscoveryEndpoint が、WSDiscovery11 WS-Discovery バージョンと ServiceDiscoveryMode.Adhoc モードを使用するように設定されています。