我有一个简单的程序,使用
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,结果对速度没有影响。
如果有人有任何想法 - 请告诉我。
刚刚遇到这个问题。我构造了 HttpClient 并每 10 秒调用一个方法进行基准测试,其中每次构造 HttpRequestMessage 并将 SendAsync 与 HttpCompletionOption.ResponseHeadersRead 结合使用。 请求大约需要 2000 毫秒才能返回。但是,如果我改为使用 HttpCompletionOption.ResponseContentRead,请求在第一个时间会花费 2000 毫秒左右的时间,但后续请求会花费大约 20 毫秒。不太确定发生了什么,但似乎与 HttpCompletionOption 有关。