ASP.NET Web API kullanarak bir görüntü döndürmenin önerilen bir yolu var mı


86

2 parametreli bir görüntüyü döndürmenin en iyi yolu nedir (yeniden boyutlandırma için x ve y).

Örneğin

~/api/image12345/200/200

200'e 200 jpg / png / veya gif döndürür

Bir System.Drawing.Imagenesneyi iade etmeli miyim yoksa manuel olarak HTTPReponseMessage.Content?


Yanıtlar:


148

Bunu System.Drawing.Imageuygun baytlara nasıl dönüştüreceğini bilen bir biçimlendirici eklemediğiniz sürece, kendisini beklediğiniz görüntü baytları olarak serileştirmez.

Olası bir çözüm, HttpResponseMessageiçeriğinde (aşağıda gösterildiği gibi) saklanan görüntü ile bir döndürmektir . Soruda gösterdiğiniz URL'yi istiyorsanız, {imageName}, {width} ve {height} parametrelerini eşleyen bir rotaya ihtiyacınız olacağını unutmayın.

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;
    }
}

Yine de, bunu birçok yerde yapıyorsanız, biçimlendirici rotasına gitmek "önerilen" yol olabilir. Programlamadaki neredeyse her şey gibi, cevap senaryonuza bağlı olacaktır.


Görüntü de kullanımda olmalı mı?
— dibs487

GetImageYöntem nerede ?
— Yoda

1
@Yoda, uygulamanızda, müşteriye geri aktarılması gereken görüntüyü döndüren yöntemdir.
— carlosfigueira

Sabit sürücüden bir dosya iade ediyorsanız, bunun gibi bir FileStream kullanmanın daha iyi bir performans olacağını düşünüyorum (bu soruda kabul edilen yanıta bakın): stackoverflow.com/questions/11125535/…
— John Gilmer

19

Görüntüler ağırdır. ASP.NET WebForms, HttpHandlers, MVC ve Web API , statik dosyaları sunma konusunda kesinlikle korkunç bir iş çıkarır. IIS bu konuda son derece iyi bir iş çıkarır - Genellikle 20-100 kat daha verimli.

İyi bir performans elde etmek istiyorsanız , en geç PostAuthorizeRequest sırasında URL yeniden yazımı yapın , böylece IIS dosyayı alıp sunabilir. Evet, bu HttpModule düzeyinde olay işleme anlamına gelir.

[Sorumluluk reddi: Aşağıdaki makalenin ve açık kaynaklı projenin yazarıyım]

Görüntülerle dinamik bir şey yapıyorsanız, kaçınılması gereken görüntü işleme tuzakları hakkındaki bu makaleye göz atın ve ImageResizer'a bir göz atmayı düşünün . Mükemmel disk önbelleğe alma özelliğine sahiptir (IIS statik dosya işlemeyi kullanır) ve her türden görüntü oluşturmaya bağlanması kolaydır. İlerlemeniz gerekiyorsa AForge, FreeImage ve WIC için isteğe bağlı bağlamalara sahiptir.


2
Projemde ImageResizer kullanıyorum ve nasıl çalıştığından ve benden çok memnunum. Sadece yakınma, bazı belgelerin güncellenmesi gerekiyor.
— Jon L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.