内容提要

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. 关于Spring-Data-Jpa的一些理解

    spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管 ...

  2. Cannot convert type SomeClass to 'T'

    以下代码会出问题: public static T Protect<T>(Func<T> func, UserLevel pageRole) where T : ActionR ...

  3. 整理:FPGA选型

    针对性整理下FPGA选型问题 一.获取芯片资料: 要做芯片的选型,首先就是要对有可能要面对的芯片有整体的了解,也就是说要尽可能多的先获取芯片的资料.现在FPGA主要有4个生产厂家,ALTERA,XIL ...

  4. android linux 内核层

    Android依赖于Linux2.6内核提高的高核心系统服务,例如安全,内存管理,进程管理,网络斎等等方面内容.内核作为一个抽象层,存在与硬件层和软件层之间.android对Linux下面内容做了增强 ...

  5. 设置虚拟机IP

    重启虚拟机 重启后,查看虚拟机IP ip a 虚拟机已有自己的IP 输入虚拟机用户

  6. [转]学习块格式化上下文(BlockFormattingContext)

    原文:https://www.cnblogs.com/elcarim5efil/p/4745796.html   格式化上下文 格式化上下文( formatting contexts )├── 块级格 ...

  7. TCP Socket Programming in Node.js

    TCP Socket Programming in Node.js Posted on October 26th, 2011 under Node.jsTags: Client, node.js, S ...

  8. OpenGL ES 3.0之顶点缓冲

    所谓顶点缓冲就是直接将顶点数据存储在gpu的一段缓冲区,不需要从cpu拷贝到gpu.提高了程序的运行效率. 操作步骤 1.创建顶点缓冲对象 GLuint vertexBufferID; 2.分配空间 ...

  9. Python代码规范(PEP8)问题及解决

    转载:https://blog.csdn.net/Jason_Lewis/article/details/75386598 最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代 ...

  10. VMware 安装Arch Linux记录

    首先说明一下我的环境. 1.VMware Workstation 10.0.1 build-1379776 2.archlinux-2014.02.01-dual.iso 首先建立虚拟机,其他的不提了 ...