HTTP GET 返回二进制而不是文本

HTTP GET returning binary in instead of text

我想从 http 应用程序 MicroStrategy 获取一个 csv 文件,但我得到的是一个可以打开的二进制文件在 Excel 但不是在文本编辑器中。

当我在浏览器中使用相同的 url 时,它会以文本形式下载,因此可以在文本编辑器中打开。

这是相关的(我认为)行:

HttpClient cliente;
cliente = new HttpClient(handler) { BaseAddress = uri, Timeout = new TimeSpan(0, 30, 0) };
...
string csv;
responseMessage = await cliente.GetAsync(uri);
HttpContentHeaders contentHeaders = responseMessage.Content.Headers;
csv = await responseMessage.Content.ReadAsStringAsync();
File.WriteAllText(caminhoArquivo, csv, Encoding.UTF8);

headers 显示正确 Content-Type:

responseMessage.Content.Headers = {Content-Length: 6188
Content-Disposition: attachment;filename=Grupo Cont%C3%A1bil.txt;
Content-Type: text/plain
}

只是读取字节和写入字节这是十六进制查看器中的文件:

byte[] bytes;
bytes = await responseMessage.Content.ReadAsByteArrayAsync();
File.WriteAllBytes(caminhoArquivo, bytes);

  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   
00000000: 47 00 72 00 75 00 70 00 6F 00 20 00 43 00 6F 00    G.r.u.p.o...C.o.
00000010: 6E 00 74 00 EF BF BD 00 62 00 69 00 6C 00 0D 00    n.t.o?=.b.i.l...
00000020: 0A 00 0D 00 0A 00 47 00 72 00 75 00 70 00 6F 00    ......G.r.u.p.o.

如果它在浏览器中有效,你可以尝试添加任何有效的 User-Agent header,也许服务器端有一些技巧

通过评论发现,问题出在编码上。

即使客户端代码使用了字符串下载例程,显然服务器没有指定编码 [在 all/correctly],因此被发现是 UTF16 编码的文本很可能被解释为其他内容UTF8.

最后的结果是文件有点乱,后来打开的时候被误读了。

修复代码以将其下载为原始字节,而不是对它们进行解码或编码,而是将它们简单地放入文件中,这样就可以以 UTF16 格式打开文件并获取文本内容。

理想情况下,服务器应该指定传送内容时使用的编码,但有时在下载文件时,传送文件的服务器代码可能不知道文件内容的编码,通常是因为文件是由第 3 方代码生成的,或者已经以未知编码存在于磁盘上。