Тестирование соединения WebProxy странное поведение - PullRequest
0 голосов
/ 11 декабря 2018

Я пишу функцию для проверки соединения с прокси-сервером.Пользователю необходимо заполнить веб-форму и указать следующее:

  1. IP-адрес прокси-сервера
  2. Порт прокси-сервера
  3. Проверить флажок, если требуется проверка подлинности
  4. Если флажок аутентификации установлен, то пользователю необходимо указать имя пользователя и пароль.

Прокси-сервер, который я использую для модульного тестирования, требует аутентификации.

Он будет работать для обоихследующие сценарии выдают исключение:

  1. TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", false);// выдает ошибку, когда требуется аутентификация
  2. TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", true, "Incorrect_Username", "Incorrect_Password"); // выдает ошибку, если требуется аутентификация

Странное поведение, которое я получаю, заключается в том, что когда я делаю следующее:

  1. Я вызываю метод с правильным IP и правильными учетными данными - TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", true, "Correct_Username", "Correct_Password") ;.Это не подведет, так как все правильно.
  2. Тогда я пытаюсь с правильным IP и без учетных данных.TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", false) ;.Это проходит, и никакое исключение не происходит, и это неправильно, поскольку этот прокси-сервер нуждается в аутентификации.d
  3. Затем я пытаюсь с правильным IP и без учетных данных.TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", true, "Incorrect_Username", "Incorrect_Password") ;.Он также не выдает никаких исключений, что является неправильным.

В основном, когда я использую правильный IP, правильный порт, правильное имя пользователя и пароль, затем после этого, если попытаться с тем же IP и тем же портом, но сневерные учетные данные или, при отсутствии учетных данных, тест всегда проходит и исключений не возникает.Что не так.

Может кто-нибудь подсказать мне, что я делаю неправильно?

Ниже приведена функция, которую я написал для проверки соединения с прокси-сервером:

public static bool TestProxySettings(string urlToHit, string proxyAddress, int? port,
        bool isAuthenticationRequired,
        string userName = null, string password = null)
    {
        string url = urlToHit + "?time=" + DateTime.Now.Ticks;
        NetworkCredential networkCredential = null;

        if (port.HasValue)
            proxyAddress += ":" + port.Value;

        if (isAuthenticationRequired)
            networkCredential = new NetworkCredential(userName, password);

        try
        {
            WebProxy proxy = new WebProxy(proxyAddress)
            {
                UseDefaultCredentials = false,
                BypassProxyOnLocal = false,
                Credentials = networkCredential
            };

            using (WebClient client = new WebClient())
            {
                client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
                client.Proxy = new WebProxy();
                client.Proxy = proxy;
                var downloadString = client.DownloadString(url);
            }
        }
        catch (WebException ex)
        {
            // ex.Response will be null if it fails at proxy server level
            if (ex.Response == null || ((HttpWebResponse) ex.Response).StatusCode ==
                HttpStatusCode.ProxyAuthenticationRequired)
            {
                Console.Write(@"An error has occurred while contacting the proxy server: ""{0}""", ex.Message);
            }
            else
            {
                Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""",
                    url, ex.Message);
            }

            return false;
        }
        catch (Exception ex)
        {
            Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""", url,
                ex.Message);

            return false;
        }

        return true;
    }

Примечание: Я пытался использовать HttpClient и HttpWebRequest, но у меня возникла та же проблема.

По примеру HttpClient:

public static bool TestProxySettingsWithHttpClient(string urlToHit, string proxyAddress, int? port,
            bool isAuthenticationRequired,
            string userName = null, string password = null)
        {
            string url = urlToHit + "?time=" + DateTime.Now.Ticks;
            NetworkCredential networkCredential = null;

            if (port.HasValue)
            {
                proxyAddress += ":" + port.Value;
            }

            if (isAuthenticationRequired)
                networkCredential = new NetworkCredential(userName, password);

            try
            {
                WebProxy proxy = new WebProxy(proxyAddress)
                {
                    UseDefaultCredentials = false,
                    BypassProxyOnLocal = false,
                    Credentials = networkCredential
                };

                using (var handler = new HttpClientHandler() {Proxy = proxy, UseProxy = true})
                using (HttpClient client = new HttpClient(handler) {BaseAddress = new Uri(urlToHit)})
                {
                    var downloadString = client.GetAsync("/").Result;
                }
            }
            catch (WebException ex)
            {
                // ex.Response will be null if it fails at proxy server level
                if (ex.Response == null || ((HttpWebResponse) ex.Response).StatusCode ==
                    HttpStatusCode.ProxyAuthenticationRequired)
                {
                    Console.Write(@"An error has occurred while contacting the proxy server: ""{0}""", ex.Message);
                }
                else
                {
                    Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""",
                        url, ex.Message);
                }

                return false;
            }
            catch (Exception ex)
            {
                Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""", url,
                    ex.Message);

                return false;
            }

            return true;
        }

Ниже приведен пример HttpWebRequest и HttpWebResponse:

public static bool TestProxySettingsWithHttpWebRequest(string urlToHit, string proxyAddress, int? port,
            string userName, string password, bool isAuthenticationRequired)
        {
            string url = urlToHit + "?time=" + DateTime.Now.Ticks;
            var uriBuilder = new UriBuilder(url);
            NetworkCredential networkCredential = null;
            HttpWebRequest request = null;
            WebProxy proxy = null;
            var timeoutSettings = 50000;

            if (port.HasValue)
            {
                proxyAddress += ":" + port.Value;
            }

            if (isAuthenticationRequired)
            {
                networkCredential = new NetworkCredential(userName, password);
            }

            try
            {
                request = (HttpWebRequest) WebRequest.Create(uriBuilder.Uri);

                proxy = new WebProxy(proxyAddress);
                proxy.UseDefaultCredentials = false;
                proxy.BypassProxyOnLocal = false;
                proxy.Credentials = networkCredential;

                request.Timeout = timeoutSettings;
                request.Accept = "*/*";
                request.KeepAlive = false;
                request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
                request.Proxy = proxy;

                using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
                {
                    // no action required
                }
            }
            catch (WebException ex)
            {
                // ex.Response will be null if it fails at proxy server level
                if (ex.Response == null || ((HttpWebResponse) ex.Response).StatusCode ==
                    HttpStatusCode.ProxyAuthenticationRequired)
                {
                    Console.Write(@"An error has occurred while contacting the proxy server: ""{0}""", ex.Message);
                }
                else
                {
                    Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""",
                        url, ex.Message);
                }

                return false;
            }
            catch (Exception ex)
            {
                Console.Write(@"An error has occurred while contacting ""{0}"" using the proxy server: ""{1}""", url,
                    ex.Message);

                return false;
            }
            finally
            {
                request = null;
            }

            return true;
        }
...