Domanda

Abbiamo un'operazione in background (servizio Windows) che vogliamo utilizzare tramite un server proxy.

Fondamentalmente, stiamo facendo questo:

public WebClient GetWebClient(){
   var webClient = new WebClient();
   webClient.proxy = new WebProxy(Configuration.ProxyHost, Configuration.ProxyPort);

   // add a bunch of headers to the WebClient (sessionids, etc.)

   return webClient;
}

Il proxy è uno che abbiamo configurato noi stessi utilizzando FreeProxy .

Ho abilitato la registrazione e sulla macchina con cui sto testando e posso confermare che le richieste vengono effettuate al proxy quando lo si utilizza in Firefox.

Non è richiesta alcuna autenticazione per il server proxy, tranne che l'IP deve essere all'interno del nostro ufficio (che dalle prove di Firefox, presumo non sia il problema).

Tuttavia, all'interno del nostro processo in background, non sembra che stia utilizzando il proxy quando utilizzo il client web:

using(var wc = GetWebClient())
using(var s = wc.OpenRead("someurl"))
using(var sr = new StreamReader(s)){
    return sr.ReadToEnd();
}

Tuttavia, non ricevo errori dal proxy, sembra che stiamo semplicemente andando avanti senza di esso anche se il proxy è stato impostato esplicitamente.

Le informazioni sembrano tornare a posto, ma non tramite il nostro proxy.

C'è qualcosa che mi manca quando utilizzo un proxy con un WebClient?

modifica: ulteriori dettagli. Se disabilitiamo il servizio proxy sul server, otteniamo un'eccezione che non possiamo connetterci. Quindi sembra che il webclient stia tentando di contattare il proxy, ma quel traffico non sta effettivamente fluendo attraverso il proxy.

Inner Exception: SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
È stato utile?

Soluzione

Si è scoperto che FreeProxy non accettava il traffico HTTPS.

Immagino che il proxy debba restituire i tipi di traffico che può instradare e, in caso contrario, il client web non fa nulla.

Passato a utilizzare la suite Burp come nostro proxy poiché può accettare HTTPS.

http://portswigger.net/burp/

Altri suggerimenti

È necessario configurare Windows per l'utilizzo del proxy per impostazione predefinita o impostare manualmente il proxy nel codice, vedere: http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy (v= VS.100) .aspx

Stai usando correttamente la classe WebClient per quanto ne so.Riesco a vedere la seguente richiesta ...

using(var client = new WebClient())
{
    client.Proxy = new WebProxy("localhost", 8888);
    Console.WriteLine(client.DownloadString("http://www.google.com"));
}

in Fiddler in esecuzione sulla mia casella locale.Ora, se chiudo Fiddler, ottengo WebException:

Unable to connect to the remote server

Con una SocketException interna di:

No connection could be made because the target machine actively refused it 127.0.0.1:8888

Detto questo, la mia ipotesi è che il tuo proxy funzioni come previsto ma non stia semplicemente registrando la richiesta HTTP in uscita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top