2017-05-19 1 views
0

J'utilise Azure Management Libraries (particulièrement couramment) pour créer une requête Web vers leur API afin d'obtenir une liste de mes bases de données sous mon abonnement. Je suis en mesure d'obtenir une instance de sqlserver en utilisant couramment, mais je suis incapable d'obtenir une liste de toutes les bases de données sous un serveur spécifique. Définir et supprimer le travail bien c'est juste la fonction list().Azure Management Libraries Sdk pour .NET La fonction list() ne fonctionne pas pour les différentes interfaces

J'ai essayé de l'utiliser pour sqlserver.firewallrules et la fonction list ne fonctionne pas aussi bien.

Voici un code: Le journal à un moment donné fait une pause puis juste écrit "a terminé avec le code 0"

public async Task<List<String>> getSqlDatabaseList() 
    { 
     System.Diagnostics.Debug.WriteLine("Starting to get database list"); 
     List<string> dbNameList = new List<string>(); 

     //the var azure is defined earlier in the project and is authenticated. 
     var sqlServer = await azure.SqlServers.GetByResourceGroupAsync("<resource group name>", "<server Name>"); 

     //The code below successfully writes the server name 
     System.Diagnostics.Debug.WriteLine(sqlServer.Name); 

     //The code below here is where everyting stop and "has exited with code 0" happens after a few seconds of delay 
     var dbList = sqlServer.Databases.List(); 

     //Never reaches this line 
     System.Diagnostics.Debug.WriteLine("This line never is written"); 

     foreach (ISqlDatabase db in dbList) 
     { 
      dbNameList.Add(db.Name); 
     } 
     return dbNameList; 
    } 

Précision: J'utilise ASP.NET MVC Voici comment ma méthode de contrôleur accède à la méthode de classe. Le Gestionnaire de ressources est le nom de la classe qui implémente getSQlDatabaseList();

 // GET: Home 
    public async Task<ActionResult> Index() 
    { 
     ResourceManager rm = new ResourceManager(); 
     List<string> test = await rm.getSqlDatabaseList(); 
     //Never Gets to this line of code and never calls the for each or anything after 
     foreach (var item in test) 
     { 
      System.Diagnostics.Debug.WriteLine(item); 
     } 
     System.Diagnostics.Debug.WriteLine("Is past for each"); 
     //AzureManager azm = await AzureManager.createAzureManager(); 
     //await azm.getResourceGroupList(); 
     return View(new UserLogin()); 
    } 
+0

Pour plus de précisions: Cela fait partie d'une application Web en utilisant Asp.net MVC. –

Répondre

0

Selon votre code et la description, je suppose que la raison pour laquelle votre code ne peut pas créer la table est votre async getSqlDatabaseList.

Je suppose que vous appelez cette méthode dans la méthode principale console ou autre chose.

Si votre méthode principale est exécutée complètement, votre méthode asynchrone getSqlDatabaseList n'est pas exécutée complètement et renvoie la liste de la chaîne. Cela mettra fin à toute méthode asynchrone.

Je suggère que vous pourriez ajouter le mot clé de clé d'attente ou de résultat lors de l'appel de la méthode getSqlDatabaseList pour attendre que le thread exécute complètement la méthode.

Plus de détails, vous pouvez vous référer à la démonstration de test ci-dessous.

static void Main(string[] args) 
     { 
      //use result to wait the mehtod executed completely 
      List<String> test = getSqlDatabaseList().Result; 

      foreach (var item in test) 
      { 
       Console.WriteLine(item); 
      } 

      Console.Read(); 

     } 

     public static async Task<List<String>> getSqlDatabaseList() 
     { 
      //System.Diagnostics.Debug.WriteLine("Starting to get database list"); 
      List<string> dbNameList = new List<string>(); 

      var credentials = SdkContext.AzureCredentialsFactory.FromFile(@"D:\Auth.txt"); 

      var azure = Azure 
       .Configure() 
       .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic) 
       .Authenticate(credentials) 
       .WithDefaultSubscription(); 

      var sqlServer = await azure.SqlServers.GetByResourceGroupAsync("groupname", "brandotest"); 


      var dbList = sqlServer.Databases.List(); 

      foreach (ISqlDatabase db in dbList) 
      { 
       dbNameList.Add(db.Name); 
      } 
      return dbNameList; 
     } 

Mise à jour:

Selon votre description, j'ai créé un test application MVC. Comme vous le dites, j'ai reproduit votre problème.

Je pense qu'il y a quelque chose qui ne va pas avec le SDK fluide azure management.

Voici une solution de contournement, je suggère que vous puissiez directement envoyer api de repos pour obtenir la base de données.

Plus de détails, vous pouvez consulter ci-dessous pour les codes:

Envoyer la demande ci-dessous url:

https://management.azure.com/subscriptions/ {subscriptionsid}/resourceGroups/{} resourceGroupsname /providers/Microsoft.Sql/servers/ {nom_serveur}/bases de données?apiVersion = {} apiVersion

public static List<String> getSqlDatabaseList() 
     { 
      //System.Diagnostics.Debug.WriteLine("Starting to get database list"); 
      List<string> dbNameList = new List<string>(); 

      string tenantId = "yourtenantid"; 
      string clientId = "yourclientId"; 
      string clientSecret = "clientSecret"; 
      string subscriptionid = "subscriptionid"; 
      string resourcegroup = "resourcegroupname"; 

      string sqlservername = "brandotest"; 
      string version = "2014-04-01"; 

      string authContextURL = "https://login.windows.net/" + tenantId; 
      var authenticationContext = new AuthenticationContext(authContextURL); 
      var credential = new ClientCredential(clientId, clientSecret); 
      var result = authenticationContext.AcquireToken(resource: "https://management.azure.com/", clientCredential: credential); 

      if (result == null) 
      { 
       throw new InvalidOperationException("Failed to obtain the JWT token"); 
      } 

      string token = result.AccessToken; 

      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/servers/{2}/databases?api-version={3}", subscriptionid, resourcegroup, sqlservername, version)); 

      request.Method = "GET"; 
      request.Headers["Authorization"] = "Bearer " + token; 


      request.ContentType = "application/json"; 


      var httpResponse = (HttpWebResponse)request.GetResponse(); 
      using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       string jsonResponse = streamReader.ReadToEnd(); 

       dynamic json = JsonConvert.DeserializeObject(jsonResponse); 

       dynamic resultList = json.value.Children(); 


       foreach (var item in resultList) 
       { 

        dbNameList.Add(((Newtonsoft.Json.Linq.JValue)item.name).Value.ToString()); 
       } 
      } 


      return dbNameList; 
     } 

Résultat:

enter image description here


Une autre solution.

Je suggère que vous pouvez utiliser thread.join pour attendre que la méthode de liste s'exécute complètement.

code:

public static async Task<List<String>> getSqlDatabaseList() 
     { 
      //System.Diagnostics.Debug.WriteLine("Starting to get database list"); 
      List<string> dbNameList = new List<string>(); 

      var credentials = SdkContext.AzureCredentialsFactory.FromFile(@"D:\Auth.txt"); 

      var azure = Azure 
       .Configure() 
       .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic) 
       .Authenticate(credentials) 
       .WithDefaultSubscription(); 

      var sqlServer = await azure.SqlServers.GetByResourceGroupAsync("brandosecondtest", "brandotest"); 

      IReadOnlyList<ISqlDatabase> dbList = null; 

      Thread thread = new Thread(() => { dbList = sqlServer.Databases.List(); }); 
      thread.Start(); 
      //wait the thread 
      thread.Join(); 

      foreach (ISqlDatabase db in dbList) 
      { 
       dbNameList.Add(db.Name); 
      } 
      return dbNameList; 
     } 

Résultat:

enter image description here

+1

Pour clarifier ce n'est pas une application console mais une application Web utilisant MVC. J'ai essayé d'utiliser votre code, mais le code semble se bloquer avant d'obtenir le sqlserver (le mien a gelé lorsque vous essayez d'obtenir la liste de base de données). –

+0

J'ai téléchargé ma réponse. –

+0

Merci. Savez-vous par hasard quand une mise à jour sera faite à la SDK pour résoudre le problème? –