Какой метод проверки или настройки предпочтителен или принят? - PullRequest
6 голосов
/ 25 марта 2010

У меня много проблем с подключением к Интернету в программе, над которой я работаю, и кажется, что все это происходит из-за некоторых проблем с настройками прокси. Большинство проблем на данный момент устранены, но проблема, с которой я столкнулся сейчас, заключается в том, что мой метод тестирования настроек прокси заставляет некоторых пользователей ждать в течение длительных периодов времени.

Вот что я делаю:

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
}

Это единственный способ проверить правильность настроек прокси. Я попытался позвонить через веб-службу в наш веб-сервис, но при выполнении вызова настройки прокси-сервера не требуются. Это будет работать, даже если у меня есть фиктивные настройки прокси. Вышеупомянутый метод, тем не менее, не имеет элемента тайм-аута, который я могу установить, который я могу найти, и я использую DownloadData в отличие от DownloadDataAsync, потому что мне нужно подождать, пока метод не будет сделан, чтобы я мог знать, правильны ли настройки, прежде чем продолжить в программе.

Любые предложения о лучшем методе или обходном пути для этого метода приветствуются.

Mike

РЕДАКТИРОВАТЬ: Я пытался что-то еще, но не повезло. Я использовал метод DownloadDataAsync для загрузки данных в отдельном потоке, который вызывает событие DownloadDataCompleted WebClient по завершении. Пока я жду, когда событие будет вызвано, у меня есть цикл: while (DateTime.Now

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");
}

Извините за длинный пост. Я хотел обновить этот вопрос информацией, которую я нашел после тестирования этого нового подхода.

Спасибо, Mike

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

Вы можете запустить прокси-чек в отдельном потоке. И считают проверку неудачной, если поток занимает слишком много времени.

Или вы можете использовать WebRequest, он позволяет установить время ожидания:

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

Если запрос не завершен в течение заданного времени ожидания, будет выдано WebException со свойством Status, установленным на WebExceptionStatus.Timeout.

1 голос
/ 12 апреля 2010

Каждый метод, упомянутый здесь, действителен.Но самое важное - это проверить соединение Proxy с использованием той же учетной записи пользователя Windows для процесса, который вы хотите протестировать.Многие прокси имеют определенные привилегии для каждого пользователя Windows.

0 голосов
/ 28 ноября 2013

Недавнее сообщение Проверка IP: прокси портов объясняет проверку прокси с помощью простого скрипта Python. Скрипт проверяет доступность и корректность прокси-серверов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...