2013-05-13 16 views
42

Sto risolvendo un bug con un servizio che richiamo tramite HttpClient di .NET, cercando di instradare la richiesta attraverso un proxy locale (Fiddler), ma le mie impostazioni proxy sembrano non aver effetto .Utilizzo di un proxy con .NET 4.5 HttpClient

Ecco come creo il cliente:

private HttpClient CreateHttpClient(CommandContext ctx, string sid) { 
    var cookies = new CookieContainer(); 

    var handler = new HttpClientHandler { 
     CookieContainer = cookies, 
     UseCookies = true, 
     UseDefaultCredentials = false, 
     Proxy = new WebProxy("http://localhost:8888", false, new string[]{}), 
     UseProxy = true, 
    }; 

    // snip out some irrelevant setting of authentication cookies 

    var client = new HttpClient(handler) { 
     BaseAddress = _prefServerBaseUrl, 
    }; 

    client.DefaultRequestHeaders.Accept.Add(
     new MediaTypeWithQualityHeaderValue("application/json")); 

    return client; 
} 

poi invia la richiesta tramite:

var response = CreateHttpClient(ctx, sid).PostAsJsonAsync("api/prefs/", smp).Result; 

richiesta va dritto al server senza tentare di colpire il proxy. Cosa mi sono perso?

+0

Il servizio è in prova sul computer locale? Considera l'esclusione del proxy per gli indirizzi locali. – Xaqron

+0

A proposito, creare istanze di 'HttpClient' è costoso. Dovresti riutilizzare le istanze quando possibile. Ci sono alcuni post sul blog che parlano di questo raggiungibile con Google. – NathanAldenSr

risposta

7

Ah, il BaseAddress che stavo indicando era http://localhost:8081. Risulta che nonostante l'impostazione di BypassOnLocal su false, evidentemente localhost è ancora abbastanza speciale da bypassare il proxy.

Ho aggiunto un binding di dominio in IIS, la voce del file host per puntare a quel dominio su 127.0.0.1, utilizzato dominio appena creato, ora funziona.

+6

Puoi anche usare 'http: // localhost.: 8888' Osserva il punto magico! –

+2

Ricevo una richiesta non valida - Nome host non valido quando inserisco il file. dopo localhost – Michael

+0

@DarrelMiller Non ottengo cambiamenti dopo aver aggiunto localhost. ' ' – felickz

1

Fiddler è configurato per acquisire il traffico da tutti i processi? Guarda la barra di stato dove vedi "Cattura". Accanto a questo dovrebbe mostrare "Tutti i processi". Se mostra "Browser Web", fare clic su di esso e modificarlo in tutti i processi. Questo potrebbe essere diverso a seconda della versione di Fiddler che usi.

38

Questo codice ha funzionato per me:

var httpClientHandler = new HttpClientHandler 
         { 
          Proxy = new WebProxy("http://localhost:8888", false), 
          UseProxy = true 
         } 

Si noti che non sto fornendo un array vuoto al mio WebProxy costruttore. Forse è questo il problema?

+0

rimozione della matrice di stringhe ha funzionato per me pure. Ho dovuto accedere a HOSTS per far funzionare il proxy su localhost. –

+0

Hai appena salvato la mia giornata^_ ^ –