c# - .Net Core 3.1 HttpClient 不重用套接字

标签 c# asp.net asynchronous .net-core httpclient

我有下面一段代码,我在 .Net 4.7.2 和 .Net Core 上运行,但我对每个框架都有不同的行为

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 Core 框架,网络跟踪显示每个请求的单独 tcp 连接,而对于 .NEt 4.7.2 框架,套接字得到重用。

网络追踪 .Net Core

enter image description here

网络追踪 .Net 4.7.2

enter image description here

感谢您理解差异、解释此行为以及解决此问题的最佳方法的想法。

最佳答案

简短的回答,下面对代码的修改将强制我的 .net 核心应用程序不创建两个以上的套接字并重用它们。

     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);

更新的答案


更多详情:

.Net Framework 4.x.x HttpClient 实现建立在 HttpWebRequest 和 ServicePoint 之上,后者可由 ServicePointManager 管理。对于 ASP.NET 托管应用程序,ServicePointManager 的默认连接限制设置为 10,对于所有其他应用程序设置为 2,这就是为什么在我上面的示例中打开并重用 2 个套接字,因为应用程序被阻止创建超过 2 个连接(套接字) 每个服务点。

请参阅下面的引用资料以获得更多理解

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

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

https://learn.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 Core 中,实现已多次更改,不再由 ServicePointManager 管理,并且没有默认连接限制。下面的文章包含 HttpClient 类的完整故事。

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

感谢@user700390、@PanagiotisKanavos 和@JeremyLakeman 为获得此问题的答案提供的帮助和指导。

关于c# - .Net Core 3.1 HttpClient 不重用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71849496/

相关文章:

c# - SQL 表引用多个外键,同时定义顺序并保证参照完整性

python - 清理没有 .join() 且不阻塞主线程的线程

javascript - 使用 jquery 使动画异步/同步的干净方法

c# - 视觉继承 - 将设计器中的控件添加到 TableLayoutPanel 中托管的面板

c# - 当使用自定义属性引入破坏代码时,我们可以强制出现编译时错误吗?

c# - 在 asp.net 中验证 .cs 文件中的方法

asp.net - Linq 按子表排序

html - 在 Razor MVC 中使用 HTML 内容解码字符串

javascript - 如何从异步调用返回响应?

c# - ASP.NET MVC3 : Reusable method which returns Database query results