HttpClient 的单个实例与 ClientCredentias 的多个实例?

Single Instance of HttpClient vs Multiples Instances with ClientCredentias?

我正在使用 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 实例。我看到正确的方法是像这样使用静态实例:

static readonly HttpClient client = new HttpClient();

但是对于静态实例,我无法使用 WebRequestHandler 设置凭据。请注意,每个请求中的凭据都会发生变化。

执行所有请求、避免 SocketException 和使用不同凭据的更好方法是什么?

通常应为每个创建的请求设置每个请求凭据:

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-clients

HttpClient可以根据证书命名。