C # Menghubungkan Melalui Proxy

93

Saya bekerja di kantor yang mengharuskan semua koneksi dibuat melalui proxy http tertentu. Saya perlu menulis aplikasi sederhana untuk menanyakan beberapa nilai dari server web - mudah jika tidak ada proxy. Bagaimana cara membuat aplikasi C # sadar-proxy? Bagaimana saya bisa membuat koneksi apapun melalui proxy?

KalEl
sumber

Jawaban:

105

Ini dengan mudah dicapai baik secara terprogram, dalam kode Anda, atau secara deklaratif di web.config atau app.config.

Anda dapat membuat proxy secara terprogram seperti ini:

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

Anda pada dasarnya menempatkan WebProxyobjek ke requestobjek proxyproperti. Ini requestkemudian akan menggunakan yang proxyAnda tentukan.

Untuk mencapai hal yang sama secara deklaratif, Anda dapat melakukan hal berikut:

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

dalam web.config atau app.config Anda. Ini menetapkan proxy default yang akan digunakan semua permintaan http. Bergantung pada apa yang ingin Anda capai, Anda mungkin memerlukan atau tidak memerlukan beberapa atribut tambahan dari elemen defaultProxy / proxy , jadi silakan merujuk ke dokumentasi untuk itu.

CraigTP
sumber
dalam contoh programatik, Anda tidak mengatur port, MENGAPA?
Skuta
@ Skuta - Tidak ada alasan khusus. Itu hanyalah kekeliruan seperti dalam contoh itu, saya menggunakan konstruktor yang mengambil URL (sebagai string) dan boolean untuk menentukan apakah alamat lokal dilewati. Jika Anda memerlukan nomor port tertentu, mungkin lebih baik menggunakan konstruktor kelebihan beban yang memungkinkan URL (sebagai string) dan nomor port (sebagai Int32), lalu setel BypassProxyOnLocalproperti ke True (jika diperlukan) segera setelahnya.
CraigTP
2
@ Skuta - Saya telah mengedit posting saya untuk mengklarifikasi ini dan untuk memastikan bahwa contoh programatik dan deklaratif benar-benar melakukan hal yang sama!
CraigTP
23

Jika Anda menggunakan WebClient, ini memiliki properti Proxy yang dapat Anda gunakan.

Seperti yang disebutkan orang lain, ada beberapa cara untuk mengotomatiskan deteksi / penggunaan pengaturan proxy

Web.Config:

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

Penggunaan kelas WebProxy seperti yang dijelaskan di artikel ini .


Anda juga dapat mengonfigurasi pengaturan proxy secara langsung (konfigurasi atau kode) dan aplikasi Anda kemudian akan menggunakannya.

Web.Config:

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

Kode:

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

Coba kode ini. Sebut saja sebelum membuat permintaan http. Kode akan menggunakan proxy dari Pengaturan Internet Explorer Anda - satu hal yang saya gunakan proxy.Credentials = ....karena server proxy saya adalah Server Akselerasi Internet yang diautentikasi NTLM. Cobalah.

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
sumber
3
WebProxy.GetDefaultProxysudah usang sejak Framework 4.5 dan metode ini mengembalikan null. Lebih baik pikirkan sebelum menggunakan CredentialCache.DefaultNetworkCredentials. Jika Anda telah meletakkan sesuatu di CredentialCache dan proxy Anda memerlukan kredensial tersebut, maka itu akan berfungsi. Kalau tidak, itu tidak akan membantu.
cassandrad
6

Jika Anda ingin aplikasi menggunakan proxy default sistem, tambahkan ini ke Application.exe.config Anda (di mana application.exe adalah nama aplikasi Anda):

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

Detail selengkapnya dapat ditemukan di artikel MSDN di System.Net

Robert Christie
sumber
Catatan: Bagian: <system.net> masuk ke dalam bagian <configuration> atau file exe.config. Ini membuat barang-barang proxy bekerja di aplikasi konsol sederhana yang saya buat.
John Dyer
5

Satu baris ini cocok untuk saya:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials adalah setelan proxy yang disetel di Internet Explorer.

WebRequest.DefaultWebProxy.Credentials digunakan untuk semua konektivitas internet di aplikasi.

Coert Grobbelaar
sumber
1
"CredentialCache.DefaultNetWorkCredentials adalah setelan proxy yang disetel di Internet Explorer". Apakah masih demikian? Saya tidak dapat menemukan di mana pun di Opsi Internet> Koneksi> Pengaturan LAN untuk menulis nama pengguna dan kata sandi.
Matt
Dari dokumen: "Untuk aplikasi sisi klien, biasanya ini adalah kredensial Windows (nama pengguna, sandi, dan domain) pengguna yang menjalankan aplikasi."
Coert Grobbelaar
Jawaban ini mungkin agak tua, tetapi saya cukup yakin itu benar untuk jendela 2015
Coert Grobbelaar
4

Kode Foole bekerja dengan sempurna untuk saya, tetapi di .NET 4.0, jangan lupa untuk memeriksa apakah Proxy adalah NULL, yang berarti tidak ada proxy yang dikonfigurasi (di luar lingkungan perusahaan)

Jadi, inilah kode yang memecahkan masalah saya dengan proxy perusahaan kami

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

Kode ini berhasil untuk saya:

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

Deteksi proxy otomatis adalah proses di mana server proxy Web diidentifikasi oleh sistem dan digunakan untuk mengirim permintaan atas nama klien. Fitur ini juga dikenal sebagai Web Proxy Auto-Discovery (WPAD). Ketika deteksi proxy otomatis diaktifkan, sistem mencoba untuk menemukan skrip konfigurasi proxy yang bertanggung jawab untuk mengembalikan kumpulan proxy yang dapat digunakan untuk permintaan tersebut.

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

Elijah Glover
sumber
4
Bagaimana ini menjawab pertanyaan? Bagaimana OP menggunakan informasi ini?
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
sumber
5
Lebih baik menulis penjelasan tentang solusi Anda dan bukan hanya kode pos. Bisakah Anda mengedit dalam beberapa teks yang akan membantu pembaca?
Brian Tompsett - 汤 莱恩
0

Saya akan menggunakan contoh untuk menambahkan jawaban di atas.

Saya mengalami masalah proxy saat mencoba menginstal paket melalui Penginstal Platform Web

Itu juga menggunakan file konfigurasi yang WebPlatformInstaller.exe.config

Saya mencoba saran edit di forum IIS ini

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

dan

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

Tak satu pun dari ini berhasil.

Apa yang berhasil bagi saya adalah ini -

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

Modul ini harus didaftarkan dengan Penginstal Platform Web agar dapat menggunakannya.

Mukus
sumber