【发布时间】:2020-07-19 21:23:17
【问题描述】:
我正在获取远程 url 的文件大小,我刚刚注意到 HttpClient 和 httpWebRequest 之间的区别。
我比较后发现 httpclient 占用了太多数据。 这对我来说是个大问题,因为在菲律宾,我们只有有限的数据
你能告诉我我的 httpclient 类有什么问题吗?我不知道是什么导致了高数据使用率
HttpClient
HttpClientHandler handler = new HttpClientHandler()
{
Proxy = null,
UseProxy = false,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("Method", "GET");
client.DefaultRequestHeaders.Add("Referer", uriPath.AbsoluteUri);
client.DefaultRequestHeaders.Add("Origin", "https://www.samplesite.com");
client.DefaultRequestHeaders.ConnectionClose = true;
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");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
using (HttpResponseMessage response = await client.GetAsync(uriPath, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false))
{
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
var resultTask = response.Content.ReadAsStringAsync();
var timeoutTask = Task.Delay(3000);
var completed = await Task.WhenAny(resultTask, timeoutTask).ConfigureAwait(false);
if (completed == timeoutTask)
return null;
return await resultTask;
}
HttpWebRequest
var webRequest = (HttpWebRequest)WebRequest.Create(uriPath);
webRequest.Method = "HEAD";
webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36";
using (var webResponse = await webRequest.GetResponseAsync())
{
return await Task.Run(() => webResponse.Headers.Get("Content-Length"), token);
}
【问题讨论】:
-
好的让我看看谢谢
-
在 HttpClient 的情况下,您使用不同的 HTTP 方法 GET,在 WebRequest 的情况下使用 HEAD。要获得文件大小,您需要在这两种情况下使用足够的 HEAD 方法。
-
@DmitryKolchev 我试过了。但是读取文件大小大约需要 15 分钟,您可以在这里看到我所做的。我相信我还是做错了i.imgur.com/nmTqlj5.jpg
-
@zackmark15 您必须使用 SendAsync 方法而不是 GetAsync。 GetAsync 方法总是使用 GET 方法
标签: c#