DirectorySearcher FindOne()在初始执行时延迟

我在执行DirectorySearcher FindOne()和我看到的第一个网络数据包之间的初始延迟时间为2-5秒。 初始执​​行后,后续执行立即完成约45秒。 在快速执行的那段时间之后,下一次执行将被延迟,并且所有后续执行将立即完成。 似乎有某种缓存正在进行,但我无法找到任何确认或描述导致初始延迟的资源。

我们在客户端Windows 2008服务器上注意到了这一点,然后在我们自己的Windows 2008和Windows 7盒子上重现。

这是我简单的.NET 4.0 C#应用程序的样子。 延迟发生在“已启动”和“已完成”消息之间。

知道为什么这个延迟发生在最初的FindOne()执行上? 任何帮助深表感谢!

using System; using System.Collections.Generic; using System.Text; using System.DirectoryServices; namespace LdapTest { class Program { static void Main(string[] args) { string[] fetchAttributes; fetchAttributes = new string[] { "{string[0]}" }; using (DirectoryEntry searchRoot = new DirectoryEntry("LDAP://localserver/ou=lab,dc=ourdomain,dc=com", "cn=binduser,ou=Services,dc=ourdomain,dc=com", "Password", AuthenticationTypes.ReadonlyServer)) { using (DirectorySearcher searcher = new DirectorySearcher(searchRoot, "(sAMAccountName=UserName)", fetchAttributes, SearchScope.Subtree)) { Console.WriteLine("Started"); SearchResult result = searcher.FindOne(); Console.WriteLine("Finished"); } } } } 

根据LDAP ADsPath MSDN文章 ,如果绑定LDAP路径指向服务器以避免不必要的网络流量,则应指定ServerBind标志。 它还建议提供服务器的完整DNS名称。 此外,当指向服务器时, ReadonlyServer标志没有意义。 所以我的第一个建议是用ServerBind替换ReadonlyServer标志(最好是给出完整的DNS名称),或删除字符串的服务器部分(在你的例子中,使它成为LDAP:// ou = lab,dc = ourdomain,dc = com或LDAP://ourdomain.com/ou=lab,dc=ourdomain,dc=com)。

另一件需要注意的是,您要通过专有名称提供用户名。 如果您查看DirectoryEntry使用的核心API, IADsOpenDSObject :: OpenDSObject ,它要求lpReserved标志[DirectoryEntry中的AuthenticationTypes参数]为零[ None ]或在传递用户名的可分辨名称时包含ADS_USE_SSL [ SecureSocketsLayer ]标志。 请注意, SecureSocketsLayer标志要求Active Directory要求安装证书服务器,然后才能使用此标志。 您可能希望以其他格式传递用户名。

最后, 这个MDSN页面表示没有任何身份validation标志,用户名和密码将以明文forms发送。 您应该添加Secure标志。