Я делаю веб-API, и мне нужно вернуть клиенту несколько изображений. В настоящее время я использую строку Base64 для каждого изображения, но это приводит к тому, что каждый запрос занимает слишком много времени. Есть ли лучший и более эффективный способ возврата изображений?

Вот код, который я использую:

Контроллер:

    public LearningUnits GetLearningUnits([FromODataUri]Guid key)
    {
        var record = db.LearningUnits.SingleOrDefault(inst => inst.LearningUnitId == key);

        record.ImageURLPath = ImageHandler.ImageToByteArrayFromFilePath(record.ImageURLPath);

        return record;
    }

ImageToByteArray Метод:

    public static string ImageToByteArrayFromFilePath(string imagefilePath)
    {
        byte[] imageArray = File.ReadAllBytes(imagefilePath);

        string baseImage = Convert.ToBase64String(imageArray);

        return baseImage;
    }
6
Wade Ferreira 21 Апр 2016 в 15:57

2 ответа

Лучший ответ

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

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

Это стандартный шаблон RESTful; у вас есть тот же URL-адрес, но если вам нужна запись JSON для данных, вы принимаете-type: application / json, но вы меняете тип запроса MIME на image / png или что-то подобное, когда вам нужен этот тип мультимедиа.

Больше можно найти здесь: Как предоставить пользовательские форматы mediatype для OData Api

Odata также неявно поддерживает его здесь: https://msdn.microsoft.com/en-us/library/system.web.http.odata.formatter.odatamediatypeformatter (v = vs.118) .aspx

0
Community 23 Май 2017 в 12:31

Если конечная точка возвращает json, то нет другого способа, кроме base64, как встроить двоичные файлы в ответ. Но это определенно плохая идея из-за проблем с производительностью. Может быть, для некоторых иконок это подойдет, но для больших изображений не подходит.

Итак, лучшее решение здесь - вернуть URL-адрес изображения. И клиент сделает дополнительный запрос на получение необработанных байтов для изображения.

Также стоит упомянуть, что URL-адрес изображения может быть не только путем к статическому файлу, но также и путем к некоторой конечной точке webapi, которая, например, получает байты изображения по идентификатору ресурса и отправляет необработанный двоичный файл клиента обратно, и не строка json.

1
tenbits 21 Апр 2016 в 13:20