【问题标题】:HttpClient high data usage when getting remote file size获取远程文件大小时的HttpClient高数据使用率
【发布时间】: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#


【解决方案1】:

在 HttpClient 的情况下,您使用不同的 HTTP 方法 GET,在 WebRequest 的情况下使用 HEAD。要获得文件大小,您将在这两种情况下使用足够的 HEAD 方法

HTTP GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据。

如果使用 HTTP GET 方法请求指定的资源,则 HTTP HEAD 方法会请求返回的标头。例如,可以在决定下载大型资源以节省带宽之前完成此类请求。

您需要更改此代码行

 client.DefaultRequestHeaders.Add("Method", "GET");

必须是

 client.DefaultRequestHeaders.Add("Method", "HEAD");

对 HEAD 方法的响应没有与 GET 不同的主体

UPD:使用 SendAsync 方法(不是 GetAsync)

HttpClientHandler handler = new HttpClientHandler();
using var client = new HttpClient(handler);

string requestUri = "enter request uri";

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Head, requestUri);
using var response = await client.SendAsync(message);

【讨论】:

  • 感谢您提供我不知道的信息。我已经将其更改为 HEAD 但我现在的问题是大约需要 15 分钟才能完成阅读内容长度这是我的更新代码i.imgur.com/nmTqlj5.jpg
【解决方案2】:

终于解决了 非常感谢@Dmitry

这是 HttpClient 更新的代码

   public static async Task<string> GetTotalBytes(Uri uriPath)
    {
        HttpClientHandler handler = new HttpClientHandler();
        handler.Proxy = null;

        using (var client = new HttpClient(handler))
        {
            HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Head, uriPath);
            using (var response = await client.SendAsync(message))
            {
                response.EnsureSuccessStatusCode();
                var lenght = response.Content.Headers.ContentLength;
                return lenght.ToString();
            }
        }
     }

结果(HttpClient):

Total URL: 355
Filsize: 1.14 GB
Elapsed Time: 0h 0m 2s 51.3ms

这里是 HttpWebRequest(也许有人会需要)

        var webRequest = (HttpWebRequest)WebRequest.Create(uriPath);
        webRequest.Method = "HEAD";
        webRequest.Proxy = null;

        using (var webResponse = await webRequest.GetResponseAsync())
        {
            return await Task.Run(() => webResponse.Headers.Get("Content-Length"), token);
        }

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 2023-03-28
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多