Usando C # WebClient com um proxy - nenhuma solicitação feita ao servidor proxy?
-
27-10-2019 - |
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
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.
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.