Pregunta

Tenemos una operación en segundo plano (servicio de Windows) que queremos utilizar a través de un servidor proxy.

Básicamente, estamos haciendo esto:

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

El proxy es aquel que nosotros mismos hemos configurado usando Proxy gratuito.

He habilitado el registro en la máquina con la que estoy probando y puedo confirmar que se realizan solicitudes al proxy cuando lo uso en Firefox.

No se requiere autenticación para el servidor proxy, excepto que la IP debe estar dentro de nuestra oficina (lo cual, según la evidencia de Firefox, supongo que no es el problema).

Sin embargo, dentro de nuestro proceso en segundo plano, parece que no estoy usando el proxy cuando uso el cliente web:

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

No recibo ningún error del proxy; sin embargo, parece que simplemente seguimos sin él a pesar de que el proxy se ha configurado explícitamente.

La información parece volver bien, pero no a través de nuestro proxy.

¿Hay algo que me falta cuando uso un proxy con un WebClient?

editar:más detalles.Si deshabilitamos el servicio proxy en el servidor, obtenemos una excepción que indica que no podemos conectarnos.Entonces parece que el cliente web está intentando comunicarse con el proxy, pero ese tráfico en realidad no fluye a través del 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
¿Fue útil?

Solución

Resulta que FreeProxy no aceptaba tráfico HTTPS.

Supongo que el proxy debe devolver los tipos de tráfico que puede enrutar y, si no puede, el cliente web no hace nada.

Se cambió a usar la suite Burp como nuestro proxy ya que puede aceptar HTTPS.

http://portswigger.net/burp/

Otros consejos

Debe configurar Windows para usar el proxy de forma predeterminada o configurar el proxy manualmente en su código, consulte: http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy(v=VS.100).aspx

Por lo que sé, estás utilizando la clase WebClient correctamente.Puedo ver la siguiente solicitud...

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

en Fiddler ejecutándose en mi caja local.Ahora, si cierro Fiddler, obtengo la WebException:

Unable to connect to the remote server

Con una SocketException interna de:

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

Entonces, dicho esto, supongo que su proxy está funcionando según lo previsto, pero simplemente no registra la solicitud HTTP saliente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top