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

问题描述 投票:0回答:1

我正在使用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并使用其他凭证的更好方法是什么?

c# httpclient x509certificate credentials socketexception
1个回答
1
投票

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

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

您也可以在自己的Web请求处理程序中执行此操作:

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);

UPDATE

[从评论中,我了解到该问题要求使用证书身份验证。因此,在这种情况下,最好使用多个实例(每个证书一个)。

没有意义将同一连接用于不同的客户端证书。

查看此名为HttpClient的地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#named-clients

HttpClient可以根据证书命名。

© www.soinside.com 2019 - 2024. All rights reserved.