前言: 通過Fiddler抓取瀏覽器請求數據,相信大家已經都會用了,我們知道Fiddler是通過在本機計算器添加一個默認的代理服務器來實現的抓包數據的,端口號為:8888。
其實當我們打開Fiddler的設置也可以看到:
然后查看本地計算器的網絡代理設置:
基於上面的原理,Fiddler就實現了經過本機計算器請求的數據抓包了。。。
那么,我們通過C#代碼,在.net Core中使用HttpClient發送的請求,是不是也能被Fiddler抓包呢???
實際上默認情況是抓不到的,但是微軟給我們預留了一個可以配置請求代理服務器的口子,我們可以通過這個口子,來設置程序的代理服務器,
將代理服務器設置為本機:127.0.0.1,端口號設置為:8888,這樣就可以被Fiddler抓包了。 通過程序內抓包呢,我們能監控到我們發送的數據包,請求頭,Cookie,票據等等到底是什么樣的,就能分析出一些問題所在。
下面就貼出本人在.net Core3.0的框架下,測試使用程序內抓包的代碼:
1-自定義代理類:
/// <summary> /// 我的代理類 /// </summary> public class MyProxy : IWebProxy { //代理的地址 public MyProxy(Uri proxyUri) { //設置代理請求的票據 credentials = new NetworkCredential("用戶名", "密碼"); ProxyUri = proxyUri; } private NetworkCredential credentials; private Uri ProxyUri; public ICredentials Credentials { get => credentials; set => throw new NotImplementedException(); } //獲取代理地址 public Uri GetProxy(Uri destination) { return ProxyUri; // your proxy Uri } //主機host是否繞過代理服務器,設置false即可 public bool IsBypassed(Uri host) { return false; }
} }
2-使用代理發送請求:
MyProxy myProxy = new MyProxy(new Uri("http://127.0.0.1:8888")); var httpClientHandler = new HttpClientHandler() { Proxy = myProxy }; var httpClient = new HttpClient(httpClientHandler); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://www.baidu1.com"); httpClient.SendAsync(httpRequestMessage);
3-Copy2-也可以使用.net core中的注入客戶端的方法為特定命名下的客戶端統一默認添加代理:
//命名客戶端注入 services.AddHttpClient("domainServiceClient").ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler() { AllowAutoRedirect = false, UseDefaultCredentials = true, Proxy = new MyProxy(new Uri("http://127.0.0.1:8888")) }; }); //構造函數使用,使用的名稱需與命名保持一致 public HttpClient HttpClient = null; public DomainMappingMiddleware(IHttpClientFactory clientFactory) { this.HttpClient = clientFactory.CreateClient("domainServiceClient"); }
最后查看Fiddler的監控請求,可以看到我們已經抓到了請求域名為:www.baidu1.com的程序內的請求了(模擬程序內代理請求成功):