【转】使用FiddlerCore来测试WebAPI

大家在调试Web相关的API时,经常会用Fiddler来查看相关的请求,以及返回结果。当然你也可以尝试修改或者重复发送你的请求信息。本文主要介绍如何使用代码来实现fiddler的功能。

Fiddler Core API

Fiddler Core几乎实现了你能用fiddler做的所有功能。直接在NuGet上搜索FiddlerCore即可下载FiddlerCore的.Net API。

开启Fiddler Application

使用下面的代码来开启FiddlerApplication

FiddlerApplication.Startup(9898, FiddlerCoreStartupFlags.Default);

执行后,fiddler会运行一个http代理服务器,你可以使用FiddlerCoreStartupFlags.RegisterAsSystemProxy 来把这个代理服务器指定为系统代理,这样就可以监听到本机所有的http请求。

当程序结束的时候,记得使用下面的语句来关闭代理。

FiddlerApplication.Shutdown();

捕获HttpRequest/HttpResponse

开启了Fiddler Application之后,Fiddler在捕获Request/Response的时候会触发下面这两个事件,你只需要定义事件来实现如何处理捕获到的请求即可。

//

// Summary:

// This event fires when a client request is received by Fiddler

public static event SessionStateHandler BeforeRequest;

//

// Summary:

// This event fires when a server response is received by Fiddler

public static event SessionStateHandler BeforeResponse;

安装证书

那么如何捕获https协议的页面呢?众所周知,https通过通信证书来实现了服务器端和客户端的加密,避免通信过程被监听。Fiddler通过中间人的方式来实现https协议的捕获,所谓中间人就是Fiddler注入到应用程序和服务器的中间,fiddler相对于服务器扮演客户端的角色,相对于客户端扮演服务器的角色,既然fiddler需要扮演服务器的角色,就需要一个证书,并且你的客户端需要信任Fiddler的证书。我们以中国银行的网站为例:

不开启Fiddler登陆网银时,证书信息为:

 

开启Fiddler登陆网银后证书信息为:

由于我的机器已经信任过Fiddler的证书,我们可以发现,在开启了Fiddler后,和中行网银的通信证书变为了:DO_NOT_TRUST_FiddlerRoot。如果使用FiddlerCore,我们同样需要信任这个证书,相关的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

public static bool InstallCertificate()

{

    if (!CertMaker.rootCertExists())

    {

        if (!CertMaker.createRootCert())

            return false;

 

        if (!CertMaker.trustRootCert())

            return false;

    }

 

    return true;

}

开始捕获

使用这种方式,可以在不改变你现有代码的情况下,测试你的API返回结果是否正确。下面的例子是一个用FiddlerCoreAPI来测试SharePointOnline认证是否通过的例子。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

using Fiddler;

using Microsoft.SharePoint.Client;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Net;

using System.Security;

using System.Text;

using System.Threading.Tasks;

 

namespace FiddlerCoreTest

{

    class Program

    {

        static void Main(string[] args)

        {

            ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

 

            FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;

            FiddlerApplication.BeforeResponse += FiddlerApplication_BeforeResponse;

            FiddlerApplication.Startup(9898, FiddlerCoreStartupFlags.Default | FiddlerCoreStartupFlags.RegisterAsSystemProxy);

            try

            {

                ClientContext context = new ClientContext("https://domain.sharepoint.com");

 

                SecureString se = new SecureString();

                foreach (var cc in "password")

                {

                    se.AppendChar(cc);

                }

 

                var cre = new SharePointOnlineCredentials("user@domain.onmicrosoft.com", se);

                var cookie = cre.GetAuthenticationCookie(new Uri("https://domain.sharepoint.com"));

            }

            catch (Exception e)

            {

 

            }

 

            FiddlerApplication.Shutdown();

            Console.ReadLine();

        }

 

        static void FiddlerApplication_BeforeResponse(Session oSession)

        {

            //想如何改写Response信息在这里随意发挥了

            Console.WriteLine("BeforeResponse: {0}", oSession.responseCode);

        }

 

        static void FiddlerApplication_BeforeRequest(Session oSession)

        {

            //想如何改写Request信息在这里随意发挥了

            Console.WriteLine("BeforeRequest: {0}, {1}", oSession.fullUrl, oSession.responseCode);

        }

    }

}

  

 


作者:独上高楼
出处:http://www.cnblogs.com/myprogram/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab lmi 定义一个任意方阵,matlab中LMI应用说明

我们要实现的就利用LMI进行求解。首先我们要用setlmis([])命令初始化一个LMI系统。接下来,我们就要设定矩阵变量了。采用函数为lmivar语法:X lmivar(type,struct)type1: 定义块对角的对称矩阵。每一个对角块或者是全矩阵,标量,或…

想学C#很久了。

去年年底我就想着学C#了,还计划着两个星期学熟他,因为工作二年了,原来一直搞些ASP,有些基础,后来来这个公司,全部是用在asp.net环境下C#做后台开发的,同事兼密友陶成比我来得早许多,…

【转】程序在内存中的分布

前些天学习到了程序在虚拟内存中分布的一些知识点,结合在网上查阅的一些资料,整理一下知识点。本博客参考博主 hackbuteer1的《程序在内存中的分布》这篇文章。 v 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲&#x…

php怎么创建进程,在php中为长时间运行的进程创建后台进程

好的,请原谅我,如果这是另一个问题的重复,但在搜索后我还没有找到一个明确的答案.我基本上想要做的是让我的php web应用程序触发一些事件(如电子邮件或报告生成器)可能需要几分钟才能完成并立即将控制权返回给页面.我来自.NET世界,可以通过线程轻松完成.所以这是工作流程&#…

GARFIELD@04-02-2005

treat 转载于:https://www.cnblogs.com/rexhost/archive/2005/04/02/130985.html

【转】TechEd第一课:新一代关系管理系统XRM**

提起微软的CRM产品,最先想到的是CRM 4.0。除了字面理解上的客户关系管理系统外,微软也赋予这款产品“应用开发平台”的角色,并给它一个新名字——XRM。XRM到底是什么东西?它能用来做什么?这些问题都在今天这节“微软新…

linux打包启动这着的文件,linux – 打开一个RPM文件并重新打包它

修改您没有源的RPM的最佳方式是按照以下步骤操作:>使用rpm2cpio命令将rpm解压缩到目录中>在该子目录内进行必要的更改制作一个“虚拟”规范文件并构建它.该虚拟规范文件可能如下所示:Name: blahVersion: 1.0Release: 1Summary: blahLicense: blahD…

学习Java的相关知识

工作的原因现在学习Java极其相关的技术,包括JBoss,Struts,JSP,EJB等. 感觉Java的库比较多,但做的真的一般,易用性很差,编程也非常的“片断”性,不像.NET思想连贯性强。可能是才学习几天的缘故吧。 Java的throws我很讨厌,我觉得绝对是个设计的错误。 转载…

【转】ASP.NET 2.0 - 导航(Navigation)SiteMap导航菜单关系

ASP.NET 2.0 拥有内建的导航控件。 网站导航 维护大型站点的导航菜单是很困难,也很费时的。 在 ASP.NET 2.0 中,菜单可存储在文件中,这样维护起来更加方便。这个文件通常名为 web.sitemap,被存放在网站的根目录中。 此外&…

Up or out!!!

近日获知浙江大学计算中心被撤销,心里感慨万千。忽然想起前几天听到的一句话:Up or out!如是而已。转载于:https://www.cnblogs.com/pipisong/archive/2005/06/14/174099.html

linux内核的邻居表,Linux内核报文收发-L3 - Section 3. IP协议、邻居子系统主要是接收、转发和发送三部分...

版本说明Linux版本: 3.10.103网卡驱动: ixgbe网络协议注册inet_init主要是注册各种协议注册TCP协议proto_register(&tcp_prot, 1)继续注册UDP、RAW、PINGarp_init, ip_init, tcp_init, udp_init, ping_init, icmp_initdev_add_pack(&ip_packet_t…

【转】EntityFramework使用Code First模式创建数据库控制生成单数形式的表名

使用Code-First模式生成数据库时,默认生成的数据库表的名称为类型的复数形式,例如实体类名称是"User",默认生成的数据库表名为“Users”,多数情况下我们并不想生成的数据库表名为复数形式,那么应该如何来控制…

0803

“同”表示完全相同的产品。产品后的数字是价钱。AMD的CPU只能配AMD的主板,INTEL亦然。在最后,给出了一5500元的液晶家用配置 -----------------CPUINTEL Celeron D 331(散装) /600AMD Sempron 2600(754盒装&#xff0…

linux grep子目录,linux grep搜索文件中的字符串

从文件中查找关键词grep linux text.txt //查找包含 linux的关键词[rootlocalhost ~]# grep root /etc/grouproot:x:0:rootbin:x:1:root,bin,daemon从多个文件中查找关键词[rootlocalhost ~]# grep root /etc/group /etc/my.cnf/etc/group:root:x:0:root/etc/my.cnf:user root…

【转】云服务器cvm 云服务器ecs区别

1、全称 cvm的英文全拼是 Cloud Virtual Machine (云虚拟机) ecs的英文全拼是 Elastic Compute Service(弹性计算服务) 2、对比 云服务器cvm是普遍的虚拟云服务器统称,是一种简单高效、安全可靠、处理能…

linux make怎么运行,Linux Make 命令教程

原标题:Linux Make 命令教程来自:阮一峰的网络日志链接:www.ruanyifeng.com/blog/2015/02/make.html代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(…

快速了解c#中的索引器

快速了解c#中的索引器 C#中的索引器是新增加的,和属性有些不同。在c#中,属性可以是这样的:class Person {private string firstname;public string FirstName {get {return firstname;}set {firstname value;}}} 属性声明可以如下编码&#…

【转】C#运算符重载**

https://www.yiibai.com/csharp/csharp_operator_overloading.html 在C#中,可以重新定义或重载大多数内置运算符。 因此,程序员也可以使用具有用户定义类型的运算符。重载运算符是具有特殊名称的功能,关键字operator后跟定义运算符的符号。 类…

图形工具包 linux,GTK 4.0图形工具包正式发布:时隔四年的重大版本!

GTK是用于创建图形用户界面的工具包,GTK提供了一整套的小部件,适用于从小型一次性工具到完整的应用程序套件的项目。GTK是GNOME开发平台的核心,但是它也可以用于编写其他Linux环境的应用程序,以及针对微软Windows和苹果macOS的应用…

引用到网站绝对路径Server.MapPath(~/myfile.mdb)

在任何路径下,都可以用Server.MapPath("~/")引用到网站根目录下 转载于:https://www.cnblogs.com/yurichou/archive/2005/10/17/256357.html