【问题标题】:c# httpclient post force single packet时间:2019-04-10 标签: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 时才会这样做。

标签: c# post tcp httpclient servicepointmanager


【解决方案1】:

所以在查看了dotnet核心源代码后(只能在其他.net版本中假设相同),我可以在WinHttpHandler中看到Request Header请求正文在不同点发送。

请求标头通过 Interop.WinHttp.WinHttpSendRequest 发送。然后根据 WinHttp 文档,带有 Interop.WinHttp.WinHttpWriteData 的请求正文将“等到 WinHttpSendRequest 完成后再调用此函数”

我认为这个问题可以解决,如果请求正文是使用 WinHttpSendRequest 发送的,目前将正文设置为IntPtr.Zero

Request Header here

Request Body here

【讨论】:

  • 卡尔文的有趣发现!
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 2022-01-16
  • 2018-07-04
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2015-02-10
相关资源
最近更新 更多