簡體   English   中英

如何正確處理使用ADODB ADsDSObject提供程序為Ldap搜索創建的對象

[英]How to properly dispose objects created for Ldap search using ADODB ADsDSObject provider

我正在尋找最佳方法,如何根據給定條件為用戶查找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;
}

我發現使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM