使用FiddlerCore來測試WebAPI

你們在調試Web相關的API時,常常會用Fiddler來查看相關的請求,以及返回結果。固然你也能夠嘗試修改或者重複你的請求信息。本文主要介紹如何使用代碼來實現fiddler的功能。服務器

Fiddler Core API

Fiddler Core幾乎實現了你能用fiddler作的全部功能。直接在NuGet上搜索FiddlerCore便可下載FiddlerCore的.Net API。cookie

開啓Fiddler Application

使用下面的代碼來開啓FiddlerApplicationdom

FiddlerApplication.Startup(9898, FiddlerCoreStartupFlags.Default); 測試

執行後,fiddler會運行一個http代理服務器,你可使用FiddlerCoreStartupFlags.RegisterAsSystemProxy 來把這個代理服務器指定爲系統代理,這樣就能夠監聽到本機全部的http請求。網站

當程序結束的時候,記得使用下面的語句來關閉代理。加密

FiddlerApplication.Shutdown(); url

捕獲HttpRequest/HttpResponse

開啓了Fiddler Application以後,Fiddler在捕獲Request/Response的時候會觸發下面這兩個事件,你只須要定義事件來實現如何處理捕獲到的請求便可。spa

//代理

// 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,咱們一樣須要信任這個證書,相關的代碼以下:

public static bool InstallCertificate()
{
    if (!CertMaker.rootCertExists())
    {
        if (!CertMaker.createRootCert())
            return false;

        if (!CertMaker.trustRootCert())
            return false;
    }

    return true;
}

開始捕獲

使用這種方式,能夠在不改變你現有代碼的狀況下,測試你的API返回結果是否正確。下面的例子是一個用FiddlerCoreAPI來測試SharePointOnline認證是否經過的例子。

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/ 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索