Чи є рекомендований спосіб повернути зображення за допомогою веб-API ASP.NET


86

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

Наприклад

~/api/image12345/200/200

Поверне розмір 200 на 200 JPG / PNG / або GIF

Чи слід повертати System.Drawing.Imageоб'єкт або вручну визначати HTTPReponseMessage.Content?


Перевірте моя відповідь тут: stackoverflow.com/a/20888749/64334
Ронні Overby

Відповіді:


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 та Web API роблять абсолютно жахливу роботу з обслуговування статичних файлів. IIS робить це надзвичайно добре - часто в 20-100 разів ефективніше.

Якщо ви хочете отримати хорошу продуктивність, виконайте переписування URL-адрес найпізніше під час PostAuthorizeRequest, щоб IIS міг забрати та подати файл. Так, це означає обробку подій на рівні HttpModule.

[Застереження: я автор наступної статті та проекту з відкритим кодом]

Якщо ви робите щось динамічне із зображеннями, ознайомтесь із цією статтею про підводні камені, яких слід уникати , і подумайте про те, щоб заглянути в ImageResizer . Він має відмінне кешування диска (що використовує статичну обробку файлів IIS), і його легко підключити до генерації зображень будь-якого типу. Він також має додаткові прив'язки для AForge, FreeImage та WIC, якщо вам потрібно просунутися.


2
Я використовую ImageResizer у своєму проекті, і я дуже задоволений тим, як це працює - плюс від мене. Лише стискання - частина документації потребує оновлення.
Джон Л
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.