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.