探索検索と FindCriteria
探索検索操作は、1 つ以上のサービスを探索するためにクライアントによって開始される操作であり、探索における主要なアクションの 1 つです。 検索を実行すると、WS-Discovery Probe メッセージがネットワークを介して送信されます。 指定された条件に一致するサービスは、WS-Discovery ProbeMatch メッセージを使用して応答します。 探索メッセージの詳細については、WS-Discovery 仕様に関するページを参照してください。
DiscoveryClient
DiscoveryClient クラスは、検索操作を実行するメカニズムを提供し、探索クライアントの操作を簡単に実行できるようにします。 このクラスには、(ブロックする) 同期検索を実行する Find メソッドと、ブロックしない非同期検索を実行する FindAsync メソッドが含まれます。 どちらのメソッドも FindCriteria パラメーターを使用し、FindResponse オブジェクトを介してユーザーに結果を提供します。
FindCriteria
FindCriteria にはいくつかのプロパティがあり、検索対象のサービスを指定する検索条件と、検索を続行する期間を指定する検索終了条件に分類できます。 FindCriteria には、複数の検索条件を指定できます。 既定では、サービスがすべての条件に一致する必要があり、そうでない場合は、サービスがそれ自体を一致サービスと見なしません。 条件の一部にのみ一致するサービスを検索する場合は、サービスにカスタムの検索ロジックを実装するか、複数のクエリを使用します。
検索条件は、次のとおりです。
ContractTypeNameElement - 省略できます。 検索対象のサービスのコントラクト名、およびサービスの検索に通常使用される条件を指定します。 複数のコントラクト名が指定されると、すべてのコントラクトに一致するサービス エンドポイントのみが応答します。 WCF では、各エンドポイントでサポートされるコントラクトは 1 つだけです。
ScopeElement - 省略できます。 Scopes は、個々のサービス エンドポイントの分類に使用される絶対 URI です。 複数のエンドポイントが同じコントラクトを公開し、これらのエンドポイントのサブセットを検索する手段が必要な場合は、これを使用できます。 複数のスコープが指定されると、すべてのスコープに一致するサービス エンドポイントのみが応答します。
ScopeMatchBy - Probe メッセージのスコープとエンドポイントのスコープとの一致の判定に使用する、一致アルゴリズムを指定します。 サポートされているスコープ一致規則は、次の 5 つです。
FindCriteria.ScopeMatchByExact: 大文字と小文字が区別される基本の文字列比較を実行します。
FindCriteria.ScopeMatchByPrefix: "/" によって区切られたセグメント単位で一致を判定します。
http://contoso/building1
の検索は、http://contoso/building/floor1
スコープを持つサービスと一致します。http://contoso/building100
とは、最後の 2 セグメントが一致しないため、一致しません。FindCriteria.ScopeMatchByLdap: LDAP URL を使用してセグメント単位でスコープの一致を判定します。
FindCriteria.ScopeMatchByUuid: UUID 文字列を使用して、スコープが完全に一致するかどうかを判定します。
FindCriteria.ScopeMatchByNone: スコープを指定していないサービスのみを対象に一致を判定します。
スコープ一致規則が指定されていない場合は、ScopeMatchByPrefix が使用されます。
終了条件は次のとおりです。
Duration - ネットワーク上でサービスからの応答を待機する最長時間。 既定の時間は 20 秒です。
MaxResults - 待機する応答の最大件数。 MaxResults が経過する前に Duration 応答が受信された場合は、検出操作が終了します。
FindResponse
FindResponse には、ネットワーク上で一致するサービスから送信された応答を保持する Endpoints コレクション プロパティがあります。 応答したサービスがない場合、このコレクションは空です。 1 つ以上のサービスが応答した場合、各応答は EndpointDiscoveryMetadata オブジェクトに格納されます。これには、アドレスやコントラクトなど、サービスについての追加情報が含まれます。
次の例は、コードで検索操作を実行する方法を示しています。
// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("http://www.contoso.com/building1/floor1"));
findCriteria.Duration = TimeSpan.FromSeconds(10);
// Find ICalculatorService endpoints
FindResponse findResponse = discoveryClient.Find(findCriteria);
Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count)