Có cách nào được khuyến nghị để trả lại hình ảnh bằng ASP.NET Web API không


86

Cách tốt nhất để trả về một hình ảnh có 2 tham số (x và y để thay đổi kích thước).

Ví dụ

~/api/image12345/200/200

Sẽ trả về 200 x 200 jpg / png / hoặc gif

Tôi nên trả về một System.Drawing.Imageđối tượng hay xác định thủ công HTTPReponseMessage.Content?


Kiểm tra câu trả lời của tôi ở đây: stackoverflow.com/a/20888749/64334
Ronnie Overby

Câu trả lời:


147

Bạn không nên trả về a System.Drawing.Image, trừ khi bạn cũng thêm một trình định dạng biết cách chuyển đổi nó thành các byte thích hợp không tự tuần tự hóa thành các byte hình ảnh như bạn mong đợi.

Một giải pháp khả thi là trả về một HttpResponseMessagevới hình ảnh được lưu trữ trong nội dung của nó (như hình bên dưới). Hãy nhớ rằng nếu bạn muốn có URL mà bạn đã hiển thị trong câu hỏi, bạn cần một tuyến đường ánh xạ các thông số {imageName}, {width} và {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;
    }
}

Nhưng một lần nữa, nếu bạn đang làm điều này ở nhiều nơi, đi theo con đường định dạng có thể là cách "được khuyến nghị". Như hầu hết mọi thứ trong lập trình, câu trả lời sẽ phụ thuộc vào kịch bản của bạn.


Hình ảnh cũng nên được sử dụng?
dibs487

Đâu là GetImagephương pháp?
Yoda

1
@Yoda đó là phương pháp trong quá trình triển khai của bạn sẽ trả về hình ảnh cần được chuyển trở lại máy khách.
carlosfigueira

Nếu bạn đang trả lại một tệp từ ổ cứng, tôi nghĩ sẽ có hiệu suất tốt hơn nếu sử dụng FileStream, như thế này (xem câu trả lời được chấp nhận trong câu hỏi này): stackoverflow.com/questions/11125535/…
John Gilmer

19

Hình ảnh nặng nề. ASP.NET WebForms, HttpHandlers, MVC và Web API đều thực hiện một công việc hoàn toàn khủng khiếp là cung cấp các tệp tĩnh. IIS làm rất tốt công việc đó - Thường hiệu quả hơn 20-100 lần.

Nếu bạn muốn có được hiệu suất tốt, hãy viết lại URL muộn nhất là trong quá trình PostAuthorizeRequest, để IIS có thể nhận và phân phát tệp. Có, điều này có nghĩa là xử lý sự kiện cấp HttpModule.

[Tuyên bố từ chối trách nhiệm: Tôi là tác giả của bài báo và dự án nguồn mở sau đây]

Nếu bạn đang làm điều gì đó động với hình ảnh, hãy xem bài viết này về những cạm bẫy xử lý hình ảnh cần tránh và xem xét ImageResizer . Nó có bộ nhớ đệm đĩa tuyệt vời (sử dụng xử lý tệp tĩnh IIS) và dễ dàng kết nối với bất kỳ loại hình ảnh nào. Nó có các ràng buộc tùy chọn cho AForge, FreeImage và WIC, nếu bạn cần nâng cao.


2
Tôi đã và đang sử dụng ImageResizer trong dự án của mình và rất hài lòng với cách nó hoạt động - cộng với tôi. Chỉ có một số tài liệu cần được cập nhật.
Jon L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.