c# - 即使我可以使用实例两次或更多次,我是否可以始终创建 IHttpClientFactory 的新实例?
问题描述
我在 .NET Core 中编写了一个 WebAPI,并使用 IHttpClientFactory 来创建 httpClients。我在 ConfigurationServices 的 Startup.cs 上对其进行了自定义。
services.AddHttpClient("ITSMServiceClient", m =>
{
m.DefaultRequestHeaders.Accept.Clear();
m.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
}).SetHandlerLifetime(TimeSpan.FromMinutes(10))
.ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler()
{
AllowAutoRedirect = false,
UseCookies = false
};
// Отключаем проверку валидности http-сертификата (если необходимо)
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback =
(httpRequestMessage, cert, cetChain, policyErrors) => true;
return handler;
});
然后我通过 DI 在一个 dataProvider 中使用它。
private readonly IHttpClientFactory _clientFactory;
public ExecuteDataProvider(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
我将此提供者的方法用于所有发送请求
public async Task<HttpResponseMessage> PostAsync(HttpRequestMessage request)
{
using (var client = _clientFactory.CreateClient("ITSMServiceClient"))
{
return await client.SendAsync(request);
}
}
我有一个问题。即使我可以在代码中重复使用实例两次或更多次,是否总是从 _clientFactory 获取新实例?我所有的 dataProvider 和其他实体都描述为 DI 中的 SingleInstance。
builder.RegisterType<ExecuteDataProvider>().As<IExecuteDataProvider>().SingleInstance();
现在我使用它是这样的:
var request = CreatePostRequest(url, parameters, jParameters, checkingToken);
HttpResponseMessage httpResponseMessage = await _executeCoreDataProvider.PostAsync(request);
if (await CheckingForUnauthorizedToken(httpResponseMessage, checkingToken))
{
request = CreatePostRequest(url, parameters, jParameters, checkingToken);
httpResponseMessage = await _executeCoreDataProvider.PostAsync(request);
}
response = await httpResponseMessage.Content.ReadAsStringAsync();
httpResponseMessage.Dispose();
而且我担心两次获得 HttpClient。这是正常的还是使用一个客户端实例会更正确?
我已经在Microsoft Docs上阅读了有关 ClientFactory 的信息;这个,还有其他一些网站。
解决方案
在单个请求的范围内,只使用一个HttpClient
. 但是,如果它更容易,您可以从IHttpClientFactory
. 它HttpClient
本身只是一个薄包装器,因此多个实例不会产生太大影响。重要的部分是这些实例来自,它在多个实例之间IHttpClientFactory
共享。HttpMessageHandler
HttpClient
代码中唯一不寻常的部分是using
语句;通常,HttpClient
不会处理实例(这在IHttpClientFactory
世界上仍然是正确的)。但这种处置还不错;只是有点不寻常。
推荐阅读
- git - 在提交之前执行 CHECKOUT GIT commad
- typescript - 创建新的 ApolloClient 实例时如何提供 TCache 类型?
- javascript - `require.resolve()` 卸载后仍然检测模块?
- c++ - 通过构造函数方法输出的类到类类型转换是5500 为什么不是5555
- mysql - 在 WHERE 子句中是否有用于编写带有函数的 SQL SELECT 语句的 Django 等效项?
- html - 按下搜索栏时如何勾勒出整个容器的轮廓?
- excel - 将分数视为 FALSE 的逻辑运算符
- python-3.x - 在 Centos 上安装 gir1.2-gtk-3.0
- swift - 查询键编码在 URLComponent 的 url 中
- c# - EFCore scaffold database and migrate to another context at runtime