2014-05-06 3 views
6

Ich bin neu in der HttpClient-Klasse und ich habe Probleme mit der Überwachung von Anfragen mit Charles Proxy. Grundsätzlich muss ich die Anfragen überwachen, die entweder vom Simulator oder vom tatsächlichen iOS-Gerät stammen. Here können Sie ein großes Tutorial finden, wie Sie Charles für iOS-Entwicklung konfigurieren. Ich machte einfach Httpclient-Anfragen zum Beispiel nur eine einfache GenehmigungHTTP-Traffic-Überwachungsproblem bei der Verwendung von MonoTouch, HttpClient und Charles Proxy

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; 
     } 

Der Code funktioniert, der Benutzer autorisiert wird, und der Träger Token zurückgegeben wird. Aber was war das Problem, dass meine Anfragen auf dem Simulator nicht in der Charles-HTTP-Verkehrsüberwachungsliste erschienen.

Ich dachte vielleicht, es ist, weil ich Simulator verwende, aber das war nicht der Fall. Ich versuchte, die Safari zu öffnen und blätterte auf einer Webseite. Der Verkehr erschien sofort. Also das Problem war nicht vom Simulator.

Ich habe auch versucht, auf dem Gerät installieren und wieder die gleiche Geschichte, wenn Httpclient mit der Verkehrsüberwachung Bildschirm bleibt stumm, aber sobald ich den Browser zu öffnen, beginnt der Verkehr Bildschirm wackeln und alle Anfragen usurpiert.

Ich dachte, möglicherweise ist es, weil ich HTTPS verwende, obwohl in jedem Fall mindestens die Anfrage Header erfasst werden sollte, obwohl der Körper codiert ist. Aber das war nicht der Fall, ich habe versucht, auf meiner Gerätesafari eine HTTPS-Seite zu öffnen und der Verkehr erschien wieder auf meinem Charles-Bildschirm.

Das nächste, was ich tat ich heruntergeladen monotouch HttpClient sample. Und die gute Nachricht ist, dass es mehrere Methoden zum Senden von Anfragen gibt, eigentlich vier davon - 1. http WebRequest, 2. https WebRequest, 3. http NSUrlConnection, 4. HttpClient.

Und ich habe sie alle ausprobiert, wie Sie vielleicht zuerst drei perfekt in Charles, aber der letzte HttpClient wieder weiß ich weiß nicht, warum nicht im Verkehrsprotokoll Bildschirm angezeigt.

So bin ich 100% sicher, dass das Problem die HttpClient-Klasse ist, die ich nicht weiß, warum trotz der Tatsache, dass es normal funktioniert, das Senden/Empfangen von Anforderungen ist, können die Anforderungen dieser Klasse nicht von Charles gefangen genommen werden.

Und um den letzten möglichen Grund für dieses Problem auszuschließen, das ist möglicherweise das Problem in Charles ist, habe ich auch versucht, Fiddler unter Windows, die als virtuelle Maschine auf meinem Mac ausgeführt wurde (here Sie finden, wie tun, dass), die gleiche Geschichte wurde wiederholt - alle Anfragen von HttpClient gemacht wurden nicht erfasst, der Rest (WebRequests, NSUrlConnection-s, Safari Webseitenöffnungen) funktionierte einwandfrei.

Bitte, kann mir jemand vorschlagen, ob es eine Art von Bug ist, möglicherweise gibt es eine Umgehungslösung oder eine andere Lösung für dieses Problem.

Dank allen für Ihre Antworten

Mit freundlichen Grüßen Gagik

+0

Ich bin nicht sehr vertraut mit Charles Proxy, aber wenn Sie nicht funktionieren, können Sie versuchen, http://www.Runscope.com verwenden Es funktioniert als HTTP-Debugging-Vermittler und es gibt eine freier Plan. Disclaimer, ich arbeite als Entwickler für Runscope. –

Antwort

6

ist Es gibt viele Möglichkeiten HttpClient zu initialisieren. Einige Wege werden nicht mit dem Betriebssystem kommunizieren (vollständig verwaltet) und werden die iOS-Proxy-Einstellungen nicht kennen.

Die beste (für iOS) ist in der Regel den Handler zu verwenden, der CFNetwork verwendet, siehe this blog für weitere Details.Im Grunde bedeutet es:

var client = new HttpClient (CFNetworkHandler()); 

Andernfalls müssen Sie die HttpClientHandler.Proxy zu CFNetwork.GetDefaultProxy einzustellen. Z.B.

+0

Eine andere Option, wenn die Cookie-Behandlung oder ein anderes Feature, das vom normalen Handler-Verhalten abweicht, die Verwendung des "Modernen" oder nativen Handlers verhindert, ist die Verwendung von statischen Methoden in WebRequest oder WebProxy zum Abrufen der Standard/System-Proxies oder Proxies von Uri. – TheXenocide

Verwandte Themen