2014-05-06 13 views
6

Sono nuovo alla classe HttpClient e sto avendo problemi con le richieste di monitoraggio utilizzando Charles Proxy. Fondamentalmente ciò di cui ho bisogno è di monitorare le richieste che vengono fatte sia dal simulatore che dal dispositivo iOS reale. Here puoi trovare un ottimo tutorial su come configurare lo sviluppo di Charles per iOS. Stavo facendo semplici richieste HttpClient per esempio, una semplice autorizzazioneProblema di monitoraggio del traffico HTTP quando si utilizzano MonoTouch, HttpClient e 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; 
     } 

Il codice funziona, l'utente viene autorizzato, e il token portatore viene restituita. Ma quale era il problema, che le mie richieste sul simulatore non comparivano nella lista di monitoraggio del traffico di Charles http.

Ho pensato che forse è perché sto usando il simulatore, ma non era così. Ho provato ad aprire il safari e ho sfogliato alcune pagine web e il traffico è apparso immediatamente. Quindi il problema non era dal simulatore.

Ho anche provato ad installare sul dispositivo, e di nuovo la stessa storia, quando si utilizza HttpClient lo schermo di monitoraggio del traffico rimane silenzioso, ma non appena apro il browser, lo schermo del traffico inizia a tremare e usurpando tutte le richieste.

Ho pensato che potrebbe essere perché utilizzo HTTPS, anche se in ogni caso l'intestazione della richiesta deve essere acquisita, anche se il corpo è codificato. Ma non è stato il caso, ho provato ad aprire qualche sito HTTPS sul mio dispositivo di safari e di nuovo il traffico è apparso sul mio schermo Charles.

La prossima cosa che ho fatto ho scaricato monotouch HttpClient sample. E la buona notizia è che ci sono diversi metodi per inviare richieste, in realtà quattro: 1. http WebRequest, 2. https WebRequest, 3. http NSUrlConnection, 4. HttpClient.

E li ho provati tutti, come si può supporre che i primi tre siano perfettamente comparsi in charles, ma l'ultimo HttpClient di nuovo non so perché non si è mostrato nella schermata del registro del traffico.

Quindi sono sicuro al 100% che il problema è la classe HttpClient, che non so perché nonostante funzioni normalmente, cioè invii/ricevi richieste, le richieste fatte da questa classe non possono essere catturato da Charles.

E per escludere l'ultimo motivo possibile per questo problema, che potrebbe essere il problema è in Charles, ho anche provato a utilizzare Fiddler su Windows, che era in esecuzione come una macchina virtuale sul mio Mac (here è possibile trovare come fare così), è stata ripetuta la stessa storia - tutte le richieste fatte da HttpClient non sono state catturate, il resto (WebRequests, NSUrlConnection-s, aperture di pagine web safari) ha funzionato perfettamente.

Per favore, chiunque può suggerirmi, sia che si tratti di una specie di bug, che ci sia una soluzione alternativa o altra soluzione a questo problema.

Grazie a tutti per le vostre risposte

Cordiali saluti Gagik

+0

Non ho molta familiarità con il proxy Charles, ma se non riesci a farlo funzionare, potresti provare a utilizzare http://www.Runscope.com. Funziona come un intermediario di debug HTTP e c'è un piano gratuito. Disclaimer, lavoro come sostenitore per Runscope. –

risposta

6

Ci sono molti modi per inizializzare HttpClient. Alcuni modi non parlano con il sistema operativo (completamente gestito) e non saranno a conoscenza delle impostazioni del proxy iOS.

Il migliore (per iOS) è generalmente quello di utilizzare il gestore che utilizza CFNetwork, vedere this blog per ulteriori dettagli.In pratica ciò significa:

var client = new HttpClient (CFNetworkHandler()); 

In caso contrario sarà necessario impostare il HttpClientHandler.Proxy a CFNetwork.GetDefaultProxy. Per esempio.

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

Un'altra opzione, se la gestione dei cookie o altre funzionalità che si discostano dal normale comportamento del gestore impedisce all'utente di utilizzare il gestore "Moderno" o nativo, è utilizzare i metodi statici disponibili su WebRequest o WebProxy per ottenere i proxy/proxy di sistema o ottenere proxy di Uri. – TheXenocide

Problemi correlati