使用MonoTouch,HttpClient和Charles Proxy时出现HTTPstream量监控问题

我是HttpClient类的新手,并且遇到了使用Charles Proxy监视请求的问题。 基本上我需要的是监视从模拟器或实际的iOS设备进行的请求。 在这里你可以find一个关于如何configurationCharles for iOS开发的很好的教程。 我正在做简单的HttpClient请求,只是一个简单的授权

async Task<string> authorizeUser() { HttpClient _client = new HttpClient (); _client.BaseAddress = new Uri("https://...../api/"); _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue ("bearer", token); var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("grant_type", "password"), new KeyValuePair<string, string>("username", "theUserName"), new KeyValuePair<string, string>("password", "thePassword") }); var result = await _client.PostAsync("auth", content); string resultContent = result.Content.ReadAsStringAsync().Result; return resultContent; } 

代码工作,用户正在授权,不记名令牌正在返回。 但是,问题是什么,我的模拟器上的请求没有出现在查尔斯httpstream量监控列表中。

我想也许是因为我在使用模拟器,但事实并非如此。 我试图打开Safari浏览器,浏览一些网页,交通立即出现。 所以这个问题不是来自模拟器。

我也尝试在设备上安装,并再次使用HttpClient时,同样的故事,stream量监控屏幕保持沉默,但只要我打开浏览器,交通屏幕开始抖动和篡夺所有的请求。

我以为可能是因为我使用HTTPS,尽pipe在任何情况下,至less应该捕获请求头,即使身体编码。 但事实并非如此,我试着在我的设备Safari浏览器上打开一些HTTPS站点,并再次出现在我的Charles屏幕上。

接下来我做了下载montouch的HttpClient示例 。 而好消息是有几种发送请求的方法,实际上有四种 – 1. http WebRequest,2. https WebRequest,3. http NSUrlConnection,4. HttpClient。

我试了一下,就像你猜猜前三个完全出现在查尔斯,但是最后一个HttpClient又不知道为什么没有出现在交通日志屏幕上。

所以我100%肯定这个问题是HttpClient类,我不知道为什么尽pipe它正常工作,即发送/接收请求,这个类的请求不能被查尔斯捕获。

并排除这个问题的最后一个可能的原因,这可能是问题是在查尔斯,我也尝试使用Windows上的Fiddler,这是作为一个虚拟机在我的Mac上运行( 在这里你可以find如何做到这一点),重复了同样的故事–HttpClient所做的所有请求都没有被捕获,剩下的(WebRequests,NSUrlConnection-s,safari网页开放)工作得很好。

请有人build议我,不pipe是某种错误,可能是解决方法或解决方法。

谢谢你的回复

亲切的问候Gagik

有很多方法来初始化HttpClient 。 有些方法不会与操作系统交stream(完全托pipe),也不会意识到iOS代理设置。

最好的(对于iOS)通常使用使用CFNetwork的处理程序,请参阅此博客以获取更多详细信息。 基本上这意味着:

 var client = new HttpClient (CFNetworkHandler ()); 

否则,你需要将HttpClientHandler.Proxy设置为CFNetwork.GetDefaultProxy 。 例如

 var handler = new HttpClientHandler { Proxy = CFNetwork.GetDefaultProxy (), UseProxy = true, }; var client = new HttpClient(handler);