如何使用ADODB ADsDSObject提供程序正确处理为Ldap搜索创建的对象

时间:2014-02-25 15:19:08

标签: c# ldap dispose

我正在寻找如何按给定条件为用户查找LDAP目录的最佳方法。目前最好的性能似乎提供ADsDSObject提供程序的使用。代码将在ASP.NET网站上运行。

我想确认如何妥善处理资源。这是目前使用的代码。代码是正确释放资源还是需要改进?

public static List<LookupValues> FindBy(LdapSearchCriteria criteria)
{
    List<LookupValues> usersMatchingCriteria = new List<LookupValues>();

    ADODB.Command adoCommand = new ADODB.Command();
    ADODB.Connection adoConnection = new ADODB.Connection();
    ADODB.Recordset adoResultSet = new ADODB.Recordset();

    adoConnection.ConnectionString = connectionString;
    adoConnection.Open();
    adoCommand.ActiveConnection = adoConnection;
    adoCommand.CommandText = BuildSelectStatmentFrom(criteria);
    object dummy = Type.Missing;

    try
    {
        adoResultSet = adoCommand.Execute(out dummy, ref dummy, 0);
        if (adoResultSet != null)
        {
            while (adoResultSet.EOF == false)
            {
                LookupValues value = new LookupValues();
                for (int i = 0; i < adoResultSet.Fields.Count; i++)
                {
                    switch (adoResultSet.Fields[i].Name)
                    {
                        case "a-foreignGivenName":
                            value.FirstName = (adoResultSet.Fields[i].Value).ToString();
                            break;
                        case "a-foreignSn":
                            value.LastName = (adoResultSet.Fields[i].Value).ToString();
                            break;
                    }
                }
                usersMatchingCriteria.Add(value);
                adoResultSet.MoveNext();
            }
        }
    }
    finally
    {
        if (adoResultSet != null)
        {
            adoResultSet.Close();
            adoResultSet = null;
        }

        if (adoConnection != null)
        {
            adoConnection.Close();
            adoConnection = null;
        }
    }

    return usersMatchingCriteria;
}

1 个答案:

答案 0 :(得分:0)

我发现使用System.DirectoryServices.Protocols命名空间中的类相当甚至更快一些。使用.NET类的等效代码

public List<LookupValues> FindBy(LdapSearchCriteria criteria)
{
    List<LookupValues> usersMatchingCriteria = new List<LookupValues>();

    NetworkCredential credentials = new NetworkCredential(connectionDetails.UserName, connectionDetails.Password, connectionDetails.Domain);
    LdapDirectoryIdentifier directoryIdentifier = new LdapDirectoryIdentifier(connectionDetails.Server, connectionDetails.Port, false, false);

    using (LdapConnection connection = CreateConnection(directoryIdentifier))
    {
        connection.Bind(credentials);

        SearchRequest search = CreateSearchRequest(criteria);

        SearchResponse response = connection.SendRequest(search) as SearchResponse;
        foreach (SearchResultEntry entry in response.Entries)
        {
            LookupValues foundUser = GetUserDetailsFrom(entry);
            usersMatchingCriteria.Add(foundUser);
        }
    }

    return usersMatchingCriteria;
}
相关问题