Переоснащение (C#) - Загрузка изображения

Я использую Refit в своем приложении C# для взаимодействия с REST API, и у метода API есть вызов, который возвращает изображение.jpg. Я хочу загрузить это изображение с помощью Refit и получить его в виде байтового массива, но, похоже, он возвращает искаженную строку. Увидеть ниже. См. Ниже метод интерфейса для загрузки изображения

 [Get("/Photos/{id}")]
 Task<string> DownloadPhoto(Guid id);

Я попытался проанализировать строку как строку Base64, но это не сработало, поэтому я предполагаю, что это не так. Есть идеи?

РЕДАКТИРОВАТЬ: Первая строка искаженного ответа здесь. Обратите внимание, что при переходе по этому же URL-адресу в браузере он работает нормально и отображает изображение

\0\u0010JFIF\0\u0001\u0001\0\0H\0H\0\0 \0XExif\0\0мм \0*\0\0\0\ Ь \0\u0002\u0001\u0012\0\u0003\0\0\0\u0001\0\u0001\0\0i\0\u0004\0\0\0\u0001\0\0\0&\0\0\0\0\0\u0003 \u0001\0\u0003\0\0\0\u0001\0\u0001\0\0 \u0002\0\u0004\0\0\0\u0001\0\0\u0002X \u0003\0\u0004\0\0\0\u0001\0\0\u0003 \0\0\0\0 \08Photoshop 3.0\08BIM\u0004\u0004\0\0\0\0\0\08BIM\u0004%\0\0\0\0\0\u0010 \ u001d \ 0 \ u0004 \ t B~ ~ \0\u0011\b\u0003 \u0002X\u0003\u0001\"\0\u0002\u0011\u0001\u0003\u0011\u0001 \0\u001f

4 ответа

Для меня работало, чтобы метод был объявлен как возвращающийTask<HttpContent> и затем вы можете получить данные из возвращенного экземпляра HttpContent различными способами.

Например:

Task<HttpContent> DownloadPhoto(Guid id);

А потом:

HttpContent content = await DownloadPhoto(guid);
byte[] bytes = await content.ReadAsByteArrayAsync();

Вы можете получить массив байтов с помощью refit, как в примере ниже

[Get("/Photos/{id}")]
Task<HttpResponseMessage> DownloadPhoto(Guid id);

а затем вы можете получить массив байтов из

var Response = await YourRefitClient.DownloadPhoto(id);
byte[] ByteArray = await Response.Content.ReadAsByteArrayAsync();

Не используйте HttpResponseMessage!

Я вижу, что все используют HttpResponseMessage в Интернете, но это может вызвать у вас скрытую проблему, как это случилось с моей командой, когда мы это сделали. Мы все знаем, что для перехвата ошибок Refit мы кричим catch ApiException, но если вы вызовете .EnsureSuccessStatusCode() в ответе HttpResponseMessage, вместо этого будет выброшено исключение HttpResponseException! При этом у нас возникли некоторые проблемы: при попытке/перехвате ApiException эти ошибки не обнаруживались. Чтобы упростить код, избегайте этого!

Решение:

      [Get("/file")]
Task<ApiResponse<Stream>> GetFile();

Таким образом, у вас есть доступ ко всем стандартным операциям:

      response.Headers;
response.StatusCode;
await response.EnsureSuccessStatusCodeAsync();
response.Content; <- This is a Stream

Я решил это - тип возвращаемого значения должен быть Task, который затем можно прочитать из свойства Content на нем. Спасибо за помощь, хотя!

Другие вопросы по тегам