Cal*_*sen 8 c# post tcp httpclient servicepointmanager
使用Microsoft Message Analyzer,我可以看到使用HttpClient发布的数据是以两个tcp数据包发送的.一个用于标题,然后一个用于发布数据.这些数据很容易适合一个数据包,但它被分成两个.我明确地打开了唠叨,并期望100继续使用ServicePointManager,但它似乎没有帮助.
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = true;
Run Code Online (Sandbox Code Playgroud)
5023(.Net)显示2个数据包被发送到目的地,8170(邮递员)显示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;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法强制有效载荷成为一个数据包?
使用.Net Framework 4.7
因此,在查看了dotnet core源代码之后(只能假设其他.net版本中也是如此),我可以在WinHttpHandler中看到Request Header和Request Body是在不同的点发送的。
请求标头通过Interop.WinHttp.WinHttpSendRequest发送。然后,根据 WinHttp 文档,具有Interop.WinHttp.WinHttpWriteData的请求正文将“在调用此函数之前等待 WinHttpSendRequest 完成”。
我认为如果请求正文是通过 WinHttpSendRequest 发送的(当前将正文设置为IntPtr.Zero ),则可以解决此问题。
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |