У меня есть функция Azure (v2), запускаемая BLOB-объектами, размещенная в App Service plan(S3)
. Функция обрабатывает файл json и создает Http calls
для API, предоставляемых в службе управления API.
Я использую HttpClient
для совершения Http
звонков. Хотя это работает нормально в одной среде с такой же настройкой, это происходит сбой при выполнении http-вызовов в другой среде.
Исключение:
System.Net.Sockets.SocketException
с сообщением об ошибке
«Операция была отменена. Невозможно прочитать данные из транспортного соединения: операция ввода-вывода была прервана из-за выхода из потока или из-за запроса приложения. Операция ввода-вывода была прервана из-за выхода из потока или из-за Запрос заявки "
Быстрое поиск в Google показал, что это может произойти из-за избыточных http-соединений. Подробнее здесь:
https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections#connections-limit
Решением было использование статического HttpClient
или масштабирование плана обслуживания приложения. Я сделал оба, только чтобы понять, что это все еще терпит неудачу за тем же исключением.
Кто-нибудь сталкивался с этой проблемой?
Любые идеи будут полезны.
Редактировать: вот код, который делает http-вызов
public class ReportingService : IReportingService
{
private static readonly HttpClient _httpClient = new HttpClient();
private readonly ILogger _logger;
public ReportingService(ILogger<ReportingService> logger, IConfigurationRoot configuration)
{
_logger = logger;
_httpClient.BaseAddress = new Uri(configuration["ReportingServiceBaseUrl"]);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{configuration["APIUser"]}:{configuration["APIPassword"]}")));
}
public async Task<bool> RequestReport(string endpoint, StringContent httpContent)
{
try
{
var response = await _httpClient.PostAsync(endpoint, httpContent);
return response.IsSuccessStatusCode;
}
catch (Exception ex)
{
_logger.LogError(ex, "Migration failed");
throw;
}
}
}