2011-12-28 2 views
0

У меня есть класс, который имеет три метода, которые имеют функциональные возможности в 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

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

+0

Я принимаю ваш совет, но я подожду несколько часов, чтобы узнать, знает ли кто-нибудь способ достичь этого, не создавая класс переноса, прежде чем утверждать свой ответ. Большое спасибо! :) – anilca

Смежные вопросы