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
可以根据证书命名。
我正在使用 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
可以根据证书命名。