下面是我在Asp上运行的一段代码.net 4.7.2和.Net内核,但每个框架都有不同的行为

public class Program
{


    private HttpClient Client = new HttpClient();
    public static async Task Main(string[] args)
    {
        Program example = new Program();

        Console.WriteLine("Starting connections");
        int numberofIterations = 10;
        Task<HttpResponseMessage>[] awaitableTasks = new Task<HttpResponseMessage>[numberofIterations];
        for (int i = 0; i < numberofIterations; i++)
        {
            var httpRequestMessage = new HttpRequestMessage();
            httpRequestMessage.RequestUri = new Uri("https://example.com");
            httpRequestMessage.Method = new HttpMethod("GET");

            awaitableTasks[i] = example.Client.SendAsync(httpRequestMessage);
            //Console.WriteLine(result.StatusCode);
        }

        Console.WriteLine("Connections done");
        await Task.WhenAll(awaitableTasks);

    }
}

用这个.Net核心框架,网络跟踪 for each 请求显示一个单独的tcp连接,同时使用ASP.NEt 4.7.2框架套接字得到重用.

Network Trace .Net Core

enter image description here

Network Trace Asp.Net 4.7.2

enter image description here

欣赏你的 idea ,理解差异,解释这种行为,以及克服这个问题的最佳方法.

推荐答案

简而言之,下面对代码的修改将迫使我的应用程序创建两个以上的套接字并重用它们.

     var socketsHandler = new SocketsHttpHandler
            {
                PooledConnectionLifetime = TimeSpan.FromSeconds(60),
                PooledConnectionIdleTimeout = TimeSpan.FromMinutes(20),
                MaxConnectionsPerServer = 2
            };

     HttpClientHandler handler = new HttpClientHandler() { MaxConnectionsPerServer = 2 };

     var Client = new HttpClient(handler);

Updated Answer


More Details:

这个Net框架4.x、 HTTPX客户端实现构建在可由ServicePointManager管理的HttpWebRequest和ServicePoint之上.ServicePointManager将ASP的默认连接限制设置为10.NET托管的应用程序和2个用于所有其他应用程序,这就是为什么在我上面的示例中,由于应用程序被阻止在每个服务点创建超过2个连接(套接字),所以打开并重用了2个套接字.

请参阅下面的参考资料以了解更多信息

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.defaultconnectionlimit?view=net-6.0#system-net-servicepointmanager-defaultconnectionlimit

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager?view=net-6.0

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepoint?view=net-6.0

C# Does Each Instance of HttpClient Get it's Own ServicePoint

在里面Net核心,实现已多次更改,不再由ServicePointManager管理,并且没有默认连接限制.下面的文章介绍了HttpClient类的完整故事.

https://www.stevejgordon.co.uk/httpclient-connection-pooling-in-dotnet-core

感谢@user700390和@PanagiotisKanavos以及@JeremyLakeman对这个问题的帮助和指导.

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

无法使用ternal- .net修复可空警告

CsWin32如何创建PWSTR的实例,例如GetWindowText

有没有办法把+02:00转换成TimeSpan?""

如何告诉自己创建的NuGet包在应用程序中发生了变化?

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

WPF DataGrid中的三维数据

MAUI查询参数单一字符串项将不起作用

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

Blazor在FluentButton onClick事件上设置参数

DateTime ToString()未以指定格式打印

等待一个等待函数

在等待OnGetAsync时打开Razor Page显示微调器

将J数组转换为列表,只保留一个嵌套的JToken

使DefaultIfEmpty返回空

如何在Cake脚本中设置MSBuild.exe的绝对路径

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

项目参考和方法签名问题

使用生产环境调试我的应用程序的快速方法