Я пишу функцию для проверки соединения с прокси-сервером.Пользователю необходимо заполнить веб-форму и указать следующее:
- IP-адрес прокси-сервера
- Порт прокси-сервера
- Проверить флажок, если требуется проверка подлинности
- Если флажок аутентификации установлен, то пользователю необходимо указать имя пользователя и пароль.
Прокси-сервер, который я использую для модульного тестирования, требует аутентификации.
Он будет работать для обоихследующие сценарии выдают исключение:
- TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", false);// выдает ошибку, когда требуется аутентификация
- TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", true, "Incorrect_Username", "Incorrect_Password"); // выдает ошибку, если требуется аутентификация
Странное поведение, которое я получаю, заключается в том, что когда я делаю следующее:
- Я вызываю метод с правильным IP и правильными учетными данными - TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", true, "Correct_Username", "Correct_Password") ;.Это не подведет, так как все правильно.
- Тогда я пытаюсь с правильным IP и без учетных данных.TestProxy.TestProxySettingsWithWebclient (url, "Correct_IP_Address", "Correct_Port", false) ;.Это проходит, и никакое исключение не происходит, и это неправильно, поскольку этот прокси-сервер нуждается в аутентификации.d
- Затем я пытаюсь с правильным 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;
}