2012-09-17 27 views
60

Tôi đang đùa giỡn với ASP.NET Web Api và tôi tò mò là cách tốt nhất để trả lại hình ảnh với 2 tham số (x và y để thay đổi kích thước).Có cách nào được khuyến nghị để trả lại hình ảnh bằng ASP.NET Web API

Ví dụ

~/api/image12345/200/200 

Sẽ trở lại 200 200 jpg/png/hoặc gif

Tôi có nên trả về một đối tượng System.Drawing.Image hay thủ công xác định HTTPReponseMessage.Content? Cách nào là hiệu quả nhất và chi phí thấp trên đầu.

+0

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

Trả lời

104

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

Một giải pháp có thể là trả lại một HttpResponseMessage với hình ảnh được lưu trữ trong nội dung của nó (như được hiển thị bên dưới). Hãy nhớ rằng nếu bạn muốn URL bạn đã hiển thị trong câu hỏi, bạn cần một tuyến đường ánh xạ các tham 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, định tuyến đường định dạng có thể là cách "được khuyến nghị". Như hầu như tất cả 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.

+0

nên hình ảnh được trong một sử dụng quá? – dibs487

13

Hình ảnh nặng. ASP.NET WebForms, HttpHandlers, MVC và Web API đều thực hiện một công việc tuyệt đối phục vụ các tệp tĩnh. IIS thực hiện cực kỳ công việc tốt đó - Thường là 20-100x hiệu quả hơn.

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

[Disclaimer: Tôi là tác giả của bài viết và nguồn mở dự án sau]

Nếu bạn đang làm một cái gì đó năng động với những hình ảnh, kiểm tra out this article on image processing pitfalls to avoid, và xem xét tham gia một cái nhìn tại 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 thế hệ hình ảnh dưới bất kỳ hình thức 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.

+0

Tôi đã sử dụng ImageResizer trong dự án của mình và tôi rất hài lòng với cách hoạt động của nó - cộng với tôi. Chỉ gripe là một số tài liệu cần cập nhật. –

Các vấn đề liên quan