[C#]如何使用fiddler來偵測httpclient發出的request細節

[C#]如何使用fiddler來偵測httpclient發出的request細節

前言

其實我一直都不是很喜歡用C#去call api,如果能用javascript去呼叫的話,我就盡量不想要再用C#包裝,除了追蹤不方便還有C#重新編譯都讓我覺得挺麻煩的,但在cors的情境之下也只能低頭,還是乖乖的用C#來呼叫,前端再呼叫自個兒寫的web api比較省事,但是每次出錯就要看看到底是自己的code錯還是遠端的api有問題,然後還得下偵錯才能看,今天在同事提醒下才發現,越來只要為httpclient設好proxy,就可以用fiddler來追蹤c#呼叫出去的request細節狀況了,接下來看一下情境狀況吧。

情境

先來寫一個簡單的測試程式碼,而這個範例是用.net core2.0寫的,請見如下示例

        [HttpGet("[action]")]
        public IActionResult Test(string ticketId)
        {
            HttpClient client = client = new HttpClient() { BaseAddress = new Uri("ip") };
            var obj = new
            {
                username = "anson.shih",
                password = "pass"
            };
            var result = client.PostAsync("/rest/auth/1/session",
                new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")).Result;
            return Ok(result);
        }

這時候當我們使用fiddler來監看的時候,是只能看到我們呼叫自己web api的request,但看不到後端程式碼發出去的,不過我們只要簡單加個HttpClientHandler,來指定proxy導回fiddler的port就可以了,預設是8888如圖下示例

接著來看一下以上面的程式碼會如何改造呢?

        [HttpGet("[action]")]
        public IActionResult Test(string ticketId)
        {
            //new 一個handler
            HttpClientHandler handler = new HttpClientHandler 
            {
                Proxy = new WebProxy("127.0.0.1", 8888),
                UseProxy = true
            };

            //把handler放到建構子裡面
            HttpClient client = client = new HttpClient(handler) { BaseAddress = new Uri("ip") };
            var obj = new
            {
                username = "anson.shih",
                password = "pass"
            };
            
            var result = client.PostAsync("/rest/auth/1/session",
                new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")).Result;
            return Ok(result);
        }

接著就可以在fiddler看到由C#發出去的request細節了