我对更改进行了调查以确保事情按预期进行,结果发现我们仍然遇到与之前相同的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();
}
}
}
只有在使用Windows身份验证托管在IIS中的站点时,才会出现此问题。 我可以通过将身份验证设置为匿名(问题消失)然后再更改回Windows身份验证(问题重新出现)来轻松地重现该问题。
Windows身份验证的问题似乎不限于提供程序的范围。 如果您使用Negotiate或NTLM,则也存在相同的问题。 而且,如果机器只是工作站或属于域,则会出现问题。
出于兴趣,我创建了一个dotnet core 2.1.0控制台应用程序,根本没有这个问题,并且按预期工作。
简而言之:有人知道如何解决这个问题吗?还是这很可能是一个错误?