C # conectando por meio de proxy

92

Eu trabalho em um escritório que exige que todas as conexões sejam feitas através de um proxy http específico. Eu preciso escrever um aplicativo simples para consultar alguns valores de um servidor web - é fácil se não houver proxy. Como posso tornar o aplicativo C # compatível com o proxy? Como posso fazer qualquer tipo de conexão através de um proxy?

KalEl
fonte

Respostas:

103

Isso é facilmente alcançado de forma programática, em seu código, ou declarativamente no web.config ou no app.config.

Você pode criar um proxy de maneira programática como:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

Você está basicamente atribuindo o WebProxyobjeto à propriedade requestdo objeto proxy. Isso requestentão usará o que proxyvocê definir.

Para obter a mesma coisa declarativamente, você pode fazer o seguinte:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

dentro do seu web.config ou app.config. Isso define um proxy padrão que todas as solicitações http usarão. Dependendo exatamente do que você precisa alcançar, você pode ou não exigir alguns dos atributos adicionais do elemento defaultProxy / proxy , portanto, consulte a documentação para eles.

CraigTP
fonte
no exemplo programático, você não configurou a porta, POR QUÊ?
Skuta
@Skuta - Sem motivo particular. Isso foi apenas um descuido, pois naquele exemplo, estou usando o construtor que pega a URL (como uma string) e um booleano para determinar se os endereços locais são ignorados. Se você precisar de um número de porta específico, pode ser melhor usar o construtor sobrecarregado que permite a URL (como uma string) e o número da porta (como um Int32) e, a seguir, defina a BypassProxyOnLocalpropriedade como True (se necessário).
CraigTP
2
@Skuta - Eu editei minha postagem para esclarecer isso e para garantir que os exemplos programáticos e declarativos estejam realmente fazendo a mesma coisa!
CraigTP
23

Se você estiver usando WebClient, ele tem uma propriedade Proxy que você pode usar.

Como outros mencionaram, existem várias maneiras de automatizar a detecção / uso de configuração de proxy

Web.Config:

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
     <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

Uso da classe WebProxy conforme descrito neste artigo .


Você também pode configurar as configurações de proxy diretamente (configuração ou código) e seu aplicativo irá usá-las.

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

Código:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Oded
fonte
7

Experimente este código. Ligue antes de fazer qualquer solicitação http. O código usará o proxy das configurações do Internet Explorer - uma coisa, porém, eu uso proxy.Credentials = ....porque meu servidor proxy é um servidor de aceleração da Internet autenticado por NTLM. Dê um gênio.

static void setProxy()
{
    WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
    if(proxy.Address != null)
    {
        proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
    }
}
Seamus
fonte
3
WebProxy.GetDefaultProxyestá obsoleto desde o Framework 4.5 e este método retorna nulo. É melhor pensar antes de usar CredentialCache.DefaultNetworkCredentials. Se você colocou algo no CredentialCache e seu proxy exige essas credenciais, então deve funcionar. Caso contrário, não ajudará.
cassandrad
6

Se você deseja que o aplicativo use o proxy padrão do sistema, adicione-o ao Application.exe.config (em que application.exe é o nome do seu aplicativo):

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
   <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

Mais detalhes podem ser encontrados no artigo do MSDN em System.Net

Robert Christie
fonte
Observação: a seção: <system.net> vai dentro da seção <configuration> ou do arquivo exe.config. Isso fez com que o proxy funcionasse em um aplicativo de console simples que criei.
John Dyer
5

Este one-liner funciona para mim:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials são as configurações de proxy definidas no Internet Explorer.

WebRequest.DefaultWebProxy.Credentials é usado para toda a conectividade com a Internet no aplicativo.

Coert Grobbelaar
fonte
1
"CredentialCache.DefaultNetWorkCredentials é a configuração de proxy definida no Internet Explorer". Este ainda é o caso? Não consigo encontrar em nenhum lugar em Opções da Internet> Conexões> Configurações da LAN para escrever um nome de usuário e senha.
Matt,
Dos documentos: "Para um aplicativo do lado do cliente, geralmente são as credenciais do Windows (nome de usuário, senha e domínio) do usuário que executa o aplicativo."
Coert Grobbelaar
Esta resposta pode ter envelhecido um pouco mal, mas tenho quase certeza de que era verdade para as janelas de 2015
Coert Grobbelaar
4

O código de Foole funcionou perfeitamente para mim, mas no .NET 4.0, não se esqueça de verificar se Proxy é NULL, o que significa nenhum proxy configurado (fora do ambiente corporativo)

Então aqui está o código que resolveu meu problema com nosso proxy corporativo

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
JCH2k
fonte
3

Este código funcionou para mim:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Tolo
fonte
0

A detecção automática de proxy é um processo pelo qual um servidor proxy da Web é identificado pelo sistema e usado para enviar solicitações em nome do cliente. Esse recurso também é conhecido como Web Proxy Auto-Discovery (WPAD). Quando a detecção automática de proxy está ativada, o sistema tenta localizar um script de configuração de proxy que é responsável por retornar o conjunto de proxies que podem ser usados ​​para a solicitação.

http://msdn.microsoft.com/en-us/library/fze2ytx2.aspx

Elijah Glover
fonte
4
Como isso responde à pergunta? Como o OP pode colocar essas informações em uso?
Cullub
0
            var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };

            WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
            NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
            var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);
JD-V
fonte
5
É preferível escrever uma explicação de sua solução e não apenas postar o código. Você pode editar algum texto que ajude o leitor?
Brian Tompsett - 汤 莱恩
0

Vou usar um exemplo para adicionar às respostas acima.

Tive problemas de proxy ao tentar instalar pacotes por meio do Web Platform Installer

Isso também usa um arquivo de configuração que é WebPlatformInstaller.exe.config

Eu tentei as edições sugeridas neste fórum IIS que é

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

e

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <system.net>    
     <defaultProxy>      
          <proxy 
               proxyaddress="http://yourproxy.company.com:80" 
               usesystemdefault="True"
               autoDetect="False" />    
     </defaultProxy>  
   </system.net>
</configuration>

Nenhum deles funcionou.

O que funcionou para mim foi isso -

<system.net>    
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
    </defaultProxy>  
 </system.net>

O módulo precisava ser registrado no Web Platform Installer para poder ser usado.

Mukus
fonte