c# httpclient post 强制单包

c# httpclient post force single packet

使用 Microsoft Message Analyzer,我可以看到 post 使用 HttpClient 的数据在两个 tcp 数据包中发送。一个用于 header,然后一个用于 post 数据。这些数据可以很容易地放入一个数据包中,但它被分成了两个。我已明确打开 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

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

请求 header 与 Interop.WinHttp.WinHttpSendRequest 一起发送。然后请求 body 和 Interop.WinHttp.WinHttpWriteData 根据 WinHttp 文档,将 "Wait until WinHttpSendRequest has completed before calling this function".

我认为这个问题可以解决,如果请求 body 是通过 WinHttpSendRequest 发送的,它当前将 body 设置为 IntPtr.Zero

Request Header here

Request Body here