У меня есть 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
HttpClient получил ошибку при использовании метода ChooseSslConnectionAsync в методе SendAsync ⇐ C#
Место общения программистов C#
1771812096
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);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77272263/httpclient-got-error-with-establishsslconnectionasync-at-sendasync-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия