Получить `Существующее соединение было принудительно закрыто удаленным хостом` при подключении к Azure Frontdoor с HttpClient - PullRequest
1 голос
/ 02 мая 2020

У нас есть код. NET, который вызывает Azure веб-сайтов, стоящих позади Azure Входная дверь . Код использует HttpClient, чтобы сделать вызов очень простым способом. Мы начали получать следующую ошибку при обращении к нашим сайтам через Azure Frontdoor.

Существующее соединение было принудительно закрыто удаленным хостом

  • Это происходит с. NET Framework 4.6,. NET Framework 4.7, &. NET Core 3.1.
  • Фактическое имя сайта Frontdoor не имеет значения. Все, что заканчивается на xxxx.azurefd.net, генерирует эту ошибку.
  • Один и тот же код может напрямую воздействовать на приложения.
  • Я могу повторить эту ошибку на разных Windows машинах. Мой ноутбук работает Windows 10. Мы также видели такое поведение на Windows Server 2012 и других машинах с Windows 10. Это корпоративные компьютеры, которые иногда работают за прокси-серверами, но они по-прежнему выдают ошибку, даже если нет за брандмауэром / прокси.
  • Мы подозревали, что это некоторый тип ошибки, связанной с TLS, поскольку Azure Frontdoor поддерживает TLS1.2, только если вы не используете настраиваемый домен, но добавление TLS12 явно не Кажется, не помогает вообще.

Следующий код создает проблему.

static async Task Main(string[] args)
{
    if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Tls12) == false)
    {
        ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls12;
    }

    ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
    Console.WriteLine($"Protocol: {ServicePointManager.SecurityProtocol}");

    var client = new HttpClient { BaseAddress = new Uri("https://anything.azurefd.net") };

    try
    { 
        var result = await client.GetAsync("someroute");
        Console.WriteLine(await result.Content.ReadAsStringAsync());
    }
    catch(Exception e)
    {
        while(e != null)
        {
            Console.WriteLine(e.Message);
            e = e.InnerException;
        }
    }

    Console.ReadLine();
}

Заранее спасибо.

...