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为了优化性能,每一次相应请求时最多只返回1000个TableEntity。如果TableEntity的总数超过1000个,客户端需要重新发送请求。

解决问题

在两个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-NextPartitionKey和x-ms-continuation-NextRowKey两个字段,表明所有的TableEntity都已经返回了。

附录

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

Azure编程笔记(3):用Fiddler调试Azure的应用程序,布布扣,bubuko.com

时间: 2024-10-13 19:57:50

Azure编程笔记(3):用Fiddler调试Azure的应用程序的相关文章

Azure编程笔记(5):长时间的异步操作带来的问题

?? 内容提要 Azure Storage里很多操作需要花费很长的时间.为了提高效率,这些耗时的操作是以异步的方式响应的.也就是说调用这些操作对应的函数虽然结束,但背后的操作可能还要持续一段时间.如果没有合理的对待从函数返回到操作真正结束这段时间,我们的程序就有可能出现问题.下面以删除CloudTable为例讨论这类问题. 问题描述 我们写一个简单的单元测试的Class来重现这个问题.首先我们定义两个函数,分别用来初始化测试函数和清理测试函数所留下的数据.函数InitializeTest初始化一

Azure编程笔记(4):管理Cloud Service的证书

?? 我们在Microsoft Azure中部署CloudService的时候,可能会用到证书.通常在两种情况下需要用到证书.一是把证书安装在服务器端.此时证书用来建立HTTPS/SSL连接,以便保护传输中的数据.二是把证书部署在客户端.此时客户端发起连接请求时,它会把证书信息添加到请求中.服务器端收到请求之后,会验证其中的证书是不是合法的证书.这种情况下证书是用来验证用户的.接下来我们分两种情况来讨论如何管理证书. 把证书安装在服务器端 假设我们用ASP .NET的Web API开发一个Web

Azure编程笔记(1):序列化复杂类型的TableEntity字段

内容提要 在使用MicrosoftAzure的CloudTable存储数据时,我们先要把数据定义成TableEntity的子类.如果TableEntity中包含复杂类型(比如容器类型如List等.或者自定义类型)的字段,这些字段需要自己做序列化才能保存到CloudTable中去. 问题描述 我们模拟社交网站定义一个类型Account,它包含一个账户的基本信息如果邮箱.姓名.生日等等,同时它还包含一个账户的好友列表: public class Account : TableEntity { pub

Azure编程笔记(2):重复CloudTable的修改操作

内容提要 对MicrosoftAzure的CloudTable进行操作,有很多种操作失败的可能,比如网络连接异常,比如短时间内发送的请求数太多.很多时候我们在失败之后过一段时间再重试,就能操作成功.但是有些失败不是简单重试就解决的.本文讲述的在修改操作时候发生的PreconditionFailed错误就是一个例子. 问题描述 在上一篇博客里,我们定义一个类型Account,用来模拟社交网站的账户基本信息.这里我们继续用这个类型为例子来讲述多个线程同时发送更新请求时可能发生的问题. 我们首先用如下

远程调试 Azure 上的 Website

让我们先检查一下使用的 Azure SDK 版本和 Visual Studio 版本.根据MSDN的介绍,Azure 的远程调试功能是在 Azure SDK 2.2 中加入的,所以请确保您的机器上安装了2.2或者是更新的 Azure SDK. 关于 Visual Studio 的版本问题,MSDN上的描述也很有趣.大意是使用 Visual Studio 2012 已经可以远程调试 Azure 上的 Website 了,但是 Visual Studio 2013 又对此做了很多的提升.个人理解最好

远程调试 Azure Web App

当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应用的创建.发布和调试.接下来就让我们一起看看如何使用 Visual Studio 远程调试部署在 Azure 上的 Web App,以及一些常见的注意事项. 文章来源:葡萄城产品技术社区 注意工具的版本 在开始正文前让我们先检查一下使用的 Azure SDK 版本和 Visual Studio 版本

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

storysnail的Linux串口编程笔记

storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 GPLv3 许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html 本文档根据GNU Free Documentation License 1.3发布 GFDL1.3许可证的副本可以在这里获得:http://w