2

나는 푸른 Active Directory에서 150 사용자를 가지고 있고 그들에게 이런 식으로 받고 있어요 (아마도 교착 상태) :푸른 Active Directory는 모든 사용자를 얻을 -

public List<Generic.UserAAD> GetUsersAAD() 
    { 
     ActiveDirectoryClient activeDirectoryClient = AuthenticationHelper.GetActiveDirectoryClientAsApplication(); 

     IPagedCollection<IUser> usersA = activeDirectoryClient.Users.ExecuteAsync().Result; 
     List<IUser> queryUsers = new List<IUser>(); 
     List<Generic.UserAAD> listUsers = new List<Generic.UserAAD>(); 

     do 
     { 
      List<IUser> queryUsersList = usersA.CurrentPage.ToList(); 
      queryUsers.AddRange(queryUsersList); 
      usersA = usersA.MorePagesAvailable ? usersA = usersA.GetNextPageAsync().Result : null; 
     } while (usersA != null); 

     if (queryUsers.Count > 0) 
     { 
      listUsers = queryUsers.Select(u => new Generic.UserAAD { DName = u.DisplayName, UName= u.UserPrincipalName }).ToList(); 
     } 

     return listUsers; 
    } 

을 그리고 이것은 AuthenticationHelper 클래스입니다 :

public class AuthenticationHelper 
{ 
    public static async Task<string> AcquireTokenAsyncForApplication() 
    { 
     return await GetTokenForApplication().ConfigureAwait(false); 
    } 


    public static ActiveDirectoryClient GetActiveDirectoryClientAsApplication() 
    { 
     Uri servicePointUri = new Uri(Constantes.graphUrl); 
     Uri serviceRoot = new Uri(servicePointUri, Constantes.tenantId); 
     ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, 
      async() => await AcquireTokenAsyncForApplication().ConfigureAwait(false)); 
     return activeDirectoryClient; 
    } 


    public static async Task<string> GetTokenForApplication() 
    { 
     AuthenticationContext authContext = new AuthenticationContext(Constantes.authority, false); 
     ClientCredential clientCred = new ClientCredential(Constantes.clientId, Constantes.appKey); 
     AuthenticationResult authenticationResult = authContext.AcquireTokenAsync(Constantes.graphUrl, 
         clientCred).Result; 
     var token = authenticationResult.AccessToken; 
     return token; 
    } 
} 

문제는 로컬에서 완벽하게 작동하지만 Azure 웹 응용 프로그램에 배포하고 GetUsersAAD() 메서드를 호출하는 서비스를 실행 한 후 작동하지 않으면 http 요청이 멈추고 몇 분 후에 500 오류가 발생합니다. 타임 아웃.

이것은 AspNet MVC의 WebApi2 프로젝트입니다.

저는 정말 감사드립니다. 감사합니다. 감사합니다.

+0

Azure AD에서 1 명의 사용자 만 얻으면 어떻게 되나요? – stuartd

+1

http 트래픽을 볼 수 있어야하고 응답에서 더 명확한 오류 메시지를 얻을 수 있어야합니다. –

+0

@stuartd - 예 (최대 또는 100 명)가 CurrentPage 메서드를 사용하면 잘 작동합니다. 더 이상 필요하지 않으면 GetNextPageAsync()를 사용할 필요가 없습니다. –

답변

1

좋아,, 읽기, 나는 그것이 작동하는지 확인 할 수 있었다 많이 검색 한 후이 .Result이 교착 상태에 발생하기 쉬운 그리고 그것은 비동기 방법에하지 않는 것이 좋습니다는, 또한 내가 비동기의 나쁜 활용 한 것으로 보인다 /은/작업을 부름을 기다리고, 그래서 그것을 작동하게하는 방식이었다 :

public async Task<List<Generic.UserAAD>> GetUsersAAD() 
{ 
    ActiveDirectoryClient activeDirectoryClient = AuthenticationHelper.GetActiveDirectoryClientAsApplication(); 

    Task<IPagedCollection<IUser>> usersTask = activeDirectoryClient.Users.ExecuteAsync(); 
    IPagedCollection<IUser> usersA = await usersTask; 
    List<IUser> queryUsers = new List<IUser>(); 
    List<Generic.UserAAD> listUsers = new List<Generic.UserAAD>(); 

    do 
    { 
     List<IUser> queryUsersList = usersA.CurrentPage.ToList(); 
     queryUsers.AddRange(queryUsersList); 
     usersA = usersA.MorePagesAvailable ? await usersA.GetNextPageAsync() : null; 
    } while (usersA != null); 

    if (queryUsers.Count > 0) 
    { 
     listUsers = queryUsers.Select(u => new Generic.UserAAD { DName = u.DisplayName, UName= u.UserPrincipalName }).ToList(); 
    } 

    return listUsers; 
} 

내가 작업과의 부름 비동기 에 방법을 조정했다.

관련 문제