HttpClient получил ошибку при использовании метода ChooseSslConnectionAsync в методе SendAsyncC#

Место общения программистов C#
Ответить
Anonymous
 HttpClient получил ошибку при использовании метода ChooseSslConnectionAsync в методе SendAsync

Сообщение Anonymous »

У меня есть ApiAdapter с использованием HttpClient для отправки HTTP-запросов на мой сервер.
Чтобы избежать создания множества HttpClient, я использую DependenceInjection с одноэлементным режимом для класса «ApiAdapter». он работает хорошо, когда я вызываю только один HTTP-запрос.
Я хочу использовать Parallel.ForEachAsync, чтобы сократить время производительности, потому что я хочу создать 1000 человек через ApiAdapter.
Он выдает исключение с ошибкой сообщения ниже после создания ~ 30–100 человек
с сообщением:
System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
---> System.ArgumentNullException: Value cannot be null. (Parameter 'value')
at System.Collections.CollectionBase.OnValidate(Object value)
at System.Security.Cryptography.X509Certificates.X509CertificateCollection.OnValidate(Object value)
at System.Collections.CollectionBase.System.Collections.IList.Add(Object value)
at System.Security.Cryptography.X509Certificates.X509CertificateCollection.AddRange(X509CertificateCollection value)
at System.Net.Security.CertificateHelper.GetEligibleClientCertificate(X509CertificateCollection candidateCerts)
at System.Net.Http.HttpClientHandler.b__57_0(Object sender, String targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, String[] acceptableIssuers)
at System.Net.Security.SslStream.UserCertSelectionCallbackWrapper(String targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, String[] acceptableIssuers)
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
at System.Net.Security.SecureChannel.GenerateToken(ReadOnlySpan`1 inputBuffer, Byte[]& output)
at System.Net.Security.SecureChannel.NextMessage(ReadOnlySpan`1 incomingBuffer)
at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)
at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(HttpRequestMessage request)
at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, Cancellatio
nToken originalCancellationToken)
at ---------.ApiAdapter.PostRequestAsync

Вот мой код
public async Task RequestPerson()
{
var threadRequestPins = Enumerable.Range(0, listSize).ToList();
await Parallel.ForEachAsync(datasToProcess, async (_, token) =>{
var fakfurTestApiService = LoadTestKernel.Kernel.Get();
var personCreated = await fakfurTestApiService.CallPostRequestAsync(, );
//CallPostRequestAsync will call ApiAdapter with PostRequestAsync() method below
});
}

//constructor
public ApiAdapter()
{
_cookieContainer = new CookieContainer();
_httpClientHandler = new HttpClientHandler
{
CookieContainer = _cookieContainer
};
_httpClient = new HttpClient(_httpClientHandler);
}

private void AddCertificates()
{
if (_certificate2Collection != null )
{
_httpClientHandler.ClientCertificates.AddRange(_certificate2Collection);
}
}

public async Task PostRequestAsync(string testApiRelativeUrl, TBodyRequest bodyRequest,
CancellationToken cancellationToken = default) where TResult : class
{
var uriBuilder = BuildRequestUri(testApiRelativeUrl);
var request = new HttpRequestMessage(HttpMethod.Post, uriBuilder.Uri);
AddCertificate(request);
request.Content = new StringContent(_jsonSerializer.SerializeObject(bodyRequest), Encoding.UTF8,;
var response = await _httpClient.SendAsync(request, cancellationToken);
return await ExtractBodyFromResponseAsync(response);
}



Подробнее здесь: https://stackoverflow.com/questions/772 ... ync-method
Ответить

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

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

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

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

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