zoukankan      html  css  js  c++  java
  • Azure编程笔记(3):用Fiddler调试Azure的应用程序

    

    内容提要

    Azure的服务是通过RESTfulAPI提供的。

    尽管Azure针对非常多编程语言都提供了SDK。但这些SDK也仅仅是RESTfulAPI的一层封装。

    在调用SDK或者RESTfulAPI出错时,我们须要使用调试工具来分析并解决这个问题。

    Fiddler是一款功能强大的免费工具。我们能够使用Fiddler来调试Azure的应用程序。本文展示怎样用Fiddler调试一个常见的訪问Storage的问题。

    问题描写叙述

    在前面的两篇博客中,我们模拟社交站点定义了一个Account类型。

    本文我们继续以Account类型作为样例。

    首先我们用例如以下代码加入2048个账号:

    static async Task TestAddAccountBatch()
    {
        string connectionString = Constant.connectionString;
        var storageAccount = Utilities.GetStorageAccount(connectionString);
        var accountsTable = new AccountsTableWrapper(storageAccount);
    
        List<Account> accounts = new List<Account>();
        for(int i = 0; i < 2048; ++i)
        {
            string name = string.Format("Test{0,4:0000}", i);
            string email = name + "@hotmail.com";
    
            Account account = new Account(email, name);
            accounts.Add(account);
        }
    
        await accountsTable.AddAccountBatch(accounts);
    }
    

    接着我们用例如以下代码得到账户的总数:

    static void TestRetriveAll()
    {
        string connectionString = Constant.connectionString;
        var storageAccount = Utilities.GetStorageAccount(connectionString);
        var accountsTable = new AccountsTableWrapper(storageAccount);
        List<Account> accounts = accountsTable.GetAllAccounts();
        Console.WriteLine(accounts.Count);
    }
            
    public List<Account> GetAllAccounts()
    {
        TableQuery<Account> query = new TableQuery<Account>()
            .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, Account.AccountsPartitionKey));
    
        List<Account> accounts = new List<Account>();
        TableContinuationToken continueToken = null;
        var response = this.accountsTable.ExecuteQuerySegmented(query, continueToken);
        accounts.AddRange(response);
        return accounts;
    }
    

    执行代码,我们发现得到的账号总数仅仅有1000,并非期待的2048


    问题根源

    假设我们用Fiddler抓取该应用程序的网络请求以及得到的回复,Fiddler得到的数据例如以下图所看到的:


    我们注意到在收到的HTTP回复的头中。有一个字段叫x-ms-continuation-NextPartitionKey,另一个字段叫x-ms-continuation-NextRowKey。这提示我们。查询CloudTable事实上并没有结束,我们应该依据这两个字段继续查询CloudTable

    CloudTable为了优化性能,每一次对应请求时最多仅仅返回1000TableEntity。假设TableEntity的总数超过1000个,client须要又一次发送请求。


    解决这个问题

    在两个HTTP头中的字段在SDK中用类型TableContinuationToken封装了。

    我们能够对代码做例如以下改动来解决这个问题:

    public List<Account> GetAllAccounts()
    {
        TableQuery<Account> query = new TableQuery<Account>()
            .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, Account.AccountsPartitionKey));
    
        List<Account> accounts = new List<Account>();
        TableContinuationToken continueToken = null;
        do
        {
            var response = this.accountsTable.ExecuteQuerySegmented(query, continueToken);
            accounts.AddRange(response);
            continueToken = response.ContinuationToken;
        }
        while(continueToken != null);
        return accounts;
    }
    

    TableContinuationToken不为null。表明还有很多其它的TableEntity,我们还须要执行很多其它的查询操作。此时执行改动过的代码,将得到正确的账号总数2048

    假设我们用Fiddler抓取该应用程序发送的HTTP请求和收到的回复,我们会注意到实际上一共发送了3个请求:

    第三个请求相应的回复例如以下所看到的:

    我们注意到此时回复的头部,已经没有x-ms-continuation-NextPartitionKeyx-ms-continuation-NextRowKey两个字段,表明全部的TableEntity都已经返回了。


    附录

    Fiddler是一款免费的软件,能够用来监视网络通讯时的请求与回复,是一个调试网络程序的利器。感兴趣的读者能够到http://www.telerik.com/download/fiddler处下载。


  • 相关阅读:
    Codeforces Round #652 (Div. 2)
    Codeforces Round #651 (Div. 2)
    The 2017 China Collegiate Programming Contest, Qinhuangdao Site
    2017中国大学生程序设计竞赛-哈尔滨站
    Codeforces Global Round 8
    [CF768D] Jon and Orbs
    2020牛客暑期多校训练营(第一场)I
    2020牛客暑期多校训练营(第一场)F
    [HDU5769] Substring
    [PA2010] Riddle
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7384277.html
Copyright © 2011-2022 走看看