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