У меня интересное поведение с HttpClient из .NET Framework (4.5.1+, 4.6.1 и 4.7.2). Я предложил некоторые изменения в рабочем проекте, чтобы не удалять HttpClient при каждом использовании из-за известной проблемы с интенсивным использованием порта TCP, см. https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/.
Я исследовал изменения, чтобы убедиться, что все работает должным образом, и обнаружил, что мы все еще используем те же порты TIME_WAIT, что и раньше.
Чтобы подтвердить, что мои предложенные изменения были правильными, я добавил в приложение дополнительную трассировку, которая подтверждает, что я использую один и тот же экземпляр HttpClient во всем приложении. С тех пор я использовал простое тестовое приложение (взято с сайта aspnetmonsters, указанного выше.
using System;
using System.Net.Http;
namespace ConsoleApplication
{
public class Program
{
private static HttpClientHandler { UseDefaultCredentials = true };
private static HttpClient Client = new HttpClient(handler);
public static async Task Main(string[] args)
{
Console.WriteLine("Starting connections");
for(int i = 0; i<10; i++)
{
var result = await Client.GetAsync("http://localhost:51000");
Console.WriteLine(result.StatusCode);
}
Console.WriteLine("Connections done");
Console.ReadLine();
}
}
}
Проблема возникает только при подключении к сайту, размещенному в IIS, с использованием проверки подлинности Windows. Я могу легко воспроизвести проблему, установив для параметра Аутентификация значение Анонимный (проблема исчезнет) и обратно на Аутентификацию Windows (проблема повторяется).
Проблема с проверкой подлинности Windows, по-видимому, не ограничивается рамками поставщика. У него та же проблема, если вы используете Negotiate или NTLM. Также проблема возникает, если машина является просто рабочей станцией или частью домена.
Из интереса я создал консольное приложение dotnet core 2.1.0, и проблема вообще отсутствует и работает как положено.
TLDR: Кто-нибудь знает, как это исправить, или это, скорее всего, ошибка?