2014-01-17 2 views
5

System.DirecoryServices.DirectorySearcherを使用する場合ClientTimeOutが発生したかどうか、または検索が空のSearchResultCollectionを自然に返したかどうかをどのように判断できますか?あなたはに非同期のプロパティを設定する場合は、次のスニペットDirectorySearcherの使用時にClientTimeoutを決定する方法

ClientTimeoutを設定
using (var searcher = new DirectorySearcher(adRoot)) 
         { 
          searcher.Filter = "SomeFilter"; 
          searcher.PropertiesToLoad.Add("givenname"); 
          searcher.PropertiesToLoad.Add("sn"); 
          searcher.PropertiesToLoad.Add("department"); 
          searcher.PropertiesToLoad.Add("samaccountname"); 
          searcher.ClientTimeout = TimeSpan.FromSeconds(10); 

          using (var results = searcher.FindAll()) 
          { 
           //haldle results        
          } 
         } 
        } 

答えて

6

与え

にのみ有効です。あなたはしていない。管理されていないIDirectorySearcherインターフェイスのドキュメントは、より詳細です。 the MSDN article

クライアントの制限時間設定は、クライアントが非同期検索を要求する場合に便利です。非同期検索では、クライアントは要求を出した後、サーバーが結果を返すのを待っている間に他のタスクを続行します。クライアントに通知せずにサーバーをオフラインにできる可能性があります。この場合、クライアントはサーバーが依然として照会を処理しているかどうか、またはそれがもはや存続していないかどうかの通知を受けません。クライアントのタイムリミットプリファレンスは、クライアントにこのような状況の制御を与えます。

管理されたクラスを使用する場合、この「何らかの制御」が完全ではないことに注意してください。 SearchResultCollectionラッパークラスは、実際には非同期で検索するためのきれいな方法を提供しません。次の結果を反復する "BeginMoveNext"メソッドはありません。 「他の仕事を進める」という角度はむしろ理論的なものです。プロパティを使用しないことをお勧めします。

+0

ご回答ありがとうございます。 Asyncプロパティが設定されていなくても、検索に10秒以上かかる場合、ClientTimeoutが発生します。 DirectorySearcherがクライアントタイムアウト時間が経過したために検索が「中止」された場合、ネットワーク上の他のドメインコントローラに対して検索を再試行します。 ドメインコントローラの1つが残りの部分よりもはるかに遅く、10秒を超えた場合に別のコントローラにフェールオーバーする必要がある – flalar

関連する問題