Connexion C # via un proxy

92

Je travaille dans un bureau qui nécessite que toutes les connexions soient effectuées 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 une connexion via un proxy?

KalEl
la source

Réponses:

104

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

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

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' WebProxyobjet à la propriété de l' requestobjet proxy. Cela requestutilisera ensuite le proxyfichier que vous définissez.

Pour réaliser 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. Cela définit un proxy par défaut que toutes les requêtes http utiliseront. En fonction exactement de ce que vous devez réaliser, vous pouvez ou non avoir besoin de certains des attributs supplémentaires de l' élément defaultProxy / proxy , veuillez donc vous référer à la documentation pour ceux-ci.

CraigTP
la source
dans l'exemple de programme, vous n'avez pas défini le port, POURQUOI?
Skuta
@Skuta - Aucune raison particulière. C'était simplement un oubli, car dans cet exemple, j'utilise le constructeur qui prend l'URL (sous forme de chaîne) et un booléen pour déterminer si les adresses locales sont contournées. Si vous avez besoin d'un numéro de port spécifique, il peut être préférable d'utiliser le constructeur surchargé qui autorise l'URL (sous forme de chaîne) et le numéro de port (en tant que Int32), puis définissez la BypassProxyOnLocalpropriété sur True (si nécessaire) immédiatement après.
CraigTP
2
@Skuta - J'ai édité mon article pour clarifier cela et pour m'assurer que les exemples programmatiques et déclaratifs font réellement la même chose!
CraigTP
23

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 cofigurer directement les paramètres du proxy (configuration 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();
Oded
la source
7

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é NTLM. Donnez-lui un coup de fouet.

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
la source
3
WebProxy.GetDefaultProxyest obsolète depuis Framework 4.5 et cette méthode renvoie null. Mieux vaut réfléchir avant de l'utiliser CredentialCache.DefaultNetworkCredentials. Si vous avez mis quelque chose dans CredentialCache et que votre proxy nécessite de telles informations d'identification, cela devrait fonctionner. Sinon, cela n'aidera pas.
cassandrad le
6

Si vous souhaitez que l'application utilise le proxy par défaut du système, ajoutez-le à 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 l' article MSDN sur System.Net

Robert Christie
la source
Remarque: La section: <system.net> se trouve dans la section <configuration> ou dans le fichier exe.config. Cela a permis aux trucs du proxy de fonctionner dans une simple application console que j'ai concoctée.
John Dyer
5

Ce one-liner fonctionne pour moi:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

WebRequest.DefaultWebProxy.Credentials est utilisé pour toute la connectivité Internet dans l'application.

Coert Grobbelaar
la source
1
«CredentialCache.DefaultNetWorkCredentials est les paramètres de proxy définis dans Internet Explorer». Est-ce toujours le cas? Je ne trouve nulle part dans Options Internet> Connexions> Paramètres LAN pour écrire un nom d'utilisateur et un mot de passe.
Matt
D'après la documentation: "Pour une application côté client, il s'agit généralement des informations d'identification Windows (nom d'utilisateur, mot de passe et domaine) de l'utilisateur exécutant l'application."
Coert Grobbelaar
Cette réponse a peut-être vieilli un peu mal, mais je suis presque sûr que c'était vrai pour les fenêtres 2015
Coert Grobbelaar
4

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

Voici donc 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;
JCH2k
la source
3

Ce code a fonctionné pour moi:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Foole
la source
0

La détection automatique de 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 Web Proxy Auto-Discovery (WPAD). Lorsque la détection automatique de proxy est activée, le système tente de localiser un script de configuration de proxy qui est chargé de renvoyer l'ensemble de proxies pouvant être utilisés pour la demande.

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

Elijah Glover
la source
4
Comment cela répond-il à la question? Comment le PO peut-il utiliser ces informations?
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
la source
5
Il est préférable d'écrire une explication de votre solution et pas seulement un code postal. Pouvez-vous modifier un texte qui aiderait le lecteur?
Brian Tompsett - 汤 莱恩
0

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 ce forum IIS 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>

Aucun de ceux-ci n'a fonctionné.

Ce qui a fonctionné pour moi, c'est 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 l'utiliser.

Mukus
la source