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。
使用 Microsoft Message Analyzer,我可以看到 post 使用 HttpClient 的数据在两个 tcp 数据包中发送。一个用于 header,然后一个用于 post 数据。这些数据可以很容易地放入一个数据包中,但它被分成了两个。我已明确打开 nagling 并期望 100 继续使用 ServicePointManager,但它似乎没有帮助。
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = true;
下面是一些用于在 .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。