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

Я обожаю ASP.NET Web Api, и мне любопытно, как вернуть изображение с двумя параметрами (x и y для изменения размера).

Например

~/api/image12345/200/200

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

Должен ли я вернуть объект System.Drawing.Image или вручную определить HTTPReponseMessage.Content? Какой способ является наиболее эффективным и низким накладными расходами.

Ответ 1

Вы не должны возвращать 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;
        }
    }

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

Ответ 2

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

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

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

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