Ошибка мониторинга HTTP-трафика при использовании MonoTouch, HttpClient и Charles Proxy

Я новичок в классе HttpClient, и у меня возникли проблемы с мониторингом запросов с использованием Charles Proxy. По сути, мне нужно отслеживать запросы, которые делаются либо с симулятора, либо с реального устройства iOS. Здесь вы можете найти большое руководство по настройке Charles для разработки под 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;
        }

Код работает, пользователь авторизуется, а токен-носитель возвращается. Но в чем проблема, что мои запросы на симуляторе не появлялись в списке мониторинга трафика Чарльза http.

Я подумал, возможно, это потому, что я использую симулятор, но это был не тот случай. Я попытался открыть сафари и просмотрел какую-то веб-страницу, и тут же появился трафик. Так что проблема была не с симулятора.

Я также попытался установить на устройстве, и снова та же история, когда с помощью HttpClient экран мониторинга трафика остается тихим, но как только я открываю браузер, экран трафика начинает покачиваться и узурпировать все запросы.

Я подумал, может быть, это потому, что я использую HTTPS, хотя в любом случае, по крайней мере, заголовок запроса должен быть захвачен, даже если тело закодировано. Но это было не так, я попытался открыть сайт HTTPS на моем устройстве Safari, и снова трафик появился на экране Чарльза.

Следующее, что я сделал, я скачал монотуш образец HttpClient. И хорошая новость заключается в том, что существует несколько методов отправки запросов, фактически четыре из них - 1. http WebRequest, 2. https WebRequest, 3. http NSUrlConnection, 4. HttpClient.

И я попробовал их все, как вы можете догадаться, первые три отлично появились в charles, но последний HttpClient снова не знаю, почему не появился на экране журнала трафика.

Так что я на 100% уверен, что проблема в классе HttpClient, и я не знаю, почему, несмотря на то, что он работает нормально, то есть отправляет / получает запросы, запросы, сделанные этим классом, не могут быть перехвачены Чарльзом,

И чтобы исключить последнюю возможную причину этой проблемы, которая может быть связана с Чарльзом, я также попытался использовать Fiddler в Windows, которая работала как виртуальная машина на моем Mac ( здесь вы можете найти, как это сделать), та же самая история была повторена - все запросы, сделанные HttpClient, не были перехвачены, остальные (WebRequests, NSUrlConnection-s, открытия веб-страниц сафари) работали отлично.

Пожалуйста, кто-нибудь может подсказать мне, является ли это какой-то ошибкой, может быть, есть обходной путь или другое решение этой проблемы.

Спасибо всем за ваши ответы

С уважением, Гагик

1 ответ

Решение

Есть много способов инициализации 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);
Другие вопросы по тегам