HttpClient获取远程文件大小时流量过高,请求排查代码问题
修正后的HttpClient实现
改成用HEAD请求,只获取响应头来读取Content-Length,这样流量消耗就和HttpWebRequest一致了:
HttpClientHandler handler = new HttpClientHandler() { Proxy = null, UseProxy = false, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; var client = new HttpClient(handler); client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"); // 注意:HEAD请求不需要设置Accept为application/json,也不用AcceptEncoding(因为没有响应体) client.DefaultRequestHeaders.ConnectionClose = true; client.DefaultRequestHeaders.Add("Referer", uriPath.AbsoluteUri); client.DefaultRequestHeaders.Add("Origin", "https://www.samplesite.com"); using (HttpResponseMessage response = await client.SendAsync( new HttpRequestMessage(HttpMethod.Head, uriPath), HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false)) { response.EnsureSuccessStatusCode(); // 读取Content-Length头 if (response.Content.Headers.TryGetValues("Content-Length", out var values)) { return values.FirstOrDefault(); } return null; }
额外优化建议
HttpClient建议复用实例,不要每次请求都新建,不然会导致socket资源泄漏,影响性能。- 如果目标服务器不支持HEAD请求,你可以继续用GET但只读取响应头、不下载响应体,但这种情况还是HEAD请求更规范省流量。
内容的提问来源于stack exchange,提问作者zackmark15
相关产品推荐
相关产品推荐

