时间:2019-04-10 标签:c#httpclient post force single packet
Posted
技术标签:
【中文标题】时间:2019-04-10 标签:c#httpclient post force single packet【英文标题】:c# httpclient post force single packet 【发布时间】: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
related question here
【问题讨论】:
Nagle 只能减少发送的数据包数量,所以关闭它也无济于事。 谢谢@BugFinder - 但我没有足够的声誉在该帖子的主线程上发表评论,询问OP是否找到了解决方案...... @C.Evenhuis - 我已经测试了 Expect 100 Continue off 和 Nagle on ,但仍然是同样的问题。 @Evk - 我们正在努力优化非常繁忙的服务器上的 http 请求。 @CalvinPietersen Nagle 不能解决您的问题,但它唯一能做的就是合并数据包。只有在没有收到之前发送的数据包的 ACK 时才会这样做。 【参考方案1】:所以在查看了dotnet核心源代码后(只能在其他.net版本中假设相同),我可以在WinHttpHandler中看到Request Header和请求正文在不同点发送。
请求标头通过 Interop.WinHttp.WinHttpSendRequest 发送。然后根据 WinHttp 文档,带有 Interop.WinHttp.WinHttpWriteData 的请求正文将“等到 WinHttpSendRequest 完成后再调用此函数”。
我认为这个问题可以解决,如果请求正文是使用 WinHttpSendRequest 发送的,目前将正文设置为IntPtr.Zero。
Request Header here
Request Body here
【讨论】:
卡尔文的有趣发现!以上是关于时间:2019-04-10 标签:c#httpclient post force single packet的主要内容,如果未能解决你的问题,请参考以下文章
时间:2019-04-10 标签:c#sqldataadapterparams in using
时间:2019-04-10 标签:c++win32SendInput()
时间:2019-04-10 标签:c#httpclient post force single packet
2019-04-10 python入门学习——教材和工具准备