Не удается получить доступ к исключению удаленного объекта в классе библиотеки - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть класс, у которого есть три метода, которые имеют функциональные возможности в Active Directory. Вот этот класс:

[Export(typeof(IAuthentication))]
public class Authentication : IAuthentication
{
    public bool Authenticate(string domain, string username, string password) 
    {
        try
        {
            using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domain, string.Empty))
            {
                return principalContext.ValidateCredentials(
                    username,
                    password,
                    ContextOptions.SimpleBind);
            }
        }
        catch (Exception ex)
        {   
            throw ex;
        }
    }

    public UserPrincipal GetUserDetails(string domain, string username) 
    {
        try
        {
            using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domain))
            {
                return UserPrincipal.FindByIdentity(principalContext, username);
            }
        }
        catch (Exception ex)
        {   
            throw ex;
        }
    }

    public PrincipalSearchResult<Principal> SearchUsers(string domain, string firstName, string lastName, string userName)
    {
        try
        {
            using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain))
            {
                UserPrincipal user = new UserPrincipal(ctx);
                user.Enabled = true;
                user.Name = firstName + "* " + lastName + "*";
                user.SamAccountName = userName + "*";

                PrincipalSearcher principalSearcher = new PrincipalSearcher();
                principalSearcher.QueryFilter = user;

                return principalSearcher.FindAll();
            }
        }
        catch (Exception ex)
        {   
            throw ex;
        }
    }
}

Как вы видите в атрибуте класса, я использую эту библиотеку классов как плагин MEF. В моем приложении asp.net mvc 3 я вызываю метод следующим образом:

PrincipalSearchResult<Principal> results = _authentication.SearchUsers(
                                                        ConfigurationManager.AppSettings["DomainName"], 
                                                        model.UserSearchCriteria.FirstName, 
                                                        model.UserSearchCriteria.LastName, 
                                                        model.UserSearchCriteria.Username);

Но после того, как я собираюсь использовать возвращаемое значение метода, я получаю Невозможно получить доступ к удаленному объекту, Имя объекта: 'PrincipalContext' исключение. Я знаю, что удаляю объект PrincipalContext, но если я этого не сделаю, соединение с Active Directory останется открытым. Я думаю, что дизайн моего класса не является правильным. Как я могу заставить его работать круто?

1 Ответ

1 голос
/ 28 декабря 2011

Я полагаю, что когда вы в конечном итоге перечисляете экземпляр PrincipalSearchResult<T>, эта отложенная операция пытается получить доступ к контексту, который с тех пор был закрыт.В этом случае вам, вероятно, лучше сразу перечислить результаты и вернуть их в виде моделей, специфичных для предметной области.То есть, делать работу в то время, а не откладывать ее путем возврата PrincipalSearchResult<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...