// register service
services.AddHttpClient("NoProxy")
.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler
{
UseProxy = false,
Proxy = null
};
});
// g2g function
public async Task GetResponseUsingFactory(CitizenReq request)
{
var json = JsonConvert.SerializeObject(request);
var data = new StringContent(json, Encoding.UTF8, "application/json");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback =
delegate (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true; // Always accept
};
var client = _httpClientFactory.CreateClient("NoProxy");
client.DefaultRequestHeaders.Add("user_key", _apiKey);
// client.DefaultRequestHeaders.ConnectionClose = _keep_alive;
client.DefaultRequestHeaders.Add("Connection", _connection);
_logger.LogInformation($"API request : {JsonConvert.SerializeObject(request)}");
var response = new HttpResponseMessage();
response = await _retryPolicy.JustHttpRetry.ExecuteAsync(() =>
client.PostAsync($"{_g2gUrl}/api/validateCitizenData", data));
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsStringAsync();
_logger.LogInformation($"API response : {JsonConvert.SerializeObject(response)}");
return JsonConvert.DeserializeObject(result,
new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Ignore })!;
}
else
{
//send email
await FailedNotification();
throw new Exception("G2G API is down");
}
}
Каждый раз при запуске службы мы получаем ошибку 408 таймаута соединения. Если мы сделали второй вызов, все проходит гладко.
Мы провели расследование и выяснили, что заголовок соединения не настроен на закрытие. Фабрика клиента, похоже, не может предоставить его сеансу, хотя мы это явно запрограммировали.
Мы пытались установить режим простоя время ожидания HTTP-соединений в IIS составляет 1 минуту, чтобы соединение не оставалось открытым, но, похоже, это ничего не дает.
У кого-нибудь есть идеи, что мы можем исследовать дальше?
Мы используем IHttpClientFactory для подключения к внешней службе с помощью следующего кода: [code]// register service services.AddHttpClient("NoProxy") .ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler { UseProxy = false, Proxy = null }; });
// g2g function public async Task GetResponseUsingFactory(CitizenReq request) { var json = JsonConvert.SerializeObject(request); var data = new StringContent(json, Encoding.UTF8, "application/json");
if (response.IsSuccessStatusCode) { var result = await response.Content.ReadAsStringAsync(); _logger.LogInformation($"API response : {JsonConvert.SerializeObject(response)}"); return JsonConvert.DeserializeObject(result, new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Ignore })!; } else { //send email await FailedNotification(); throw new Exception("G2G API is down"); } } [/code] Каждый раз при запуске службы мы получаем ошибку 408 таймаута соединения. Если мы сделали второй вызов, все проходит гладко. [list] [*]Мы провели расследование и выяснили, что заголовок соединения не настроен на закрытие. Фабрика клиента, похоже, не может предоставить его сеансу, хотя мы это явно запрограммировали.
[*]Мы пытались установить режим простоя время ожидания HTTP-соединений в IIS составляет 1 минуту, чтобы соединение не оставалось открытым, но, похоже, это ничего не дает.
[/list] У кого-нибудь есть идеи, что мы можем исследовать дальше?