2016-04-15 2 views
2

Je suis en train d'ajouter plusieurs utilisateurs async avec graphique DAA Comme ceci:traitement par lots: userPrincipalName existe déjà lorsque vous essayez d'ajouter plusieurs utilisateurs Async DAA

IUser user1 = ...; 
IUser user2 = ...; 
IUser user3 = ...; 
List<Task> addTasks = new List<Task>(); 
addTasks.Add(activeDirectoryClient.Users.AddUserAsync(user1)); 
addTasks.Add(activeDirectoryClient.Users.AddUserAsync(user2)); 
addTasks.Add(activeDirectoryClient.Users.AddUserAsync(user3)); 
await Task.WhenAll(addTasks); 

Je reçois ce message d'erreur:

{"odata.error":{"code":"Request_BadRequest","message":{"lang":"en","value":"Another object with the same value for property userPrincipalName already exists."},"values":[{"item":"PropertyName","value":"userPrincipalName"},{"item":"PropertyErrorCode","value":"ObjectConflict"}]}}

Si j'utilise ce code:

IUser user1 = ...; 
IUser user2 = ...; 
IUser user3 = ...; 
List<Task> addTasks = new List<Task>(); 
await activeDirectoryClient.Users.AddUserAsync(user1); 
await activeDirectoryClient.Users.AddUserAsync(user2); 
await activeDirectoryClient.Users.AddUserAsync(user3); 

cela fonctionne bien.

Peut-être que nous ne pouvons pas ajouter plusieurs utilisateurs dans AAD en même temps?

EDIT Voici la partie des utilisateurs:

IUser newStudentUser = new User 
{ 
    DisplayName = $"Etudiant de l'école {school}", 
    UserPrincipalName = $"etudiant-{school}@........fr", 
    AccountEnabled = true, 
    MailNickname = $"Etudiant {school}", 
    UsageLocation = "US", 
    PasswordProfile = new PasswordProfile 
    { 
     Password = "......." 
    } 
}; 
IUser newTeacherUser = new User 
{ 
    DisplayName = $"Professeur de l'école {school}", 
    UserPrincipalName = $"professeur-{school}@........fr", 
    AccountEnabled = true, 
    MailNickname = $"Professeur {school}", 
    UsageLocation = "US", 
    PasswordProfile = new PasswordProfile 
    { 
     Password = "......." 
    } 
}; 
IUser newDirectorUser = new User 
{ 
    DisplayName = $"Directeur de l'école {school}", 
    UserPrincipalName = $"directeur-{school}@........fr", 
    AccountEnabled = true, 
    MailNickname = $"Directeur {school}", 
    UsageLocation = "US", 
    PasswordProfile = new PasswordProfile 
    { 
     Password = "......." 
    } 
}; 
+0

Peut-être que votre '...' s contiennent du code où certains objets ont fini par partager entre les 3 ' variables de l'utilisateur et donc la définition d'une valeur sur un paramètre la même valeur pour toutes les 3 variables "indépendantes". J'aurais pensé que c'était beaucoup plus probable. Vous ne pouvez pas confirmer depuis que vous avez élidé ce code. –

+0

J'ai ajouté la partie création d'utilisateurs. Mais je ne pense pas que ça puisse être parce que ça marche avec le 'wait ...; attendre ... wait ...; 'méthode – trenoncourt

+0

Pouvez-vous renommer votre question afin qu'elle puisse être liée au traitement par lots? – Thomas

Répondre

1

Dans votre cas, vous voulez la création de lots multiples utilisateurs.

À l'heure actuelle, le GraphClient effectue un traitement par lots de soutien, mais il y a une certaine limitation (Batch processing | Graph API concepts):

  • Un seul lot peut contenir un maximum de cinq requêtes et/ou modifier des ensembles combinés.
  • Un ensemble de modifications peut contenir au maximum une modification d'objet source et jusqu'à 20 opérations d'ajout et de suppression de lien combinées. Toutes les opérations de l'ensemble de modifications doivent être sur une entité source unique.

Donc dans votre cas vous ne pouvez pas créer par lots la création de plus de 5 utilisateurs. Lors de l'ajout d'une entité au client API Graph, vous pouvez choisir de reporter l'exécution de la requête à l'aide du paramètre deferredSave.

await activeDirectoryClient.Users.AddUserAsync(user, deferredSave: true); 

Le client API Graph a un DataServiceContextWrapper qui suit les modifications. Il fournit une méthode SaveChanges(Async).

await activeDirectoryClient.Context.SaveChangesAsync(); 

appel à cette méthode, vous pouvez spécifier le SaveChangesOptions:

  • Lot: Toutes les modifications en attente sont enregistrés dans une seule demande de traitement par lots.
  • BatchWithIndependentOperations: celui que vous souhaitez utiliser car la création de l'utilisateur doit se faire dans une seule requête. ContinueOnError: les modifications en attente sont enregistrées en utilisant plusieurs requêtes sur le serveur et l'opération se poursuit après qu'une erreur se soit produite.
  • Aucune: les modifications en attente sont enregistrées en utilisant plusieurs requêtes sur le serveur, mais l'opération s'arrête lors du premier échec (par défaut).
  • PatchOnUpdate:
  • ReplaceOnUpdate: les mises à jour en attente sont effectuées en remplaçant toutes les valeurs de l'entité dans la source de données par des valeurs de l'entité mise à jour.

Maintenant vous avez suffisamment d'informations pour écrire le code pour la création par lots des utilisateurs:

// Only 5 users per batch !!!! 
var user1 = ...; 
var user2 = ...; 
var user3 = ...; 
await activeDirectoryClient.Users.AddUserAsync(newStudentUser, deferredSave: true); 
await activeDirectoryClient.Users.AddUserAsync(newTeacherUser, deferredSave: true); 
await activeDirectoryClient.Users.AddUserAsync(newDirectorUser, deferredSave: true); 

// In debug mode, you should use the SaveChangesAsync method with the default options 
// Becasue the BatchWithIndependentOperations will not throw any exception even if there is a problem while creating the user. 
//await activeDirectoryClient.Context.SaveChangesAsync(); 
await activeDirectoryClient.Context 
    .SaveChangesAsync(SaveChangesOptions.BatchWithIndependentOperations); 
+0

J'utilise le même code que le vôtre pour faire une boucle sur une liste d'utilisateurs à créer. mais je reçois une exception, ** "Le contexte suit déjà l'entité" ** J'utilise votre même code mais avec une liste d'utilisateurs et une boucle, c'est vraiment frustrant car je suis coincé avec cette erreur pour un couple de jours – shakram02

+0

@AhmedHamdy, d'où vient votre liste? Comment créez-vous votre liste d'utilisateurs? N'hésitez pas à poser une nouvelle question et à poster votre code – Thomas

+0

Merci pour la réponse rapide, s'il vous plaît trouver ma question ici http://stackoverflow.com/questions/38429710/create-multiple-users-azure-active-directory – shakram02