为了账号安全,请及时绑定邮箱和手机立即绑定

HttpClient 返回 0 字节

HttpClient 返回 0 字节

C#
MMTTMM 2023-08-20 10:57:24
GetByteArrayAsync两者GetStreamAsync都返回 0 字节或空流。我想将收到的字节写入文件。我尝试过使用byte[] stream = await _httpClient.GetByteArrayAsync("http://gscs-b2c.lge.com/downloadFile?fileId=BZhqND5RTnHcyMRDCeJJQ")and _httpClient.GetStreamAsync("http://gscs-b2c.lge.com/downloadFile?fileId=BZhqND5RTnHcyMRDCeJJQ"),但它们都返回 0 字节或空流。我已经从 PostMan 尝试过,作为 Get 请求,它返回了一个有效的 PDF 文件。我已经从浏览器中尝试过,它返回一个有效的 PDF 文件。但在代码中它返回空文件(0 字节)。我检查了其他答案,但仍然无法解决这个问题。有趣的是,它适用于其他网站的其他 pdf 文件。以下是我正在使用的 .net Core 2.2 中的示例代码_client = new HttpClient();_client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36");_client.Timeout = TimeSpan.FromMinutes(2);System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;var downloadPdfLink = "http://gscs-b2c.lge.com/downloadFile?fileId=BZhqND5RTnHcyMRDCeJJQ";using (Stream stream = await _client.GetStreamAsync(downloadPdfLink)){    using (var fs = new FileStream("./file/myfile.pdf",FileMode.CreateNew,FileAccess.Write))    {        //stream.Seek(0, SeekOrigin.Begin);        stream.CopyTo(fs);    }}预期的结果应该是返回的流被写入“myfile.pdf”。你能帮我理解这里的问题是什么,我做错了什么吗?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

通过网络浏览器下载.pdf文件时,我注意到在开发人员工具中,附加标头被添加到请求中: Accept-Encoding: gzip, deflate等等,这将在响应内容中携带文件,而不是留下长度0 就像你的原始代码一样。


有多种方法可以修复代码:

HttpClient.DefaultRequestHeaders

_client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip");
_client.DefaultRequestHeaders.Add("Accept-Encoding", "deflate");

HttpClientHandler.AutomaticDecompression

var handler = new HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
var _client = new HttpClient(handler);

HttpRequestHeaders.AcceptEncoding

var request = new HttpRequestMessage(HttpMethod.Get, downloadPdfLink);

request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));

request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));

using (HttpResponseMessage response = await _client.SendAsync(request))

{

    using (Stream stream = await response.Content.ReadAsStreamAsync())

    {

        Directory.CreateDirectory("./file");

        using (var fs = new FileStream("./file/myfile.pdf", FileMode.Create, FileAccess.Write))

        {

            //stream.Seek(0, SeekOrigin.Begin);

            stream.CopyTo(fs);

        }

    }

}

并且,作为一个友好的提醒,一旦你完成了它,不要忘记Dispose()你的。HttpClient


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信