C # Connessione tramite proxy


92

Lavoro in un ufficio che richiede che tutte le connessioni vengano effettuate tramite uno specifico proxy http. Ho bisogno di scrivere una semplice applicazione per interrogare alcuni valori da un server web: è facile se non ci fosse un proxy. Come posso rendere l'applicazione C # compatibile con il proxy? Come posso effettuare qualsiasi tipo di connessione tramite un proxy?

Risposte:


103

Ciò è facilmente ottenibile in modo programmatico, nel codice o in modo dichiarativo in web.config o app.config.

Puoi creare a livello di codice un proxy in questo modo:

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

In pratica stai assegnando l' WebProxyoggetto alla proprietà requestdell'oggetto proxy. Questo requestutilizzerà quindi il file proxydefinito.

Per ottenere la stessa cosa in modo dichiarativo, puoi fare quanto segue:

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

all'interno del tuo web.config o app.config. Questo imposta un proxy predefinito che verrà utilizzato da tutte le richieste http. A seconda esattamente di ciò che devi ottenere, potresti o meno richiedere alcuni degli attributi aggiuntivi dell'elemento defaultProxy / proxy , quindi fai riferimento alla documentazione per quelli.


nell'esempio programmatico non hai impostato la porta, PERCHÉ?
Skuta

@Skuta - Nessun motivo particolare. Questa era solo una svista come in quell'esempio, sto usando il costruttore che accetta l'URL (come stringa) e un valore booleano per determinare se gli indirizzi locali vengono ignorati. Se è necessario un numero di porta specifico, potrebbe essere meglio utilizzare il costruttore sovraccarico che consente l'URL (come stringa) e il numero di porta (come Int32), quindi impostare la BypassProxyOnLocalproprietà su True (se necessario) immediatamente dopo.
CraigTP

2
@Skuta - Ho modificato il mio post per chiarire questo aspetto e per assicurarmi che gli esempi programmatici e dichiarativi stiano effettivamente facendo la stessa cosa!
CraigTP

23

Se stai usando WebClient, ha una proprietà Proxy che puoi usare.

Come altri hanno già detto, ci sono diversi modi per automatizzare il rilevamento / utilizzo delle impostazioni proxy

Web.Config:

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

Utilizzo della classe WebProxy come descritto in questo articolo .


Puoi anche configurare direttamente le impostazioni del proxy (configurazione o codice) e la tua app le utilizzerà.

Web.Config:

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

Codice:

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

7

Prova questo codice. Chiamalo prima di effettuare qualsiasi richiesta http. Il codice utilizzerà il proxy dalle impostazioni di Internet Explorer - una cosa però, io uso proxy.Credentials = ....perché il mio server proxy è un server di accelerazione Internet autenticato con NTLM. Dagli un mago.

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

3
WebProxy.GetDefaultProxyè obsoleto a partire da Framework 4.5 e questo metodo restituisce null. Meglio pensare prima dell'uso CredentialCache.DefaultNetworkCredentials. Se hai inserito qualcosa in CredentialCache e il tuo proxy richiede tali credenziali, allora dovrebbe funzionare. Altrimenti non aiuterà.
cassandrad

6

Se desideri che l'app utilizzi il proxy predefinito del sistema, aggiungilo al tuo Application.exe.config (dove application.exe è il nome della tua applicazione):

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

Maggiori dettagli sono disponibili nell'articolo di MSDN su System.Net


Nota: la sezione: <system.net> va all'interno della sezione <configuration> o nel file exe.config. Questo ha fatto funzionare la roba del proxy in una semplice app per console che ho preparato.
John Dyer il

5

Questa battuta funziona per me:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials sono le impostazioni del proxy impostate in Internet Explorer.

WebRequest.DefaultWebProxy.Credentials viene utilizzato per tutta la connettività Internet nell'applicazione.


1
"CredentialCache.DefaultNetWorkCredentials è le impostazioni del proxy impostate in Internet Explorer". È ancora così? Non riesco a trovare da nessuna parte in Opzioni Internet> Connessioni> Impostazioni LAN per scrivere un nome utente e una password.
Matt

Dai documenti: "Per un'applicazione lato client, queste sono generalmente le credenziali di Windows (nome utente, password e dominio) dell'utente che esegue l'applicazione."
Coert Grobbelaar

Questa risposta potrebbe essere invecchiata un po 'male, ma sono abbastanza sicuro che fosse vero per le finestre del 2015
Coert Grobbelaar

4

Il codice di Foole ha funzionato perfettamente per me, ma in .NET 4.0, non dimenticare di controllare se Proxy è NULL, il che significa che nessun proxy è configurato (al di fuori dell'ambiente aziendale)

Quindi ecco il codice che ha risolto il mio problema con il nostro proxy aziendale

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

3

Questo codice ha funzionato per me:

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

0

Il rilevamento automatico del proxy è un processo mediante il quale un server proxy Web viene identificato dal sistema e utilizzato per inviare richieste per conto del client. Questa funzionalità è nota anche come Web Proxy Auto-Discovery (WPAD). Quando il rilevamento automatico del proxy è abilitato, il sistema tenta di individuare uno script di configurazione del proxy responsabile della restituzione del set di proxy che possono essere utilizzati per la richiesta.

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


4
Come risponde questo alla domanda? In che modo l'OP può utilizzare queste informazioni?
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);

5
È preferibile scrivere una spiegazione della soluzione e non solo il codice postale. Puoi modificare del testo che possa aiutare il lettore?
Brian Tompsett - 汤 莱恩

0

Userò un esempio da aggiungere alle risposte sopra.

Ho riscontrato problemi con il proxy durante il tentativo di installare i pacchetti tramite Web Platform Installer

Anche questo utilizza un file di configurazione che è WebPlatformInstaller.exe.config

Ho provato le modifiche suggerite in questo forum IIS che è

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

Nessuno di questi ha funzionato.

Quello che ha funzionato per me è stato questo -

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

Il modulo doveva essere registrato con Web Platform Installer per poterlo utilizzare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.