Kết nối C # qua Proxy


92

Tôi làm việc trong một văn phòng yêu cầu tất cả các kết nối phải được thực hiện thông qua một proxy http cụ thể. Tôi cần viết một ứng dụng đơn giản để truy vấn một số giá trị từ máy chủ web - thật dễ dàng nếu không có proxy. Làm cách nào để làm cho ứng dụng C # nhận biết được proxy? Làm cách nào để tạo bất kỳ loại kết nối nào thông qua proxy?

Câu trả lời:


104

Điều này có thể dễ dàng đạt được theo lập trình, trong mã của bạn hoặc khai báo trong web.config hoặc app.config.

Bạn có thể lập trình tạo một proxy như sau:

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

Về cơ bản, bạn đang gán WebProxyđối tượng cho thuộc tính của requestđối tượng proxy. Điều này requestsau đó sẽ sử dụng proxybạn xác định.

Để đạt được điều tương tự một cách khai báo, bạn có thể làm như sau:

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

trong web.config hoặc app.config của bạn. Điều này đặt một proxy mặc định mà tất cả các yêu cầu http sẽ sử dụng. Tùy thuộc vào chính xác những gì bạn cần đạt được, bạn có thể yêu cầu hoặc không yêu cầu một số thuộc tính bổ sung của phần tử defaultProxy / proxy , vì vậy vui lòng tham khảo tài liệu về những thuộc tính đó.


trong ví dụ theo chương trình, bạn không thiết lập cổng, TẠI SAO?
Skuta 21/12/09

@Skuta - Không có lý do cụ thể. Đó chỉ đơn thuần là một sự giám sát như trong ví dụ đó, tôi đang sử dụng hàm tạo lấy URL (dưới dạng chuỗi) và boolean để xác định xem các địa chỉ cục bộ có bị bỏ qua hay không. Nếu bạn cần một số cổng cụ thể, có thể tốt hơn là sử dụng hàm tạo được nạp chồng cho phép URL (dưới dạng chuỗi) và số cổng (dưới dạng Int32), sau đó đặt thuộc BypassProxyOnLocaltính thành True (nếu cần) ngay sau đó.
CraigTP

2
@Skuta - Tôi đã chỉnh sửa bài đăng của mình để làm rõ điều này và để đảm bảo rằng các ví dụ lập trình và khai báo thực sự đang làm điều tương tự!
CraigTP

23

Nếu bạn đang sử dụng WebClient, nó có thuộc tính Proxy mà bạn có thể sử dụng.

Như những người khác đã đề cập, có một số cách để tự động phát hiện / sử dụng cài đặt proxy

Web.Config:

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

Sử dụng lớp WebProxy như được mô tả trong bài viết này .


Bạn cũng có thể định cấu hình trực tiếp cài đặt proxy (cấu hình hoặc mã) và ứng dụng của bạn sau đó sẽ sử dụng những cài đặt đó.

Web.Config:

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

Mã:

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

Hãy thử mã này. Gọi nó trước khi thực hiện bất kỳ yêu cầu http. Mã sẽ sử dụng proxy từ Cài đặt Internet Explorer của bạn - có một điều là tôi sử dụng proxy.Credentials = ....vì máy chủ proxy của tôi là Máy chủ tăng tốc Internet được xác thực NTLM. Cho nó một whiz.

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đã lỗi thời kể từ Framework 4.5 và phương thức này trả về null. Tốt hơn hãy suy nghĩ trước khi sử dụng CredentialCache.DefaultNetworkCredentials. Nếu bạn đã đặt một cái gì đó vào CredentialCache và proxy của bạn yêu cầu thông tin xác thực như vậy, thì nó sẽ hoạt động. Nếu không nó sẽ không giúp ích gì.
cassandrad

6

Nếu bạn muốn ứng dụng sử dụng proxy mặc định của hệ thống, hãy thêm proxy này vào Application.exe.config của bạn (trong đó application.exe là tên ứng dụng của bạn):

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

Bạn có thể tìm thêm thông tin chi tiết trong bài viết MSDN trên System.Net


Lưu ý: Phần: <system.net> nằm bên trong phần <configuration> hoặc tệp exe.config. Điều này giúp công cụ proxy hoạt động trong một ứng dụng console đơn giản mà tôi đã thiết lập.
John Dyer

5

Một lớp lót này phù hợp với tôi:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials là cài đặt proxy được đặt trong Internet Explorer.

WebRequest.DefaultWebProxy.Credentials được sử dụng cho tất cả kết nối internet trong ứng dụng.


1
"CredentialCache.DefaultNetWorkCredentials là cài đặt proxy được đặt trong Internet Explorer". đây vẫn là trường hợp? Tôi không thể tìm thấy bất kỳ đâu trong Tùy chọn Internet> Kết nối> Cài đặt LAN để viết tên người dùng và mật khẩu.
Matt

Từ tài liệu: "Đối với ứng dụng phía máy khách, đây thường là thông tin đăng nhập Windows (tên người dùng, mật khẩu và miền) của người dùng đang chạy ứng dụng."
Coert Grobbelaar

Câu trả lời này có thể có một chút niên kém, nhưng tôi khá chắc chắn đó là sự thật năm 2015 cửa sổ
Coert Grobbelaar

4

Mã của Foole hoạt động hoàn hảo đối với tôi, nhưng trong .NET 4.0, đừng quên kiểm tra xem Proxy có phải là NULL hay không, nghĩa là không có proxy nào được định cấu hình (bên ngoài môi trường công ty)

Vì vậy, đây là mã đã giải quyết vấn đề của tôi với proxy công ty của chúng tôi

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

3

Mã này đã làm việc cho tôi:

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

0

Tự động phát hiện proxy là một quá trình mà máy chủ Web proxy được hệ thống xác định và được sử dụng để gửi yêu cầu thay mặt cho máy khách. Tính năng này còn được gọi là Web Proxy Auto-Discovery (WPAD). Khi tính năng phát hiện proxy tự động được bật, hệ thống sẽ cố gắng xác định tập lệnh cấu hình proxy chịu trách nhiệm trả về tập hợp proxy có thể được sử dụng cho yêu cầu.

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


4
Làm thế nào để trả lời câu hỏi này? OP có thể sử dụng thông tin này như thế nào?
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
Tốt hơn là viết giải thích về giải pháp của bạn chứ không chỉ viết mã. Bạn có thể chỉnh sửa trong một số văn bản sẽ giúp ích cho người đọc không?
Brian Tompsett - 汤 莱恩

0

Tôi sẽ sử dụng một ví dụ để thêm vào các câu trả lời ở trên.

Tôi đã gặp sự cố proxy khi cố gắng cài đặt các gói thông qua Trình cài đặt nền tảng web

Điều đó cũng sử dụng tệp cấu hình là WebPlatformInstaller.exe.config

Tôi đã thử các chỉnh sửa được đề xuất trong diễn đàn IIS này là

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

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

Không ai trong số này hoạt động.

Điều làm việc cho tôi là cái này -

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

Mô-đun cần được đăng ký với Trình cài đặt nền tảng web để sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.