using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace CallTest
{
public class Program
{
private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { Proxy = null, UseProxy = false });
static void Main(string[] args)
{
ServicePointManager.DefaultConnectionLimit = 100;
ServicePointManager.Expect100Continue = false;
// warmup
CallSomeWebsite().GetAwaiter().GetResult();
CallSomeWebsite().GetAwaiter().GetResult();
RunSequentiell().GetAwaiter().GetResult();
RunParallel().GetAwaiter().GetResult();
}
private static async Task RunParallel()
{
var tasks = new List<Task>();
for (var i = 0; i < 300; i++)
{
tasks.Add(CallSomeWebsite());
}
await Task.WhenAll(tasks);
}
private static async Task RunSequentiell()
{
var tasks = new List<Task>();
for (var i = 0; i < 300; i++)
{
await CallSomeWebsite();
}
}
private static async Task CallSomeWebsite()
{
var watch = Stopwatch.StartNew();
using (var result = await _httpClient.GetAsync("http://example.com").ConfigureAwait(false))
{
// more work here, like checking success etc.
Console.WriteLine(watch.ElapsedMilliseconds);
}
}
}
}
我如何才能为并行请求获得相同的性能?这是线程池问题吗?
NET Core2.1已经修复了此行为。我认为问题是HttpClient使用的底层windows WinHTTP处理程序。
在.NET Core 2.1中,他们重写了HttpClientHandler(请参见https://blogs.msdn.microsoft.com/dotnet/2018/04/18/performance-in-net-core-2-1/#user-content-networking):
在.NET Core 2.1中,HttpClientHandler有一个新的默认实现,它完全在C#中实现,而不是在其他System.NET库(例如System.Net.Sockets、System.Net.Security等)之上。这不仅解决了前面提到的行为问题,还显著提高了性能(该实现还作为SocketsHttpHandler公开,可以直接使用它而不是通过HttpClientHandler来配置SocketsHttpHandler特定的属性)。
这最终消除了问题中提到的瓶颈。
在.NET Core2.0上,我得到以下数字(以毫秒为单位):
Fetching URL 500 times...
Sequentiell Total: 4209, Max: 35, Min: 6, Avg: 8.418
Parallel Total: 822, Max: 338, Min: 7, Avg: 69.126
但是在.NET Core2.1上,单个并行HTTP请求似乎有了很大的改进:
Fetching URL 500 times...
Sequentiell Total: 4020, Max: 40, Min: 6, Avg: 8.040
Parallel Total: 795, Max: 76, Min: 5, Avg: 7.972
我使用jmeter来生成一个性能测试,为了保持简洁,我从一个json文件中读取初始数据,我有一个单线程组,在读取数据后,我在其中随机设置某些值,以防止需要时数据重复,然后我使用变量将最终数据传递给endpoint,这将最终在一个由endpoint接收的json主体中,它基本上将在数据库中生成一个新的事务。此外,我添加了一个常量计时器,在请求之间添加了7秒的延迟,测试持续时间为10分钟,没有上升,我
我需要一个java程序来生成以下请求。我正在使用Apache HttpClient Library,但仍然无法生成这样的请求: 这是我的python程序生成的,我编写了一个等效的java程序。但它扔403。 2012-09-10 15:12:05G信息:G2OAuth auth data=“3,0.0.0,0.0.0,1347289925,3223833979,crlakamai”2012-09-
问题内容: 我有类似以下内容: 它不断返回500。服务提供商说我需要发送JSON。Apache HttpClient 3.1+如何完成? 问题答案: Apache HttpClient对JSON一无所知,因此您需要分别构造JSON。为此,我建议从json.org检出简单的JSON- java 库。(如果“ JSON- java”不适合您,则json.org列出了大量可用不同语言提供的库。) 生成J
我有一个WPF应用程序,需要从远程API检索配置数据。该API已经过测试,并且工作正常,返回我认为是正确的格式。我已经为响应等创建了一个数据类型,但是当我到达通过HttpClient获取响应的行时,它不会向API发送任何请求。 数据类型:- 我已经在API上运行了日志,我们没有看到请求,如果我们使用相同的代码模型调用另一个API控制器来调用Uri2(https://example.com/API/
我向运行在IIS中的本地网站提出以下请求 这将生成以下响应头: HTTP/1.1 200 OK Accept-Ranges: bytes Date: Mon,03 Jun2013 22:34:25GMT ETag:"50c7472eb342ce1:0" Server: Microsoft-IIS/8.0 X-Powerd-By: ASP. NET 通过Fiddler发出的相同请求会产生以下响应头(
我正在创建一个数据下载程序,自从使用httpClient以来,它一直给我带来问题 此代码将所需的所有变量附加到URL: } 每当我调用openSession时,它都会以一种简单的方式打印出标题(这正是我需要它做的)。。。 这打印了一个单行,但当我提出另一个打印长行的请求时,它总是带来这个错误: 这是第二个出现错误的请求: 我在currencyPairsRequest()中是否做错了什么?谢谢你花时