Переоснащение (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 на нем. Спасибо за помощь, хотя!