我正在使用.NET Framework中的HttpClient(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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
仅当使用Windows身份验证连接到IIS中承载的站点时,才会出现此问题.通过将身份验证设置为匿名(问题消失)并返回到Windows身份验证(问题重新出现),我可以轻松地重现该问题.
Windows身份验证的问题似乎不仅限于提供程序的范围.如果您使用Negotiate或NTLM,它也会遇到同样的问题.如果机器只是工作站或域的一部分,也会出现问题.
出于兴趣,我创建了一个dotnet核心2.1.0控制台应用程序,该问题根本不存在,并按预期工作.
TLDR:有没有人知道如何解决这个问题,或者它可能是一个错误?