web-dev-qa-db-fra.com

Connexion C # via un proxy

Je travaille dans un bureau où toutes les connexions doivent être établies via un proxy http spécifique. J'ai besoin d'écrire une application simple pour interroger certaines valeurs d'un serveur Web - c'est facile s'il n'y avait pas de proxy. Comment puis-je rendre l'application C # compatible avec le proxy? Comment puis-je établir un type de connexion via un proxy?

86
KalEl

Ceci est facilement réalisé par programme, dans votre code ou de manière déclarative dans le fichier web.config ou dans le fichier app.config.

Vous pouvez créer par programme un proxy comme suit:

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();

Vous affectez essentiellement l'objet WebProxy à la propriété request de l'objet proxy. Ce request utilisera ensuite le proxy que vous définissez.

Pour obtenir la même chose de manière déclarative, vous pouvez effectuer les opérations suivantes:

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

dans votre web.config ou app.config. Ceci définit un proxy par défaut que toutes les requêtes http utiliseront. Selon ce que vous devez réaliser, vous pouvez avoir besoin de certains attributs supplémentaires de l’élément defaultProxy / proxy , veuillez donc vous reporter à la documentation correspondante.

98
CraigTP

Si vous utilisez WebClient, il possède une propriété proxy que vous pouvez utiliser.

Comme d'autres l'ont mentionné, il existe plusieurs façons d'automatiser la détection/l'utilisation des paramètres de proxy

Web.Config:

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

Utilisation de la classe WebProxy comme décrit dans cet article .


Vous pouvez également configurer directement les paramètres du proxy (config ou code) et votre application les utilisera ensuite.

Web.Config:

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

Code:

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();
22
Oded

Essayez ce code. Appelez-le avant de faire des requêtes http. Le code utilisera le proxy de vos paramètres Internet Explorer - une chose cependant, j'utilise proxy.Credentials = .... parce que mon serveur proxy est un serveur d'accélération Internet authentifié par NTLM. Donnez-lui un as.

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);
    }
}
6
Seamus

Si vous souhaitez que l'application utilise le proxy par défaut du système, ajoutez ceci à votre application.exe.config (où application.exe est le nom de votre application):

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

Plus de détails peuvent être trouvés dans article de MSDN sur System.Net

6
Robert Christie

Ce one-liner fonctionne pour moi:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials représente les paramètres de proxy définis dans Internet Explorer.

WebRequest.DefaultWebProxy.Credentials est utilisé pour toutes les connexions Internet dans l’application.

6
Coert Grobbelaar

Le code de Foole fonctionnait parfaitement pour moi, mais dans .NET 4.0, n'oubliez pas de vérifier si le proxy est NULL, ce qui signifie qu'aucun proxy n'est configuré (en dehors de l'environnement de l'entreprise).

Alors, voici le code qui a résolu mon problème avec notre proxy d'entreprise

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

Ce code a fonctionné pour moi:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
3
Foole

La détection automatique du proxy est un processus par lequel un serveur proxy Web est identifié par le système et utilisé pour envoyer des demandes au nom du client. Cette fonctionnalité est également connue sous le nom de découverte automatique du proxy Web (WPAD). Lorsque la détection automatique du proxy est activée, le système tente de localiser un script de configuration du proxy chargé de renvoyer l'ensemble des mandataires pouvant être utilisés pour la demande.

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

0
Elijah Glover

Je vais utiliser un exemple pour ajouter aux réponses ci-dessus.

J'ai rencontré des problèmes de proxy en essayant d'installer des packages via Web Platform Installer

Cela aussi utilise un fichier de configuration qui est WebPlatformInstaller.exe.config

J'ai essayé les modifications suggérées dans this IIS forum) qui est

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

et

<?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>

Aucune de ces solutions n'a fonctionné.

Ce qui a fonctionné pour moi était ceci -

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

Le module devait être enregistré auprès de Web Platform Installer pour pouvoir être utilisé.

0
Mukus
            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);
0
JD-V