TlsException: не удалось выполнить рукопожатие после отправки нескольких веб-запросовC#

Место общения программистов C#
Ответить
Anonymous
 TlsException: не удалось выполнить рукопожатие после отправки нескольких веб-запросов

Сообщение Anonymous »

После того, как я отправил около 1500-1700 веб-запросов (всегда в этом диапазоне), я получаю следующую ошибку:
TlsException: Handshake failed - error code: UNITYTLS_INTERNAL_ERROR, verify result: UNITYTLS_X509VERIFY_NOT_DONE
Перезапуск Unity «обновляет» квоту, и я могу снова отправлять примерно такое же количество запросов.
Я создаю webscraper, и мне нужно отправить около 14000 запросов.
Между каждым запросом происходит задержка, и я отправляю максимум 5 одновременно, чтобы избежать перегрузки сервера.
Я также попробовал следующий веб-сайт для тестирования, но получил ту же ошибку:
https://httpbin.org/
Вот мой HttpClient:
private static readonly Lazy httpClient = new(() => new HttpClient(new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
ClientCertificateOptions = ClientCertificateOption.Automatic,
SslProtocols = SslProtocols.None
})
{
BaseAddress = new Uri("https://yugioh.fandom.com/"),
Timeout = TimeSpan.FromSeconds(HTTPCLIENT_TIMEOUT),
DefaultRequestHeaders =
{
ConnectionClose = true
}
});

Изменение настроек в HttpClient (или отсутствие пользовательских настроек вообще) не решает проблему.
Я читал, что UnityWebRequest может не быть этих проблем, но его можно вызвать только из основного потока, и я не хочу реструктурировать все для использования сопрограмм.
РЕДАКТИРОВАТЬ:Вот код, который я использую для отправки запросов и чтения потока контента.
internal static async Task DownloadAsync(URL _URL, Func _ProcessLine, Func _StopCondition, CancellationToken _CancellationToken)
{
using var _cancellationTokenSource = new CancellationTokenSource();
using var _linkedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_CancellationToken, _cancellationTokenSource.Token);

var (_statusCode, _contentStream) = await DownloadAsStreamAsync(_URL, _linkedCancellationTokenSource.Token);

if (_contentStream == null)
{
return _statusCode;
}

using (var _streamReader = new StreamReader(_contentStream))
{
while (await _streamReader.ReadLineAsync() is {} _currentLine)
{
await _ProcessLine(_currentLine);

if (_StopCondition())
{
_cancellationTokenSource.Cancel();
return CustomHttpStatusCode.Stopped;
}
}
}

return _statusCode;
}
private static async Task DownloadAsStreamAsync(URL _URL, CancellationToken _CancellationToken)
{
var _semaphoreAcquired = false;
var _attempt = 1;
var _httpStatusCode = CustomHttpStatusCode.Null;
Stream? _contentStream = null;

do
{
try
{
await Task.Delay(1000, _CancellationToken);
await semaphoreSlim.Value.WaitAsync(_CancellationToken);
_semaphoreAcquired = true;

// I can't add a "using" here since the stream would already be disposed when i try to access it in "DownloadAsync".
var _response = await httpClient.Value.GetAsync(_URL.AbsoluteUri, HttpCompletionOption.ResponseHeadersRead, _CancellationToken);

_httpStatusCode = _response.EnsureSuccessStatusCode().StatusCode.ToCustomHttpStatusCode();
_contentStream = await _response.Content.ReadAsStreamAsync();

return (_httpStatusCode, _contentStream);
}
catch (TaskCanceledException) when (_CancellationToken.IsCancellationRequested) { /* Expected behavior. */ }
catch (Exception _exception)
{
Debug.LogException(_exception.CustomMessage($"Download attempt [{_attempt}] aborted: {_URL.Bold()} [{_httpStatusCode}]"));
await Task.Delay(5000 * _attempt++, _CancellationToken);
}
finally
{
if (_semaphoreAcquired)
{
semaphoreSlim.Value.Release();
}
}

} while (!_CancellationToken.IsCancellationRequested && _attempt

Подробнее здесь: https://stackoverflow.com/questions/790 ... b-requests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»