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得到的数据例如以下图所看到的:
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的应用程序的更多相关文章
- Azure编程笔记(1):序列化复杂类型的TableEntity字段
内容提要 在使用MicrosoftAzure的CloudTable存储数据时,我们先要把数据定义成TableEntity的子类.假设TableEntity中包括复杂类型(比方容器类型如List等.或者 ...
- C/C++编程笔记:编写完成了一个C/C++程序,如何做一个界面出来?
最简单的方法是用vc6新建一个Win32 Application空工程,然后添加一个cpp文件,输入 (注意添加对话框资源,并且在对话框上添加一个文本框) #include #include &quo ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- 远程调试 Azure Web App
当我们将 Web App 部署在 Azure 上时,如果能够实现远程调试,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.易用著称,当然可以实现基于 Azure 应 ...
- 调试 Azure 云服务项目的方法
调试 Azure 云服务项目 在菜单栏中选择“调试”>“启动调试”(键盘操作:F5). 重要提示 如果未将 Azure 云服务项目设置为启动项目,当你单击按钮以触发断点时,将出现以下错误:“外部 ...
- 远程调试 Azure 上的 Website
让我们先检查一下使用的 Azure SDK 版本和 Visual Studio 版本.根据MSDN的介绍,Azure 的远程调试功能是在 Azure SDK 2.2 中加入的,所以请确保您的机器上安装 ...
- VS 远程调试 Azure Web App
如果能够远程调试部署在 Azure 上的 Web App,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.好用著称,当然可以通吃基于 Azure 应用的创建.发布和 ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
随机推荐
- 《HTML5与CSS3基础教程(第8版)》
<HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro ...
- .NET零基础入门之02:源码控制管理器的使用
一:概述 源码控制管理器,也叫"版本控制"软件,用于存储.追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是专业软件公司的基础工具.它主要是协助在多人团队中控制代码,防 ...
- [转]关于Infobright的数据导入
FROM : http://www.mysqlsky.com/201109/infobright-data-load-error 题记 对于DW系统而言,庞大数据的迁移成本很高:所以导入和导出的速率及 ...
- ThinkPHP错误信息处理
index.php入口文件中打开APP_DEBUG// 开启调试模式define('APP_DEBUG', TRUE); // 开启Trace信息 'SHOW_PAGE_TRACE' =>tru ...
- Java的四个基本特性和对多态的理解
Java面向对象的四大基本特性:抽象.封装.继承.多态. 多态的实现方式:重载.继承.接口 Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是 ...
- Java NIO FileChannel
A Java NIO FileChannel is a channel that is connected to a file. Using a file channel you can read d ...
- 算法: 实现LRU缓存,读取、写入O(1)实现
这题应该见的不少了,写写记录一下. 实现该功能分析: (1) O(1) 时间完成查找,那除了 hash 别无选择. (2) LRU 最近最少使用算法,为了方便数据的淘汰.需要对最近访问的数据放未访问数 ...
- Nutch1.7学习笔记:基本环境搭建及使用
Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...
- ASP.NET中Session的个人浅谈
看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意 ...
- css3中webkit内核的滚动栏样式
项目其中用到的滚动栏样式,在别人的基础上调成适合自己的样式.(IE能够调试滚动栏样式,firefox眼下不能调试) ::-webkit-scrollbar { width: 14px; }/* Tra ...