Я отправляю запрос cURL с использованием HttpClient по методу, описанному здесь.
Параметр, используемый для этого метода:
SelectedProxy = пользовательский класс, в котором хранятся параметры моего прокси
Parameters.WcTimeout = время ожидания
url, header, content = запрос cURL (на основе этого инструмента для преобразования в C # https://curl.olsh.me/).
const SslProtocols _Tls12 = (SslProtocols)0x00000C00;
const SecurityProtocolType Tls12 = (SecurityProtocolType)_Tls12;
ServicePointManager.SecurityProtocol = Tls12;
string source = "";
using (var handler = new HttpClientHandler())
{
handler.UseCookies = usecookies;
WebProxy wp = new WebProxy(SelectedProxy.Address);
handler.Proxy = wp;
using (var httpClient = new HttpClient(handler))
{
httpClient.Timeout = Parameters.WcTimeout;
using (var request = new HttpRequestMessage(new HttpMethod(HttpMethod), url))
{
if (headers != null)
{
foreach (var h in headers)
{
request.Headers.TryAddWithoutValidation(h.Item1, h.Item2);
}
}
if (content != "")
{
request.Content = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");
}
HttpResponseMessage response = new HttpResponseMessage();
try
{
response = await httpClient.SendAsync(request);
}
catch (Exception e)
{
//Here the exception happens
}
source = await response.Content.ReadAsStringAsync();
}
}
}
return source;
Если я запускаю это без прокси, это работает как шарм.
Когда я отправляю запрос с использованием прокси-сервера, который я сначала тестировал в Chrome, у меня возникает следующая ошибка при попытке {} catch {}. Вот дерево ошибок
{"An error occurred while sending the request."}
InnerException {"Unable to connect to the remote server"}
InnerException {"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond [ProxyAdress]"}
SocketErrorCode: TimedOut
Используя секундомер, я вижу, что тайм-аут произошел примерно через 30 секунд.
Я пробовал несколько разных обработчиков, основываясь на следующих ссылках В чем разница между HttpClient.Timeout и использованием свойств тайм-аута WebRequestHandler? , Путаница с тайм-аутом HttpClient или с WinHttpHandler.
Стоит отметить, что WinHttpHandler допускает использование другого кода ошибки, то есть ошибка 12002, вызывающая WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, «Тайм-аут операции». Основная причина та же самая, хотя она помогла нацелиться на места ошибок (например, WinInet), что подтверждает также то, что @DavidWright говорил относительно того, что таймауты от HttpClient управляют другой частью отправки запроса.
Следовательно, моя проблема связана со временем, которое требуется для установления соединения с сервером, которое запускает 30-секундный таймаут из WinInet.
Мой вопрос: как изменить время ожидания?
Стоит отметить, что Chrome, использующий WinInet, не страдает от этого тайм-аута, как и Cefsharp, на котором основана большая часть моего приложения, и с помощью которого те же прокси-серверы могут правильно отправлять запросы. .