从Active Directory获取大量对象时应特别注意,一不小心,就会掉入性能瓶颈甚至引起内存泄漏。本文提供了一个关于.NET访问Active Directory的优化例子。

1.获取对象的属性值 DirectoryEntry.Properties

获取一个DirectoryEntry对象后,我们就开始检索它的属性值;习惯了用foreach的朋友一般会这样写:

DirectoryEntry entry = //
foreach(Property property in entry.Properties)
{
    if(property.Name == //)
        //
}

事实上,System.DirectoryService.PropertyCollection内部包含了一个HashTable用于键值对访问,并且在索引器中,对未包含的键,创建一个新的PropertyValueCollection对象并加入到HashTable中。

所以,我们可以放心地直接写下:

string propertName = //
object value = entry.Properties[propertName].Value;

对这个新建的PropertyValueColletion,它的Value属性定义同样保证了访问的健壮性,这是它的源代码:

public object Value
{
    get
    {
        if (base.Count == 0)
        {
            return null;
        }
        if (base.Count == 1)
        {
            return base.List[0];
        }
        object[] array = new object[base.Count];
        base.List.CopyTo(array, 0);
        return array;
    }
}

这样,代码中不需要去调用entry.Properties.Contains方法,而直接使用以下代码就可以高效地访问DirectoryEntry对象的属性了:

object value = entry.Properties[propertyName].Value;
if ( value != null )
{
    //
}

在测试中,查询两万个对象的属性值时,可以节省90秒左右的时间。

2.构建搜索器 DirectorySearcher

使用这个类应注意三点:

(1)对搜索结果的缓存。它默认的CacheResults为true,如果你不需要,应记得将它设置为false,否则一大块空间就浪费了。

(2)仅搜索已赋值的Property。PropertyNamesOnly默认为false,会搜索所有的Property返回多于你想要的对象,记得将它设置为true。

(3)可以在其构造函数中指定PropertyName数组,只搜索包含PropertyName的对象。

下面的例子是搜索包含UserName和Password属性并且属性已赋值的对象:

DirectorySearcher searcher = new DirectorySearcher(
                entry,
                "username=*",
                new string[] { "UserName", "Password", });
searcher.PropertyNamesOnly = true;
SearchResultCollection results = searcher.FindAll();

3.遍历和释放结果集 SearchResultCollection

foreach对于SearchResultCollection的访问是更高效的方式,这是因为,SearchResultCollection的内部使用ArrayList进行集合的索引访问,在第一次加载ArrayList时,它调用迭代器将所有的SearchResult对象创建并装箱到ArrayList中,当进行SearchResultCollection[int index]访问时,它对ArrayList中的对象进行拆箱操作。下面是SearchResultCollection构建InnerList的源代码:

private ArrayList InnerList
{
    get
    {
        if (this.innerList == null)
        {
            this.innerList = new ArrayList();
            IEnumerator enumerator = new ResultsEnumerator(this, this.rootEntry.GetUsername(), this.rootEntry.GetPassword(), this.rootEntry.AuthenticationType);
            while (enumerator.MoveNext())
            {
                this.innerList.Add(enumerator.Current);
            }
        }
        return this.innerList;
    }
}

而foreach是直接调用迭代器创建和返回一个SearchResult对象,避免了装箱与拆箱的过程。

应严重注意的是:SearchResultCollection是未托管资源,而且会占用大量的内存,需要获取大量对象的属性时,推荐使用集合来保存所需的属性值,完成之后立即调用SearchResultCollection.Dispose()来对它进行释放,否则,会导致内存泄露。

转载于:https://www.cnblogs.com/RCFans/archive/2008/11/18/1336290.html

优化.NET访问Active Directory的性能相关推荐

  1. 活动目录(Active Directory)

    Active Directory和活动目录是同义词,已合并. 活动目录 百科名片 活动目录(Active Directory)是面向Windows Standard Server.Windows En ...

  2. 如何验证 Active Directory 使用表单身份验证和 Visual C#.NET

    本文引用下面的 Microsoft.NET 框架类库名称空间: System.Text System.DirectoryServices System.Security.Principal Syste ...

  3. 创建使用 Active Directory 模式隔离用户的新 FTP 站点

    "使用 Active Directory 隔离用户"模式根据相应的 Active Directory 容器验证用户凭据,而不是搜索整个 Active Directory,因为这样做 ...

  4. C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

    转自:http://blog.csdn.net/lingpaoershiyishiji/article/details/9139527 目录 示例准备 知识了解 读取AD域信息示例 Directory ...

  5. php ldap目录协议,PHP 通过LDAP协议,操作Windows Active Directory

    一.学习如何管理Active Directory Active Directory 循序渐进系列指南 二.ADExplorer 到网上下载一个ADExplorer,它是Active Directory ...

  6. 域渗透基础知识(二)之活动目录 Active Directory 的查询

    目录 Active Directory Active Directory 的查询基础语法 什么是BaseDN 什么是Naming Context 什么是LDAP(轻量级目录访问协议) 过滤规则 LDA ...

  7. 查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)

    1.查询性能优化 1.1 使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 比较重要的字段有: select ...

  8. Active Directory 域滲透 (如何访问数据库?)

    数据库数据交互,域控制器提供了几个选项来转换为它们支持的各种协议/服务: LDAP 端口: LDAP 定义了一种查询语法,允许您过滤需要在数据库中检索/编辑的对象.您可以按对象的属性过滤对象.例如,要 ...

  9. 活动目录(Active Directory)域故障解决实例

    A1.客户机无法加入到域? 一.权限问题. 要想把一台计算机加入到域,必须得以这台计算机上的本地管理员(默认为administrator)身份登录,保证对这台计算机有管理控制权限.普通用户登录进来,更 ...

最新文章

  1. JavaScript中的this用法
  2. 【数据库】MySQL数据库(一)
  3. 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
  4. 主业失利,跨界捞金,飞科的算盘能如意吗?
  5. LeetCode——Same Tree(判断两棵树是否相同)
  6. mac iTunes启动失败,声称iTunes文件夹被锁定
  7. 用python画六瓣雪花_python-turtle-画雪花-2种方法及效果的详解
  8. ROS入门笔记(六): ROS系统架构
  9. 中国移动也要办电竞大赛了!联合腾讯网易办首届电竞大赛
  10. AI 换脸冲上 GitHub TOP1,如何一键生成亲妈都不认识的自己?
  11. 使用cgroup限制某个程序对内存的使用
  12. 《机器学习实战》--资料下载和运行环境
  13. aspx 微型_最初的十亿分钟:正在向世界授课的微型非营利组织背后的数字
  14. 网络安全专栏——telnet远程登录数据包捕获个性化登录账号及密码(图文丰富 保姆级 有几种错误解决方案 为什么不用输入telnet密码就能登录 )
  15. ogg是什么文件?ogg怎么转mp3格式?
  16. Excel的一些实用函数(if函数,vlookup函数,match函数)
  17. 逆向分析系列——查壳侦壳工具
  18. Android返回上一页面的方式
  19. 面试官最常问的10道测试用例面试题及答案,每1题都很经典
  20. Ionic开发入门教程_3

热门文章

  1. Unity 3D学习之路
  2. Red Hat Enterprise Linux 7 高薪运维入门 - 孙亚南、李勇
  3. 教你批量消除视频原声,一学就会
  4. 产品项目分析之竞品分析
  5. google哈希面试题
  6. Google面试题 图论的问题
  7. Gingko Framework:session的使用
  8. 淘宝店铺买家订单+淘宝店铺买家订单物流获取步骤说明
  9. SMB交换机、接入交换机、汇聚交换机、核心交换机
  10. 前端实现炫酷动效_web前端入门到实战:使用CSS创建一个炫酷的球体动画效果