2010-03-25 38 views
6

Tôi gặp nhiều rắc rối với kết nối internet trong chương trình tôi đang làm việc và tất cả dường như xuất hiện từ một số vấn đề với cài đặt proxy. Hầu hết các vấn đề tại thời điểm này là cố định, nhưng vấn đề tôi đang gặp bây giờ là phương pháp kiểm tra cài đặt proxy của tôi khiến một số người dùng chờ đợi trong một thời gian dài.Phương pháp được ưu tiên hoặc chấp nhận để kiểm tra cài đặt proxy là gì?

Dưới đây là những gì tôi làm:

System.Net.WebClient webClnt = new System.Net.WebClient(); 

webClnt.Proxy = proxy; 
webClnt.Credentials = proxy.Credentials; 

byte[] tempBytes; 
try 
{ 
    tempBytes = webClnt.DownloadData(url.Address); 
} 
catch 
{ 
    //Invalid proxy settings 

    //Code to handle the exception goes here 
} 

Đây là cách duy nhất mà tôi đã tìm thấy để kiểm tra nếu các cài đặt proxy là chính xác. Tôi đã thử thực hiện một cuộc gọi dịch vụ web đến dịch vụ web của chúng tôi, nhưng không cần thiết lập proxy khi thực hiện cuộc gọi. Nó sẽ hoạt động ngay cả khi tôi có cài đặt proxy không có thật. Tuy nhiên, phương pháp trên không có thành viên thời gian chờ mà tôi có thể tìm và tôi sử dụng DownloadData thay vì DownloadDataAsync vì tôi cần đợi đến khi phương thức được thực hiện để tôi có thể biết được các cài đặt có chính xác hay không trước khi tiếp tục trong chương trình.

Bất kỳ đề xuất nào về phương pháp tốt hơn hoặc công việc xung quanh cho phương pháp này đều được đánh giá cao.

Mike

EDIT: Tôi đã thử một thứ khác, nhưng không may mắn. Tôi đã sử dụng phương thức DownloadDataAsync để tải xuống dữ liệu trong một chuỗi riêng biệt, làm tăng sự kiện DownloadDataCompleted của WebClient khi hoàn tất. Trong khi tôi chờ đợi sự kiện được gọi là tôi có vòng lặp: while (DateTime.Now < downloadStart.AddMinutes (timeout) & &! TestIsDone) {} Sự kiện DownloadDataCompleted đặt thành viên TestIsDone thành true khi sự kiện được gọi. Vấn đề ở đây là nếu các thiết lập proxy là xấu, sự kiện không bao giờ được gọi, không có ngoại lệ nào được ném và chương trình đợi toàn bộ khoảng thời gian chờ trước khi tiếp tục. Đây là mã cho phương pháp này:

public static bool TestProxy(System.Net.WebProxy proxy) 
{ 
    ProxySettingsTestDone = false; //public static var 
    string address = //url to some arbitrary data on our server 

    System.Net.WebClient webClnt = new System.Net.WebClient(); 

    webClnt.Proxy = proxy; 
    webClnt.Credentials = proxy.Credentials; 

    try 
    { 
     webClnt.DownloadDataCompleted += new System.Net.DownloadDataCompletedEventHandler(DownloadDataCallback); 
     webClnt.DownloadDataAsync(new Uri(address)); 

     //Timeout period 
     DateTime dnldStartTime = DateTime.Now; 
     while (DateTime.Now < dnldStartTime.AddMinutes(1.0) && !ProxySettingsTestDone) 
     { } 

     if (!ProxySettingsTestDone) //Exceded timeout 
     { 
      throw new System.Net.WebException("Invalid Proxy Settings"); 
     } 
    } 
    catch (System.Net.WebException e) 
    { 
     if (e.Status == System.Net.WebExceptionStatus.ProxyNameResolutionFailure) 
     { 
      //Proxy failed, server may or may not be there 
      Util.ConnectivityErrorMsg = e.Message; 
      return false; 
     } 
     else if (e.Status == System.Net.WebExceptionStatus.ProtocolError) 
     { 
      //File not found, server is down, but proxy settings succeded 
      ServerUp = false; 
      Util.ConnectivityErrorMsg = e.Message; 
      return true; 
     } 

     return false; 
    } 

    Util.ConnectivityErrorMsg = ""; 
    return true; 
} 

private static void DownloadDataCallback(object sender, System.Net.DownloadDataCompletedEventArgs e) 
{ 
    if (!e.Cancelled && e.Error == null) 
     ProxySettingsTestDone = true; 
    else 
     throw new System.Net.WebException("Invalid Proxy Settings"); 
} 

Xin lỗi về bài đăng dài. Tôi muốn cập nhật câu hỏi này với thông tin mà tôi tìm thấy sau khi thử nghiệm phương pháp mới này.

Cảm ơn, Mike

Trả lời

2

Bạn có thể chạy proxycheck trong một thread riêng biệt. Và xem xét việc kiểm tra thất bại nếu luồng quá dài.

Hoặc bạn có thể sử dụng WebRequest, nó cho phép bạn thiết lập một thời gian chờ:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); 
request.Proxy = proxy; 
request.Timeout = 2000; 

Nếu yêu cầu đã không hoàn thành trong thời gian chờ cho một WebException với Status bất động sản thiết lập để WebExceptionStatus.Timeout sẽ được ném ra.

+1

Tôi sẽ sử dụng phương pháp này và nó hoạt động, nhưng nó có vẻ giống như một sửa chữa kludge. Khi tôi có được thời gian và cơ hội, tôi sẽ thử phương pháp khác có vẻ tốt hơn rất nhiều. Cảm ơn. –

1

Mọi phương pháp được đề cập ở đây đều hợp lệ. Nhưng điều quan trọng nhất là kiểm tra kết nối Proxy bằng cùng một tài khoản người dùng Windows cho quá trình mà bạn muốn thử nghiệm. Nhiều proxy có đặc quyền cụ thể cho mỗi người dùng Windows.

0

Bài đăng gần đây Testing IP:Port proxies giải thích kiểm tra proxy bằng cách sử dụng tập lệnh Python đơn giản. Tập lệnh kiểm tra tính khả dụng và tính chính xác của các máy chủ proxy.

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