HTTP GET возвращает двоичный код вместо текста - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу получить файл csv из приложения http , MicroStrategy, но вместо этого я получаю двоичный файл, который можно открыть в 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);

Заголовки показывают правильный 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.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Как было обнаружено в комментариях, проблема заключалась в кодировке.

Даже несмотря на то, что в клиентском коде использовалась процедура загрузки строк, очевидно, что сервер не указывал кодировку [вообще / правильно] и, следовательно, что было обнаружено, что текст в кодировке UTF16 интерпретировался как что-то еще, скорее всего, UTF8.

Конечным результатом было то, что файл был немного искажен и был неправильно интерпретирован при открытии позже.

Исправление код для загрузки его в виде необработанных байтов, не декодируя и не кодируя их, а просто помещая их в файл, позволил открыть файл в формате UTF16 и получить текстовое содержимое.

В идеале сервер должен указывать кодировку используется при доставке контента, но иногда при загрузке файлов может случиться так, что код сервера, который доставляет файл, не знает кодировку содержимого файла, как правило, потому что файл был создан сторонним кодом или уже был на диске в неизвестной кодировке.

0 голосов
/ 23 апреля 2020

если он работает в браузере, вы можете попробовать добавить любой допустимый заголовок User-Agent, возможно, на стороне сервера есть какая-то хитрость

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...