2

私はAzureのActive Directory内の150人のユーザーがいると私は彼らにこのようになっています(おそらくデッドロック):のAzure 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 Web AppにデプロイしてGetUsersAAD()メソッドを呼び出すサービスを実行すると動作しません.HTTP要求がフリーズし、数分後に500エラーが発生します。タイムアウト。

これは、AspNet MVC上のWebApi2プロジェクトです。

私は本当にありがとうございます。ありがとうございます。

+0

Azure ADから1人のユーザーしかいない場合はどうなりますか? – stuartd

+1

httpトラフィックを監視し、応答からより明確なエラーメッセージを得ることができるはずです。 –

+0

@stuartd - はい、100人以上のユーザーが、CurrentPageメソッドを使用するだけでうまくいきます。それ以上のものを必要としない場合は、GetNextPageAsync()は必要ありません。 –

答えて

1

OK]をクリックして、私はそれが動作させることができた多くのことを読んで、検索した後、.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; 
} 

を、私はそれにタスクと召し非同期(async)に方法を調整しなければなりませんでした。

関連する問題