Каков предпочтенный или принятый метод для тестирования настроек прокси?

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

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

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 по окончании. В то время как я ожидаю события, которое назовут, у меня есть цикл: в то время как (DateTime. Теперь <downloadStart. AddMinutes (тайм-аут) &&! TestIsDone) {} событие DownloadDataCompleted устанавливает члена TestIsDone на истинный, когда событие называют. Проблема здесь состоит в том, если настройки прокси плохи, Событие никогда не называют, никакое исключение не выдается, и программа ожидает в течение всего периода тайм-аута перед продолжением. Вот код для этого подхода:

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

6
задан Mike Webb 25 March 2010 в 22:08
поделиться

2 ответа

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

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

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

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

2
ответ дан 17 December 2019 в 18:13
поделиться

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

1
ответ дан 17 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: