2013-05-13 7 views
42

Rozwiązuję problem z usługą, którą wywołuję za pośrednictwem HttpClient .NET, próbując przekierować żądanie przez lokalny serwer proxy (Fiddler), ale moje ustawienia proxy nie działają .Użycie proxy z .NET 4.5 HttpClient

Oto jak utworzyć klienta:

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

potem wysłać wniosek przez:

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

Zapytanie idzie prosto do serwera nie próbując uderzyć proxy. Co mnie ominęło?

+0

Czy Twoja usługa jest testowana na twoim lokalnym komputerze? Rozważ obejście proxy dla adresów lokalnych. – Xaqron

+0

Nawiasem mówiąc, tworzenie instancji "HttpClient" jest kosztowne. Jeśli to możliwe, powinieneś ponownie użyć instancji. Jest kilka wpisów na blogu, które mówią o tym osiągalnym za pomocą Google. – NathanAldenSr

Odpowiedz

7

Ah, The BaseAddress, na który wskazywałem, to http://localhost:8081. Okazuje się, że pomimo ustawienia BypassOnLocal na false, widocznie localhost jest nadal na tyle specjalny, że pomija proxy.

Dodałem powiązanie domeny w IIS, wpis pliku hosta, aby wskazać tę domenę na 127.0.0.1, użyłem nowo utworzonej domeny, teraz działa.

+6

Możesz także użyć 'http: // localhost.: 8888' Zwróć uwagę na magiczną kropkę! –

+2

Otrzymuję złe żądanie - nieprawidłowa nazwa hosta, gdy wstawiam. po localhost – Michael

+0

@DarrelMiller Nie otrzymuję żadnych zmian po dodaniu localhost. ' ' – felickz

1

Czy Fiddler jest skonfigurowany do przechwytywania ruchu ze wszystkich procesów? Spójrz na pasek stanu, gdzie zobaczysz "Przechwytywanie". Powinien pokazać obok "Wszystkie procesy". Jeśli wyświetla "Przeglądarki internetowe", kliknij go i zmień na wszystkie procesy. Może się to różnić w zależności od wersji Skrzypka, którego używasz.

38

Ten kod pracował dla mnie:

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

Należy pamiętać, że nie jestem dostarczający pustą tablicę do mojego WebProxy konstruktora. Być może to jest problem?

+0

Usuwanie tablicy ciąg pracował dla mnie także. Musiałem wejść do HOSTS, aby proxy działało na localhost. –

+0

Właśnie uratowałeś mój dzień^_ ^ –