内容提要

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. 《HTML5与CSS3基础教程(第8版)》

    <HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro    ...

  2. .NET零基础入门之02:源码控制管理器的使用

    一:概述 源码控制管理器,也叫"版本控制"软件,用于存储.追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是专业软件公司的基础工具.它主要是协助在多人团队中控制代码,防 ...

  3. [转]关于Infobright的数据导入

    FROM : http://www.mysqlsky.com/201109/infobright-data-load-error 题记 对于DW系统而言,庞大数据的迁移成本很高:所以导入和导出的速率及 ...

  4. ThinkPHP错误信息处理

    index.php入口文件中打开APP_DEBUG// 开启调试模式define('APP_DEBUG', TRUE); // 开启Trace信息 'SHOW_PAGE_TRACE' =>tru ...

  5. Java的四个基本特性和对多态的理解

    Java面向对象的四大基本特性:抽象.封装.继承.多态. 多态的实现方式:重载.继承.接口 Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是 ...

  6. Java NIO FileChannel

    A Java NIO FileChannel is a channel that is connected to a file. Using a file channel you can read d ...

  7. 算法: 实现LRU缓存,读取、写入O(1)实现

    这题应该见的不少了,写写记录一下. 实现该功能分析: (1) O(1) 时间完成查找,那除了 hash 别无选择. (2) LRU 最近最少使用算法,为了方便数据的淘汰.需要对最近访问的数据放未访问数 ...

  8. Nutch1.7学习笔记:基本环境搭建及使用

    Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...

  9. ASP.NET中Session的个人浅谈

    看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意 ...

  10. css3中webkit内核的滚动栏样式

    项目其中用到的滚动栏样式,在别人的基础上调成适合自己的样式.(IE能够调试滚动栏样式,firefox眼下不能调试) ::-webkit-scrollbar { width: 14px; }/* Tra ...