Apakah ada cara yang disarankan untuk mengembalikan gambar menggunakan ASP.NET Web API

86

Apa cara terbaik untuk mengembalikan gambar dengan 2 parameter (x dan y untuk mengubah ukuran).

Sebagai contoh

~/api/image12345/200/200

Akan mengembalikan 200 x 200 jpg / png / atau gif

Haruskah saya mengembalikan System.Drawing.Imageobjek atau secara manual mendefinisikan HTTPReponseMessage.Content?

Max Alexander
sumber
Lihat jawaban saya di sini: stackoverflow.com/a/20888749/64334
Ronnie Overby

Jawaban:

148

Anda tidak boleh mengembalikan a System.Drawing.Image, kecuali jika Anda juga menambahkan pemformat yang tahu cara mengubahnya menjadi byte yang sesuai tidak membuat serial sendiri sebagai byte gambar seperti yang Anda harapkan.

Salah satu solusi yang mungkin adalah mengembalikan HttpResponseMessagedengan gambar yang disimpan dalam isinya (seperti yang ditunjukkan di bawah). Ingatlah bahwa jika Anda menginginkan URL yang Anda tampilkan dalam pertanyaan, Anda memerlukan rute yang memetakan parameter {imageName}, {width} dan {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;
    }
}

Tetapi sekali lagi, jika Anda melakukan ini di banyak tempat, menggunakan rute formatter mungkin merupakan cara yang "disarankan". Karena hampir semua hal dalam pemrograman, jawabannya akan tergantung pada skenario Anda.

carlosfigueira.dll
sumber
Haruskah gambar tersebut di gunakan juga?
dibs487
Dimana GetImagemetodenya?
Yoda
1
@Yoda itu adalah metode implementasi Anda yang akan mengembalikan gambar yang perlu ditransfer kembali ke klien.
carlosfigueira
Jika Anda mengembalikan file dari hard drive, saya pikir akan lebih baik jika menggunakan FileStream, seperti ini (lihat jawaban yang diterima dalam pertanyaan ini): stackoverflow.com/questions/11125535/…
John Gilmer
19

Gambar itu berat. ASP.NET WebForms, HttpHandlers, MVC, dan Web API semuanya melakukan pekerjaan yang sangat buruk dalam melayani file statis. IIS melakukan pekerjaan yang sangat baik - Seringkali 20-100x lebih efisien.

Jika Anda ingin mendapatkan performa yang baik, lakukan penulisan ulang URL paling lambat selama PostAuthorizeRequest, sehingga IIS dapat mengambil dan menyajikan file. Ya, ini berarti penanganan kejadian tingkat HttpModule.

[Penafian: Saya penulis artikel dan proyek sumber terbuka berikut]

Jika Anda melakukan sesuatu yang dinamis dengan gambar, lihat artikel ini tentang kesalahan pemrosesan gambar yang harus dihindari , dan pertimbangkan untuk melihat ImageResizer . Ini memiliki cache disk yang sangat baik (yang menggunakan penanganan file statis IIS), dan mudah untuk terhubung ke pembuatan gambar apa pun. Ini memiliki binding opsional untuk AForge, FreeImage, dan WIC juga, jika Anda perlu mahir.

Lilith River
sumber
2
Saya telah menggunakan ImageResizer dalam proyek saya dan saya sangat senang dengan cara kerjanya - plus dari saya. Satu-satunya keluhan adalah beberapa dokumentasi perlu diperbarui.
Jon L