Я пишу веб-API на ядре C # .net и использую IHttpClientFactory для создания httpClients. Я настраиваю это на Startup.cs в ConfigurationServices. 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;
});
Затем я использую его в одном dataProvider через DI.
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 и другие объекты описываются как SingleInstance в DI.
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 , , , а также о некоторых сайтах.