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

时间:2014-05-06 10:26:44

标签: ios https xamarin.ios dotnet-httpclient charles-proxy

我是HttpClient类的新手,我遇到了使用Charles Proxy监控请求的问题。基本上我需要的是监视从模拟器或实际iOS设备发出的请求。 Here您可以找到有关如何配置Charles 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;
        }

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

我想也许,这是因为我使用的是模拟器,但事实并非如此。我尝试打开野生动物园并浏览了一些网页,流量立刻出现了。所以问题不在于模拟器。

我也尝试在设备上安装,同样的故事,当使用HttpClient时,流量监控屏幕保持静音,但是一旦我打开浏览器,流量屏幕开始摇摆并篡夺所有请求。

我想可能是因为我使用HTTPS,尽管在任何情况下都应该捕获请求标头,即使正文是编码的。但事实并非如此,我尝试在我的设备游戏中打开一些HTTPS站点,然后再次出现在我的Charles屏幕上。

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

我尝试了所有这些,因为你可能会猜到前三个完全出现在查尔斯,但最后一个HttpClient再次我不知道为什么没有出现在交通日志屏幕上。

所以我100%确定问题是HttpClient类,我不知道为什么尽管它正常工作,即发送/接收请求,但是由此发出的请求查尔斯无法捕捉到这一课程。

为了排除这个问题的最后一个可能原因,那可能是问题在于Charles,我也尝试在Windows上使用Fiddler,它在我的Mac上作为虚拟机运行(here你可以找到该怎么做),同样的故事被重复 - HttpClient提出的所有请求都没有被捕获,其余的(WebRequests,NSUrlConnection-s,safari网页开放)工作得很好。

拜托,任何人都可以建议我,无论是某种错误,可能有解决方法或解决此问题的其他方法。

感谢所有回复

亲切的问候Gagik

1 个答案:

答案 0 :(得分:6)

有很多方法可以初始化HttpClient。有些方法不会与操作系统(完全托管)交谈,也不会知道iOS代理设置。

最好(对于iOS)通常使用使用CFNetwork的处理程序,有关详细信息,请参阅this blog。基本上它意味着:

var client = new HttpClient (CFNetworkHandler ());

否则,您需要将HttpClientHandler.Proxy设置为CFNetwork.GetDefaultProxy。 E.g。

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