HttpClient.SendAsync 从 api 接收响应的时间比预期要长得多

问题描述 投票:0回答:1

我有一个简单的程序,使用

System.Net.Http.HttpClient
,其工作原理如下:

// Get existing or create new httpclient if there isn't one instace of it already 
mClient = GetHttpClient();
var startTime = DateTime.Now;

var res = await mClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

var executeMethodTime = DateTime.Now.Subtract(startTime).TotalMilliseconds;
mLog.Info("restPostExecuteMethodTime : {0}", executeMethodTime);

它向 API 发出一个简单的请求并等待响应。请求的内容很小,只是一些简单的对象,没什么太大。

API 端如下所示:

public async Task<IHttpActionResult> DoWork([FromBody]TemplateInput templateInput)
{
        IHttpActionResult res;
        var startTime = DateTime.Now;

        // do logic 
        var auditTime = DateTime.Now.Subtract(startTime).TotalMilliseconds;
        mLog.Info($"auditTime {auditTime}");
        return res;
}

这是该代码生成的日志记录:

2020-07-15 09:12:19.7472|auditTime 204.9607|
2020-07-15 09:12:24.8172|executeMethodTime : 5321.9861|

令我惊讶的是,API 花了 5 秒多才返回结果,而实际上 API 中的所有逻辑只花了大约 200 毫秒就完成执行。但花了整整 5 秒才将结果返回给请求者。

我检查了网络,没有问题。

这对我来说毫无意义。

HttpClient
中是否有任何内容可能会影响响应速度?以至于请求要花费 5 秒?

我首先认为这是由 httpClient 内部的代理设置引起的,所以我尝试在创建 httpClient 时将代理设置为 false,结果对速度没有影响。

如果有人有任何想法 - 请告诉我。

c# .net httpclient
1个回答
0
投票

刚刚遇到这个问题。我构造了 HttpClient 并每 10 秒调用一个方法进行基准测试,其中每次构造 HttpRequestMessage 并将 SendAsync 与 HttpCompletionOption.ResponseHeadersRead 结合使用。 请求大约需要 2000 毫秒才能返回。但是,如果我改为使用 HttpCompletionOption.ResponseContentRead,请求在第一个时间会花费 2000 毫秒左右的时间,但后续请求会花费大约 20 毫秒。不太确定发生了什么,但似乎与 HttpCompletionOption 有关。

© www.soinside.com 2019 - 2024. All rights reserved.