【问题标题】:How to determine ClientTimeout when using DirectorySearcher使用 DirectorySearcher 时如何确定 ClientTimeout
【发布时间】:2023-07-26 00:07:01
【问题描述】:

在使用 System.DirecoryServices.DirectorySearcher 时,如何确定是否发生了 ClientTimeOut 或搜索是否自然返回了空的 SearchResultCollection?

给定以下 sn-p

 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                            
                            }
                        }
                    }

【问题讨论】:

    标签: c# .net active-directory directoryservices adsi


    【解决方案1】:

    仅当您将 Asynchronous 属性设置为 true 时,设置 ClientTimeout 才有用。你没有这样做。非托管 IDirectorySearcher 接口的文档要详细得多。来自the MSDN article

    当客户端请求异步搜索时,客户端时间限制首选项很有用。在异步搜索中,客户端发出请求,然后在等待服务器返回结果的同时继续执行其他任务。服务器可能会在不通知客户端的情况下下线。在这种情况下,客户端将不会收到服务器是否仍在处理查询或它不再存在的通知。客户端时间限制首选项使客户端能够对此类情况进行一些控制。

    请注意,当您使用托管类时,这种“对情况的某种控制”并不完美。 SearchResultCollection 包装类实际上并没有为您提供一种干净的异步搜索方式,它没有“BeginMoveNext”方法来迭代下一个结果。 “进行其他任务”的角度是相当理论化的。最好不要使用该属性。

    【讨论】:

    • 感谢您的回复。如果搜索时间超过 10 秒,即使未设置 Async 属性,也会发生 ClientTimeout。如果 DirectorySearcher 由于达到客户端超时而“中止”搜索,我们希望针对网络上的其他域控制器重试搜索。似乎其中一个域控制器比其他域控制器慢得多,如果超过十秒,我们需要“故障转移”到另一个控制器