【问题标题】:Delay in DirectoryEntry RefreshcacheDirectoryEntry 刷新缓存延迟
【发布时间】:2017-07-28 19:56:43
【问题描述】:

在调用 .NET 的 System.DirectoryServices.DirectoryEntry.RefreshCache() 时,我们发现有明显的延迟(11 秒或更长时间,具体取决于环境和负载)。此延迟是由于通过 DNS 和 WINS 查找 DC 名称的一般尝试。有谁知道如何指导 .NET 使用提供的服务器名称?下面的部分提供了详细信息。

DNS 查询: .NET 使用查询中的服务器名称对服务进行一系列 DNS 查询。当然,这个查询不起作用。 .NET 然后故障转移到 WINS/NetBIOS 以查找服务器名称。这不起作用,因此 .NET 故障转移到使用服务器名称查询 DNS 系统以获取 A 记录。最后一步有效。其中一些步骤存在重大延迟。

频率: 如果测试迭代间隔足够好,则此问题会在每次测试迭代开始时出现。在更密集的测试负载下,问题可能会跳过一两次测试迭代。

每次测试迭代中的后续连接尝试通常表现良好(我不知道为什么每次迭代都会建立多个连接 - 另一天的问题)。

技术: 托管代码的客户端计算机是与 Active Directory 服务器不同的域的成员。域之间已建立信任。

代码:

AuthenticationTypes authTypes = AuthenticationTypes.SecureSocketsLayer;
String connect = "LDAP://servername.otherdomain:636/DC=otherdomain"
DirectoryEntry de = new DirectoryEntry(connect, serviceAccount, PWD, authTypes)
de.RefreshCache(); // The delay is specific to this line.

// And so on...
dtree = de.Children;
policy = new DomainPolicy(de);
...

谢谢

【问题讨论】:

  • DNS 查找似乎不是问题。将 DC 添加到服务器的主机文件中,性能没有变化。
  • 看起来 .NET 使用查询中的服务器名称对服务进行了一系列 DNS 查找。当然,此查询不起作用,因此 .NET 故障转移到 WINS/NetBIOS 以查找服务器名称。这不起作用,因此 .NET 故障转移到使用服务器名称查询 DNS 系统以获取 A 记录。最后一步有效。

标签: .net performance delay directoryentry


【解决方案1】:

解决这个问题的办法是换行

AuthenticationTypes authTypes = AuthenticationTypes.SecureSocketsLayer;

AuthenticationTypes authTypes = AuthenticationTypes.SecureSocketsLayer || AuthenticationTypes.ServerBind;

通过指定“ServerBind”,我们让应用程序知道连接字符串包含服务器名称。

如果没有此 ServerBind 值,所涉及的组件将开始猜谜游戏,首先尝试在 DNS 中查询包含给定字符串的服务名称,然后故障转移到 WINS,然后再次使用服务器名称到 DNS 以获取 A 记录.所有这些操作都需要花费大量时间。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2015-06-01
    • 2014-02-17
    • 2019-05-17
    相关资源
    最近更新 更多