Pergunta

Temos uma operação em segundo plano (serviço do Windows) que queremos usar por meio de um servidor proxy.

Basicamente, estamos fazendo isso:

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

O proxy é aquele que nós mesmos configuramos usando FreeProxy .

Habilitei o registro na máquina que estou testando e posso confirmar se as solicitações estão sendo feitas ao proxy ao usá-lo no Firefox.

Nenhuma autenticação é necessária para o servidor proxy, exceto que o IP deve estar dentro de nosso escritório (o que, pelas evidências do Firefox, presumo que não seja o problema).

No entanto, em nosso processo de segundo plano, não pareço estar usando o proxy quando uso o cliente da web:

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

Não recebo erros do proxy, no entanto, parece que estamos apenas continuando sem ele, embora o proxy tenha sido explicitamente definido.

A informação parece retornar bem, mas não por meio de nosso proxy.

Há algo que estou perdendo ao usar um proxy com um WebClient?

editar: mais detalhes. Se desativarmos o serviço de proxy no servidor, obteremos uma exceção de que não podemos conectar. Portanto, parece que o cliente da web está tentando acessar o proxy, mas o tráfego não está realmente fluindo pelo 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
Foi útil?

Solução

Acontece que o FreeProxy não estava aceitando tráfego HTTPS.

Acho que o proxy deve retornar os tipos de tráfego que pode rotear e, se não puder, o cliente da web não fará nada.

Passou a usar o pacote Burp como nosso proxy, pois pode aceitar HTTPS.

http://portswigger.net/burp/

Outras dicas

Você deve configurar o Windows para usar o proxy por padrão ou definir o proxy manualmente em seu código, consulte: http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy (v= VS.100) .aspx

Você está usando a classe WebClient corretamente, pelo que posso dizer.Consigo ver o seguinte pedido ...

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

no Fiddler em execução na minha caixa local.Agora, se eu desligar o Fiddler, obtenho a WebException:

Unable to connect to the remote server

Com uma SocketException interna de:

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

Então, dito isso, meu palpite é que seu proxy está funcionando como esperado, mas não está apenas registrando a solicitação HTTP de saída.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top