C # Proxy Üzerinden Bağlanma


97

Tüm bağlantıların belirli bir http proxy üzerinden yapılmasını gerektiren bir ofiste çalışıyorum. Bir web sunucusundan bazı değerleri sorgulamak için basit bir uygulama yazmam gerekiyor - proxy yoksa çok kolay. C # uygulamasını proxy uyumlu hale nasıl getirebilirim? Bir proxy aracılığıyla nasıl herhangi bir bağlantı kurabilirim?

Yanıtlar:


108

Bu, programlama yoluyla, kodunuzda veya web.config veya app.config dosyasında bildirimsel olarak kolayca elde edilir.

Programlı olarak aşağıdaki gibi bir proxy oluşturabilirsiniz:

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

Temel olarak WebProxynesneyi requestnesnenin proxyözelliğine atıyorsunuz . Bu requestdaha sonra proxytanımladığınız şeyi kullanacaktır .

Aynı şeyi açıklayıcı olarak elde etmek için aşağıdakileri yapabilirsiniz:

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

web.config veya app.config içinde. Bu, tüm http isteklerinin kullanacağı varsayılan bir proxy ayarlar. Tam olarak neye ulaşmanız gerektiğine bağlı olarak, defaultProxy / proxy öğesinin bazı ek niteliklerine ihtiyaç duyabilir veya gerekmeyebilir , bu nedenle lütfen bunlar için belgelere bakın.


programatik örnekte, bağlantı noktasını ayarlamadınız, NEDEN?
Skuta

@Skuta - Belirli bir neden yok. Bu, yalnızca bu örnekte olduğu gibi bir gözetimdi, yerel adreslerin atlanıp atlanmadığını belirlemek için URL'yi (bir dize olarak) ve bir boolean alan yapıcıyı kullanıyorum. Belirli bir bağlantı noktası numarasına ihtiyacınız varsa, URL'ye (bir dize olarak) ve bağlantı noktası numarasına (bir Int32 olarak) izin veren aşırı yüklenmiş kurucuyu kullanmak, ardından BypassProxyOnLocalözelliği hemen ardından (gerekirse) True olarak ayarlamak daha iyi olabilir.
CraigTP

2
@Skuta - Bunu açıklığa kavuşturmak ve programatik ve bildirimsel örneklerin aslında aynı şeyi yaptığından emin olmak için gönderimi düzenledim!
CraigTP

23

Eğer kullanıyorsanız WebClient, kullanabileceğiniz bir Proxy özelliğine sahiptir .

Diğerlerinin de belirttiği gibi, proxy ayarı algılamayı / kullanımını otomatikleştirmenin birkaç yolu vardır.

Web.Config:

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

Bu makalede açıklandığı gibi WebProxy sınıfının kullanımı .


Ayrıca proxy ayarlarını doğrudan (yapılandırma veya kod) yapılandırabilirsiniz ve uygulamanız daha sonra bunları kullanır.

Web.Config:

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

Kod:

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

Bu kodu deneyin. Herhangi bir http talebinde bulunmadan önce arayın. Kod, Internet Explorer Ayarlarınızdaki proxy'yi kullanacaktır - yine de kullanıyorum proxy.Credentials = ....çünkü proxy sunucum NTLM kimlik doğrulamalı bir İnternet Hızlandırma Sunucusu. Bir vızıltı verin.

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.GetDefaultProxyFramework 4.5 olduğundan kullanılmıyor ve bu yöntem null döndürüyor. Kullanmadan önce düşünsen iyi olur CredentialCache.DefaultNetworkCredentials. CredentialCache'ye bir şey koyduysanız ve proxy'niz bu tür kimlik bilgileri gerektiriyorsa, o zaman çalışmalıdır. Aksi takdirde yardımcı olmaz.
cassandrad

6

Uygulamanın sistem varsayılan proxy'sini kullanmasını istiyorsanız, bunu Application.exe.config dosyanıza ekleyin (burada application.exe, uygulamanızın adıdır):

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

Daha fazla ayrıntı , System.Net'teki MSDN makalesinde bulunabilir.


Not:: <system.net> bölümü, <configuration> bölümünün veya exe.config dosyasının içine gider. Bu, proxy işlerinin pişirdiğim basit bir konsol uygulamasında çalışmasını sağladı.
John Dyer

5

Bu tek astar benim için çalışıyor:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials Internet Explorer'da belirlenen proxy ayarlarıdır.

WebRequest.DefaultWebProxy.Credentials uygulamadaki tüm internet bağlantısı için kullanılır.


1
"CredentialCache.DefaultNetWorkCredentials, Internet Explorer'da ayarlanan proxy ayarlarıdır". Hala durum bu mu? Kullanıcı adı ve parola yazmak için İnternet Seçenekleri> Bağlantılar> LAN Ayarları'nda hiçbir yerde bulamıyorum.
Matt

Dokümanlardan: "Bir istemci tarafı uygulaması için, bunlar genellikle uygulamayı çalıştıran kullanıcının Windows kimlik bilgileridir (kullanıcı adı, şifre ve etki alanı)."
Coert Grobbelaar

Bu cevap biraz yaşlanmış olabilir, ancak 2015 pencereleri için doğru olduğundan oldukça eminim
Coert Grobbelaar

4

Foole'un kodu benim için mükemmel çalıştı, ancak .NET 4.0'da Proxy'nin NULL olup olmadığını kontrol etmeyi unutmayın, yani yapılandırılmış proxy yok (kurumsal ortam dışında)

İşte kurumsal vekilimiz ile sorunumu çözen kod burada

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

3

Bu kod benim için çalıştı:

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

0

Otomatik proxy algılama, bir Web proxy sunucusunun sistem tarafından tanımlandığı ve istemci adına istekleri göndermek için kullanıldığı bir işlemdir. Bu özellik aynı zamanda Web Proxy Otomatik Bulma (WPAD) olarak da bilinir. Otomatik proxy algılama etkinleştirildiğinde, sistem, istek için kullanılabilecek proxy setini döndürmekten sorumlu bir proxy yapılandırma komut dosyası bulmaya çalışır.

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


4
Bu soruya nasıl cevap veriyor? OP bu bilgileri nasıl kullanıma sunabilir?
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
Yalnızca posta kodu değil, çözümünüzün bir açıklamasını yazmanız tercih edilir. Okuyucuya yardımcı olacak bir metni düzenleyebilir misiniz?
Brian Tompsett - 汤 莱恩

0

Yukarıdaki cevaplara eklemek için bir örnek kullanacağım.

Web Platformu Yükleyicisi aracılığıyla paketleri yüklemeye çalışırken proxy sorunları yaşadım

Bu da WebPlatformInstaller.exe.config olan bir yapılandırma dosyasını kullanır.

Ben düzenlemeler önerdiğimiz çalıştı bu IIS forumu olduğunu

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

ve

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

Bunların hiçbiri işe yaramadı.

Benim için işe yarayan şuydu -

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

Modülün kullanılabilmesi için Web Platform Installer'a kaydedilmesi gerekiyordu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.