我在C#.net核心上编写Web api,并使用IHttpClientFactory创建httpClient。我在ConfigurationServices中的Startup.cs上对其进行了自定义。 A
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。是正常的还是使用一个客户端实例会更正确?
我已经了解了ClientFactory docs.Microsoft,this以及一些站点。
答案 0 :(得分:1)
在单个请求的范围内,通常仅使用一个HttpClient
。但是,如果比较容易,您可以从IHttpClientFactory
获取多个实例。 HttpClient
本身只是一个薄包装器,因此多个实例的影响不大。重要的部分是这些实例来自IHttpClientFactory
,它们在多个HttpMessageHandler
实例之间共享HttpClient
。
代码中唯一不寻常的部分是using
语句;通常,不会丢弃HttpClient
实例(在IHttpClientFactory
世界中仍然如此)。但是这种处理方法不是 bad ;只是有点不寻常。