2016-09-21 3 views
0

Ich schreibe eine MVC-Anwendung, die Benutzer in Azure Active Directory erstellen muss. Ich habe den Code, der den Benutzer in seiner eigenen Bibliothek erstellt, eingepackt, und es funktioniert gut innerhalb eines Komponententests. Wenn jedoch derselbe Code in meinem MVC-Controller aufgerufen wird, wird der Aufruf von AddUserAsync nie zurückgegeben. Als Test habe ich meinen Controller umgestellt, so dass man anstatt einen neuen Benutzer zu erstellen, einfach versucht, einen Benutzer zu bekommen. Der Controller sieht aus wie:Azure ActiveDirectoryClient innerhalb der MVC-Anwendung gibt nie zurück

private async Task<User> GetUserByUserName(ActiveDirectoryClient adClient, string userName) 
    { 
     var user = await adClient.Users.Where(u => u.UserPrincipalName == userName).ExecuteSingleAsync(); 
     return (User) user; 
    } 

     public AADUser GetUserByPrincipalName(string userName) 
     { 
        Task<User> user = GetUserByUserName(AdClient, userName); 
        user.Wait(new TimeSpan(0, 1, 0)); 
        if (true == user.IsFaulted) 
        { 
           throw user.Exception; 
        } 

        if (null == user.Result) 
        { 
           return null; 
        } 

        return MapUserToAADUser(user.Result); 
     } 

Der Aufruf von ExecuteSingleAsync einfach nie egal gibt, wie lange ich es geben:

public class RegistrationController : BaseController 
    { 
     public ActionResult Index() 
     { 
      AadAccessHelper adHelper = new AadAccessHelper(); 
      var client = adHelper.AdClient; 
      AADUser aadUser = adHelper.GetUserByPrincipalName("[email protected]"); 

      return View(); 
     } 
    } 

Und die Helfer Klasse Sachen, die den Benutzer aussieht bekommt. Was vermisse ich?

Das Testverfahren besteht darin, die Website in Chrome zu starten (ich habe beide IEs mit demselben Ergebnis verwendet), ich navigiere zur Registrierungsseite (ich habe den Code zu Testzwecken verschoben) und dann beginnt die Traurigkeit.

Wiederum: Der Code funktioniert einwandfrei, wenn er in einem Komponententest ausgeführt wird. Muss ich anstelle des Microsoft.Azure.ActiveDirectory.GraphClient.ActiveDirectoryClient einen anderen Client verwenden?
Der Zweck der Anwendung, wenn ich fertig bin, wird es sein, neue Benutzer zu registrieren und bestimmten Benutzern zu erlauben, Anwendungsbenutzer zu verwalten (Passwörter zurücksetzen, Benutzereigenschaften ändern, Benutzer Gruppen zuweisen, ect).

Ich bin in Visual Studio 2015 und was auch immer die neuesten Sachen aus GitHub kommen.

Jede Hilfe würde sehr geschätzt werden.

+0

Das sieht aus wie eine klassische Sackgasse. Werfen Sie einen Blick auf eine Stephen Cleary Post: http://blog.stephencleary.com/2012/02/async-and-await.html –

Antwort

1

Anstatt den AADUser direkt zurückzugeben, sollten wir die Task < AADUser> verwenden. Hier ist der Code funktioniert gut für mich:

public async Task<AADUser> GetUserByPrincipalName(string userName) 
    { 

     var user = await GetUserByUserName(activeDirectoryClient, userName); 

     return new AADUser() 
     { 
      displayName = user.DisplayName 
     }; 

    } 

Controller:

public async Task<ActionResult> test() 
      { 
      var user = await new AzureADGraphTest.Users().GetUserByPrincipalName("[email protected]"); 

      return View(); 
     } 
+0

Yup - Knochen Kopf Fehler auf Teil. Einer meiner Freunde hat darauf hingewiesen, nachdem ich das gepostet habe. Danke für die Hilfe. – Jake

Verwandte Themen