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



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





~/api/image12345/200/200


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



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

672   2  

2 ответов:

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

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

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

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

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

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

Comments

    Ничего не найдено.