2009-12-21 78 views
73

Tôi làm việc trong văn phòng yêu cầu tất cả các kết nố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 thế nào tôi có thể làm cho ứng dụng C# nhận biết proxy? Làm thế nào tôi có thể thực hiện bất kỳ loại kết nối thông qua một proxy?C# Kết nối thông qua Proxy

Trả lời

83

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

Bạn đang cơ bản gán đối tượng WebProxy đến tài sản proxy các request của đối tượng. Điều này request sau đó sẽ sử dụng proxy bạn xác định.

Để đạt được điều tương tự 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 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ể hoặc không thể 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ề các yếu tố đó.

+0

trong ví dụ về lập trình, bạn không đặt cổng, TẠI SAO? – Skuta

+0

@Skuta - Không có lý do cụ thể. Đó chỉ 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 (như một chuỗi) và một 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 khi sử dụng hàm tạo quá tải cho phép URL (dưới dạng chuỗi) và số cổng (dưới dạng Int32), sau đó đặt thuộc tính 'BypassProxyOnLocal' thành True (nếu cần) ngay lập tức 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

20

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

Như khác đã đề cập, có một số cách để tự động thiết lập Proxy phát hiện/sử dụng

Web.Config:

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

Sử dụng lớp WebProxy như mô tả trong this article.


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

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

Nếu bạn muốn ứng dụng để sử dụng proxy mặc định hệ thống, thêm video này vào Application.exe.config của bạn (nơi 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> 

Chi tiết khác có thể tìm thấy trong số MSDN article on System.Net

0

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

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

+3

Cách này trả lời câu hỏi? OP có thể đưa thông tin này vào sử dụng như thế nào? – Cullub

3

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

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

Hãy thử mã này. Gọi trước khi thực hiện bất kỳ yêu cầu http nào. Mã sẽ sử dụng proxy từ Cài đặt Internet Explorer của bạn - một điều mặc dù, 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); 
    } 
} 
+2

'WebProxy.GetDefaultProxy' đã lỗi thời kể từ Framework 4.5 và phương thức này trả về null. Suy nghĩ tốt hơn trước khi sử dụng 'CredentialCache.DefaultNetworkCredentials'. Nếu bạn đã đặt một cái gì đó trong CredentialCache và proxy của bạn yêu cầu thông tin đăng nhập như vậy, sau đó nó sẽ làm việc. Nếu không nó sẽ không giúp được gì. – cassandrad

4

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

Vì vậy, đây là đoạn code 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; 
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); 
+3

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 có thể giúp người đọc? –

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 chạy vào các vấn đề ủy quyền trong khi cố gắng cài đặt các gói qua Platform Installer Web

Điều đó nữa cũng sử dụng một tập tin cấu hình mà là WebPlatformInstaller.exe.config

Tôi đã cố gắng chỉnh sửa đề nghị trong this IIS forum đó 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 có cách nào trong số này hoạt động.

gì làm việc cho tôi là 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> 

Module cần thiết phải đăng ký với Web Platform Installer để sử dụng nó.

3

này một-liner làm việc cho tôi:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials là cài đặt proxy thiết lập trong Internet Explorer.

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

Các vấn đề liên quan