Единственный экземпляр HttpClient против нескольких экземпляров с ClientCredentias? - PullRequest
0 голосов
/ 19 марта 2020

Я использую HttpClient, чтобы сделать запрос к Soap Api. Я видел, что рекомендуется использовать один экземпляр HttpClient вместо этого один раз для каждого запроса, чтобы избежать SocketException.

В моем приложении для настольного компьютера мне нужно сделать несколько запросов, каждый с разными учетными данными. Я делаю это как пример кода:

WebRequestHandler requestHandler = new WebRequestHandler();
requestHandler.ClientCertificates.Add(certificate);

using(var client = new HttpClient(requestHandler))
{
    try
    {
        HttpResponseMessage response = await client.PostAsync("https://nfe-homologacao.svrs.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao4.asmx", httpContent);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();
        return responseBody;
    }
    catch (HttpRequestException e)
    {
        return e.Message;
    }
}

Однако я бы хотел избежать создания экземпляра HttpClient для каждого запроса. Я понял, что правильным способом является использование экземпляра stati c следующим образом:

static readonly HttpClient client = new HttpClient();

Но с экземпляром stati c я не могу установить учетные данные с помощью WebRequestHandler. Обратите внимание, что учетные данные меняются при каждом запросе.

Как лучше выполнять все запросы, избегая SocketException и используя разные учетные данные?

1 Ответ

2 голосов
/ 19 марта 2020

Обычно для каждого запроса должны быть установлены учетные данные:

var request = new HttpRequestMessage();
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer");
await client.SendAsync(request);

Вы также можете сделать это в своем собственном обработчике веб-запроса:

class SetCredentialsWebRequestHandler : WebRequestHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer");
        return base.SendAsync(request, cancellationToken);
    }
}

client = new HttpClient(new SetCredentialsWebRequestHandler());
await client.PostAsync(url);

ОБНОВЛЕНИЕ

Из комментариев я узнал, что вопрос требует использования сертификата аутентификации. Так что в этом случае несколько экземпляров (по одному на сертификат) были бы лучшим вариантом.

Не будет смысла повторно использовать одно и то же соединение для другого сертификата клиента.

Проверьте это имя HttpClient: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#named -клиенты

HttpClient могут быть названы в соответствии с сертификатом.

...