HTTP流量监控问题时,使用MonoTouch, HttpClient和查尔斯代理



我是新的HttpClient类,我有使用查尔斯代理监控请求的问题。基本上我需要的是监控来自模拟器或实际iOS设备的请求。在这里你可以找到一个关于如何为iOS开发配置Charles的很棒的教程。例如,我正在制作简单的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;
        }

代码工作,用户正在被授权,并且返回承载令牌。但是问题是什么,我在模拟器上的请求没有出现在查尔斯http流量监控列表中。

我想也许,这是因为我使用模拟器,但事实并非如此。我试着打开safari浏览器,浏览一些网页,流量立刻出现了。所以问题不是来自模拟器。

我也试着在设备上安装,同样的故事,当使用HttpClient的流量监控屏幕保持沉默,但只要我打开浏览器,流量屏幕开始抖动和篡位所有的请求。

我认为可能是因为我使用HTTPS,尽管在任何情况下至少应该捕获请求头,即使主体是编码的。但事实并非如此,我试着在我的设备safari上打开一些HTTPS网站,流量再次出现在我的Charles屏幕上。

我做的下一件事是下载了monotouch HttpClient示例。好消息是有几种发送请求的方法,实际上有四种1. http WebRequest,2. https WebRequest,3.http NSUrlConnection;4. HttpClient。

我都试过了,正如你可能猜到的,前三个完美地出现在charles中,但是最后一个HttpClient,我不知道为什么没有出现在流量日志屏幕上。

所以我100%肯定问题是HttpClient类,我不知道为什么尽管它正常工作,即发送/接收请求,该类发出的请求不能被Charles捕获。

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

请,谁能给我建议,无论是某种bug,可能有解决这个问题的方法或其他解决方案。

谢谢大家的回复

亲切问候Gagik

初始化HttpClient的方法有很多。有些方式不会与操作系统对话(完全管理),并且不会意识到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);

最新更新