【发布时间】:2018-04-09 07:35:16
【问题描述】:
使用 Microsoft 消息分析器,我可以看到使用 HttpClient 的发布数据在两个 tcp 数据包中发送。一个用于标题,然后一个用于发布数据。这些数据可以很容易地放入一个数据包中,但是它被分成了两个。我已经明确打开了 nagling 并期望 100 继续使用 ServicePointManager,但它似乎没有帮助。
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = true;
5023 (.Net) 显示 2 个数据包已发送到目的地,8170 (Postman) 显示 1 个数据包正在发送。测试是使用相同的有效负载完成的。
下面是一些用于在.net中生成请求的示例代码
public void TestRequest()
{
var uri = new Uri("http://www.webscantest.com/");
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = true;
var p = ServicePointManager.FindServicePoint(uri);
p.Expect100Continue = false;
p.UseNagleAlgorithm = true;
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Connection", "close");
var values = new Dictionary<string, string>
{
{ "thing1", "hello" },
{ "thing2", "world" }
};
var content = new FormUrlEncodedContent(values);
var response = client.PostAsync("http://www.webscantest.com/", content, CancellationToken.None).Result;
}
有没有办法将有效载荷强制放入单个数据包中?
使用 .Net Framework 4.7
【问题讨论】:
-
Nagle 只能减少发送的数据包数量,所以关闭它也无济于事。
-
谢谢@BugFinder - 但我没有足够的声誉在该帖子的主线程上发表评论,询问OP是否找到了解决方案......
-
@C.Evenhuis - 我已经测试了 Expect 100 Continue off 和 Nagle on ,但仍然是同样的问题。
-
@Evk - 我们正在努力优化非常繁忙的服务器上的 http 请求。
-
@CalvinPietersen Nagle 不能解决您的问题,但它唯一能做的就是合并数据包。只有在没有收到之前发送的数据包的 ACK 时才会这样做。
标签: c# post tcp httpclient servicepointmanager