2017-05-19 1 views
0

Ich verwende die Azure-Verwaltungsbibliotheken (speziell fließend), um eine Webanforderung an ihre API zu erstellen, um eine Liste meiner Datenbanken unter meinem Abonnement zu erhalten. Ich bin in der Lage, eine Instanz des SQL-Servers mit fließenden zu bekommen, aber ich bin nicht in der Lage, eine Liste aller Datenbanken unter einem bestimmten Server zu erhalten. Definieren und löschen Sie Arbeit fein es ist nur die Funktion list().Azure-Verwaltungsbibliotheken Sdk für .NET list() -Funktion funktioniert nicht für verschiedene Schnittstellen

Ich habe versucht, es für sqlserver.firewallrules zu verwenden, und die List-Funktion funktioniert auch nicht dort. Hier

ist ein Code: Das Protokoll an einem gewissen Punkt pausiert nur dann schreibt "hat mit Code verlassen 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; 
    } 

Klarstellung: Ich verwende ASP.NET MVC Hier ist, wie Meine Controller-Methode greift auf die Klassenmethode zu. Resource Manager ist der Name der Klasse, die getSQlDatabaseList() implementiert;

 // 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

Für weitere Klarstellung: Dies ist Teil eines Web-App ist mit Asp.net MVC. –

Antwort

0

nach Ihren Code und eine Beschreibung, ich denke, der Grund, warum der Code nicht in der Tabelle getSqlDatabaseList ist über Ihre async schaffen könnte.

Ich rate, dass Sie diese Methode in der Konsole Hauptmethode oder etwas anderes aufrufen.

Wenn Ihre Hauptmethode vollständig ausgeführt wird, wird Ihre async-Methode getSqlDatabaseList nicht vollständig ausgeführt und gibt die Liste der Zeichenfolge zurück. Es wird alle asynchrone Methode beenden.

Ich schlage vor, Sie könnten warten oder Ergebnis key-Schlüsselwort hinzufügen, wenn Sie die Methode getSqlDatabaseList aufrufen, um den Thread zu warten, führen Sie die Methode vollständig aus.

Weitere Details finden Sie unter Test Demo.

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; 
     } 

Update:

Nach Ihrer Beschreibung, ich habe einen Test MVC-Anwendung erstellt. Wie du sagst, habe ich dein Problem reproduziert.

Ich denke, es gibt etwas falsch mit dem azure Management flüssig SDK.

Hier ist eine Problemumgehung, ich schlage vor, Sie könnten direkt Rest API senden, um die Datenbank zu erhalten.

Weitere Details, die Sie unter Codes beziehen könnten:

die Anfrage senden an unter url:

https://management.azure.com/subscriptions/ {subscriptionsid}/resourceGroups/{} resourceGroupsname /providers/Microsoft.Sql/servers/ {Servername}/Datenbanken?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; 
     } 

Ergebnis:

enter image description here


Eine andere Lösung.

Ich schlage vor, Sie könnten thread.join verwenden, um zu warten, dass die Listenmethode vollständig ausgeführt wird.

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; 
     } 

Ergebnis:

enter image description here

+1

Um dies zu verdeutlichen, handelt es sich nicht um eine Konsolenanwendung, sondern um eine Webanwendung, die MVC verwendet. Ich habe versucht, Ihren Code zu verwenden, aber der Code scheint einzufrieren, bevor Sie den SQL-Server (meine eingefroren beim Versuch, die Datenbank-Liste) zu bekommen. –

+0

Ich habe meine Antwort hochgeladen. –

+0

Danke. Wissen Sie zufällig, wann ein Update an den SDK vorgenommen wird, um das Problem zu beheben? –

Verwandte Themen