Есть ли рекомендуемый способ вернуть изображение с помощью веб-API ASP.NET?

86

Как лучше всего вернуть изображение с двумя параметрами (x и y для изменения размера).

Например

~/api/image12345/200/200

Вернет 200 на 200 jpg / png / или gif

Должен ли я возвращать System.Drawing.Imageобъект или определять вручную HTTPReponseMessage.Content?

Макс Александр
источник
Посмотрите мой ответ здесь: stackoverflow.com/a/20888749/64334
Ронни Оверби,

Ответы:

147

Вы не должны возвращать a System.Drawing.Image, если вы также не добавите средство форматирования, которое знает, как преобразовать это в соответствующие байты, не сериализует себя как байты изображения, как вы ожидали.

Одно из возможных решений - вернуть HttpResponseMessageс изображением, сохраненным в его содержимом (как показано ниже). Помните, что если вам нужен URL, который вы указали в вопросе, вам понадобится маршрут, который сопоставляет параметры {imageName}, {width} и ​​{height}.

public HttpResponseMessage Get(string imageName, int width, int height)
{
    Image img = GetImage(imageName, width, height);
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(ms.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");

        return result;
    }
}

Но, опять же, если вы делаете это во многих местах, использование метода форматирования может быть «рекомендуемым» способом. Как и почти все в программировании, ответ будет зависеть от вашего сценария.

Карлосфигейра
источник
Следует ли использовать и изображение?
dibs487
Где GetImageметод?
Йода
1
@Yoda - это метод вашей реализации, который вернет изображение, которое необходимо передать обратно клиенту.
carlosfigueira
Если вы возвращаете файл с жесткого диска, я думаю, что было бы лучше использовать FileStream, например (см. Принятый ответ в этом вопросе): stackoverflow.com/questions/11125535/…
Джон Гилмер
19

Изображения тяжелые. ASP.NET WebForms, HttpHandlers, MVC и веб-API - все они выполняют абсолютно ужасную работу по обслуживанию статических файлов. IIS очень хорошо с этим справляется - часто в 20–100 раз эффективнее.

Если вы хотите добиться хорошей производительности, выполните перезапись URL-адреса не позднее, чем во время PostAuthorizeRequest, чтобы IIS мог забрать и обработать файл. Да, это означает обработку событий на уровне HttpModule.

[Отказ от ответственности: я являюсь автором следующей статьи и проекта с открытым исходным кодом]

Если вы делаете что-то динамическое с изображениями, ознакомьтесь с этой статьей о подводных камнях обработки изображений, которых следует избегать , и подумайте о том, чтобы взглянуть на ImageResizer . Он имеет отличное кэширование диска (которое использует статическую обработку файлов IIS) и легко подключается к генерации изображений любого типа. Он также имеет дополнительные привязки для AForge, FreeImage и WIC, если вам нужно продвинуться.

Река Лилит
источник
2
Я использую ImageResizer в своем проекте и очень доволен тем, как он работает, плюс от меня. Единственное недовольство - некоторая часть документации требует обновления.
Jon L