内容提要

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得到的数据例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FkY2lzZGhodA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

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

CloudTable为了优化性能,每一次对应请求时最多仅仅返回1000个TableEntity。假设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-NextPartitionKey和x-ms-continuation-NextRowKey两个字段,表明全部的TableEntity都已经返回了。

附录

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

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

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

    内容提要 在使用MicrosoftAzure的CloudTable存储数据时,我们先要把数据定义成TableEntity的子类.假设TableEntity中包括复杂类型(比方容器类型如List等.或者 ...

  2. C/C++编程笔记:编写完成了一个C/C++程序,如何做一个界面出来?

    最简单的方法是用vc6新建一个Win32 Application空工程,然后添加一个cpp文件,输入 (注意添加对话框资源,并且在对话框上添加一个文本框) #include #include &quo ...

  3. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  4. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  5. 远程调试 Azure Web App

    当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应 ...

  6. 调试 Azure 云服务项目的方法

    调试 Azure 云服务项目 在菜单栏中选择“调试”>“启动调试”(键盘操作:F5). 重要提示 如果未将 Azure 云服务项目设置为启动项目,当你单击按钮以触发断点时,将出现以下错误:“外部 ...

  7. 远程调试 Azure 上的 Website

    让我们先检查一下使用的 Azure SDK 版本和 Visual Studio 版本.根据MSDN的介绍,Azure 的远程调试功能是在 Azure SDK 2.2 中加入的,所以请确保您的机器上安装 ...

  8. VS 远程调试 Azure Web App

    如果能够远程调试部署在 Azure 上的 Web App,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.好用著称,当然可以通吃基于 Azure 应用的创建.发布和 ...

  9. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

随机推荐

  1. js混淆代码还原-js反混淆:利用js进行赋值实现

    js混淆代码还原-js反混淆:利用js进行赋值实现   [不想用工具的直接看方法二] 本文地址:http://www.cnblogs.com/vnii/archive/2011/12/14/22875 ...

  2. PyCharm 配置远程python解释器

    配置过程 本机环境 操作系统:win10 IDE:Pycharm 远程服务器 操作系统:ubuntu14.04 配置了ssh,可以使用ssh进行远程登陆 配置Deployment 首先,在pychar ...

  3. 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang

    点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...

  4. 数据库实例: STOREBOOK > 用户 > 编辑 用户: SYSMAN

    ylbtech-Oracle:数据库实例: STOREBOOK  >  用户  >  编辑 用户: SYSMAN 编辑 用户: SYSMAN 1. 一般信息返回顶部 1.1,   1.2, ...

  5. Hadoop streaming 排序、分桶参数设置

    编写hadoop任务经常需要用到partition和排序.这里记录一下几个参数. 1. 概念 Partition:分桶过程,用户输出的key经过partition分发到不同的reduce里,因而par ...

  6. 南阳ACM8-一种排序

    /* 一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽 都是 ...

  7. ubuntu下nodejs开发环境搭建

    1.安装nodejs sudo apt install -y nodejs 2.更新npm到最新版本 sudo npm i -g npm 3.npm配置为淘宝镜像 sudo npm config se ...

  8. IntelliJ IDEA windows与mac下常用快捷键

    摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...

  9. Android -- ConditionVariable

    线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步.提供了三个方法block().open().close() ...

  10. jedis 连接 redis:Could not get a resource from the pool——我的出错原因和解决办法

    windows 下安装的,本机使用 现象:刚装好开发使用好好的, 重启电脑后就报这个错 网上的所有可能都试过,没有用. 最后,放弃所有包装,用最原始的代码进行连接测试: Jedis jedis=new ...