2016-03-29 36 views
11

So che ci sono molte domande/risposte, blog su questo, non parlando delle FAQ di Telerik. Ancora non ho potuto trovare questo diagnosticato e risolto in modo chiaro modo puro:Come usare Fiddler con HttpClient?

Contesto:

Ho una web app API, e ho un (test di unità) client, che utilizza HttpClient per inviare le richieste all'API. L'app Web API è in ascolto su http://localhost:8631/ A volte uso Fiddler per vedere cosa sta succedendo.

Problema:

traffico tra il mio HttpClient e API Web non viene catturata da Fiddler. Dopo aver lanciato il traffico di Fiddler è ancora OK, ma non mostrato in Fiddler.

diagnostica finora:

  • Importante: utilizzo di qualsiasi browser e l'invio di richieste di http://localhost:8631/sta lavorando, voglio dire: traffico catturato da Fiddler
  • Configurazione HttpClient esplicitamente da usare Il violinista come proxy non aiuta.
  • Modifica HttpClient url http://localhost:8631/-http://localhost.fiddler: 8631/aiuta, a prescindere dalla procura è stato configurato o meno.

Conclusioni: Almeno il mio caso: non si tratta di HttpClient è configurato in modo esplicito a utilizzare Fiddler come proxy o no. Riguarda il comportamento del localhost di HttpClient e/o Fiddler.

Problema ancora:

Ci si potrebbe chiedere: Problema risolto, allora qual è il problema? Beh ...

Q1: Questo è ancora un problema doloroso, perché l'URL è codificato o configurato da qualche parte (intendo http://localhost:8631/ohttp://localhost.fiddler: 8631 così ogni avvio e l'arresto del violinista si deve essere aggiornato. Altro: controllare il controllo del codice sorgente e verificare su un altro computer da un compagno di squadra può causare problemi. Quindi: C'è qualche soluzione meno dolorosa per questo?

Hard codifica il mio nome macchina (che anche potrebbe funzionare) causa lo stesso dolore e il problema quando si lavora in una squadra e utilizzando il controllo sorgente

Q2: Perché questo comportamento è incoerente: Pure http://localhost:8631/ funziona da qualsiasi browser ma non da HttpClient.

Penso che rispondere a Q2 possa avvicinarci a una soluzione più utilizzabile.

Codice Exhibit

// Using the following url w o r k s regardless of any proxy setting 
    // ...but it is a pain to hardcode or configure this and change depending on Fiddler is running or not 

    //private const string ApiUrl = "http://localhost.fiddler:8631/"; 

    // This is not working regardless any proxy setting. Trafic bypasses Fiddler 
    private const string ApiUrl = "http://localhost:8631/"; 

    protected HttpClient GetClient() 
    { 
     var httpClientHandler = new HttpClientHandler 
     { 
      // Does not work 
      //Proxy = new WebProxy("http://localhost:8888", false), 

      // Does not work 
      Proxy = WebRequest.DefaultWebProxy, 
      UseProxy = true 
     }; 


     var client = new HttpClient(httpClientHandler) 
     { 
      BaseAddress = new Uri(ApiUrl) 
     }; 
     // ... 
+0

Non * è necessario * fare nulla per utilizzare Fiddler con HttpClient. Fiddler imposta/reimposta il proxy del sistema operativo predefinito in modo che * non * sia necessario modificare le applicazioni per utilizzarlo. È possibile incorrere in problemi solo se ... si configura con le impostazioni del proxy o si termina Fiddler prima che abbia la possibilità di reimpostare il proxy del sistema operativo, ad esempio arrestando –

+0

Per ottenere assistenza con problemi specifici è necessario pubblicare il codice effettivo , comprese eventuali modifiche alle impostazioni del proxy system.net in app.config –

+0

Hai provato i documenti fiddler per .NET? http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureDotNETApp –

risposta

7

Il problema è che l'implementazione Microsoft della classe WebProxy ha un controllo statico per gli URL di loopback (basato su un elenco di nomi come "localhost") e ignorerà qualsiasi proxy per uris identificato come loopback. Anche l'impostazione BypassProxyOnLocal non ha importanza. Questa impostazione ha effetto solo se si utilizza il nome macchina locale o un altro nome macchina nella rete locale. L'host localhost o l'indirizzo IP 127.0.0.1 sono sempre riconosciuti come loopback e porteranno a bypassare il proxy.

parte rilevante del codice del framework .net è in WebProxy.IsBypassedManual:

if (host.IsLoopback) { 
    return true; // bypass localhost from using a proxy. 
} 

Scrivi la tua discendente della classe WebProxy e sovrascrivere i GetProxy e IsBypassed metodi per restituire un URI utilizzando il proxy anche per gli URL di loopback . Quindi assegnare un'istanza di tale classe allo HttpClientHandler che si utilizza per creare lo HttpClient.

Non sembra funzionare perché il codice .net si aspetta di lavorare con oggetti che implementano IAutoWebProxy, ma IAutoWebProxy è dichiarato interno e non può essere utilizzato nel nostro codice.

La soluzione più semplice che vedo è quella di avere una funzionalità che sostituisce "localhost" con il nome del computer locale in ApiUrl in fase di runtime. Il nome della macchina locale funzionerà indipendentemente dal fatto che Fiddler sia in esecuzione o meno.

+2

Questa è la risposta corretta. Vedi anche https: //visualstudio.uservoice.it/forums/121579-visual-studio-2015/suggerimenti/6359204-support-the-loopback-token-in-proxy-bypass-liste – EricLaw

+0

Io uso machinename - e il violinista ignora ancora le mie chiamate httpclient ai servizi Web locali basati sul web ?! – niico

+0

@niico Inizia una nuova domanda con i dettagli sul tuo codice. Forse hai un codice che impedisce al client di utilizzare qualsiasi proxy o di impostare un proxy specifico tu stesso? – NineBerry

-1

Basta definire il proxy predefinito per l'istanza HttpClient e funziona come un fascino. Non devi modificare alcun URL nel tuo codice.

HttpClientHandler handler = new HttpClientHandler(); 
handler.Proxy = WebRequest.DefaultWebProxy; 
HttpClient client = new HttpClient(handler as HttpMessageHandler); 

Utilizziamo lo stesso comportamento senza problemi (Windows 10, Fiddler4).

+0

Grazie, provato. Sfortunatamente questo non aiuta. Si prega di notare nella parte Diagnostica che ho scritto su anche impostare esplicitamente il proxy su Fiddler non aiuta neanche. Comunque usando * localhost.fiddler * invece di localhost aiuta. La cosa strana quando si usa dal browser è * funziona * senza anche il demone .fiddler. –

+0

@ g.pickardou è il proxy Proxy a SOCK oder HTTP? Normalmente Fiddler dovrebbe creare un proxy HTTP. Usiamo un proxy HTTP e questo funziona al 100% su tutte le macchine. Anche presso i clienti con Enterprise Proxies. – Ben

+0

Non ho alcun proxy. Fiddler è un proxy quando è in esecuzione. –