簡體   English   中英

.NET list()的Azure管理庫Sdk函數不適用於各種接口

[英]Azure Management Libraries Sdk for .NET list() function not working for various interfaces

我正在使用Azure管理庫(特別是流利的)向其api創建Web請求,以獲取我的訂閱下的數據庫列表。 我可以使用fluent獲取sqlserver的實例,但無法獲取特定服務器下所有數據庫的列表。 定義和刪除工作正常,它只是list()函數。

我已經嘗試將其用於sqlserver.firewallrules,並且list函數也無法正常運行。

這是一些代碼:日志有時會暫停然后寫入“已退出,代碼為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;
    }

澄清:我正在使用ASP.NET MVC。這是我的控制器方法訪問類方法的方式。 資源管理器是實現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());
    }

根據您的代碼和描述,我猜您的代碼無法創建表的原因與您的異步getSqlDatabaseList有關。

我猜您在控制台main方法或其他方法中調用了此方法。

如果main方法已完全執行,則異步方法getSqlDatabaseList不會完全執行並返回字符串列表。 它將結束所有異步方法。

我建議您可以在調用getSqlDatabaseList方法以等待線程完全執行該方法時添加await或result key關鍵字。

更多詳細信息,您可以參考下面的測試演示。

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

更新:

根據您的描述,我已經創建了一個測試MVC應用程序。 正如您所說,我已重現您的問題。

我認為Azure管理流利的SDK出了點問題。

這是一種解決方法,我建議您可以直接發送rest api來獲取數據庫。

更多詳細信息,您可以參考以下代碼:

將請求發送到以下網址:

https://management.azure.com/subscriptions/ {subscriptionsid} / resourceGroups / {resourceGroupsname} /providers/Microsoft.Sql/servers/ {servername} / databases?api-version = {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;
        }

結果:

在此處輸入圖片說明


另一個解決方法。

我建議您可以使用thread.join等待list方法完全執行。

碼:

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

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM