时间: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入门学习——教材和工具准备

JAVA 实现 GETPOSTPUTDELETE HTTP请求

httpClient 配置与测试