มีวิธีที่แนะนำในการส่งคืนรูปภาพโดยใช้ ASP.NET Web API หรือไม่


86

วิธีใดเป็นวิธีที่ดีที่สุดในการส่งคืนรูปภาพที่มีพารามิเตอร์ 2 ตัว (x และ y สำหรับการปรับขนาด)

ตัวอย่างเช่น

~/api/image12345/200/200

จะคืนค่า 200 คูณ 200 jpg / png / หรือ gif

ฉันควรส่งคืนSystem.Drawing.Imageวัตถุหรือกำหนดด้วยตนเองHTTPReponseMessage.Content?


ตรวจสอบคำตอบของฉันที่นี่: stackoverflow.com/a/20888749/64334
Ronnie Overby

คำตอบ:


148

คุณไม่ควรส่งคืน a System.Drawing.Imageเว้นแต่คุณจะเพิ่มฟอร์แมตเตอร์ซึ่งรู้วิธีการแปลงเป็นไบต์ที่เหมาะสมจะไม่ทำให้เป็นอนุกรมเป็นไบต์ของรูปภาพตามที่คุณคาดหวัง

วิธีแก้ไขอย่างหนึ่งที่เป็นไปได้คือการส่งคืนHttpResponseMessageรูปภาพที่เก็บไว้ในเนื้อหา (ดังแสดงด้านล่าง) โปรดจำไว้ว่าหากคุณต้องการ URL ที่คุณแสดงในคำถามคุณต้องมีเส้นทางที่จับคู่พารามิเตอร์ {imageName}, {width} และ {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;
    }
}

แต่อีกครั้งหากคุณทำเช่นนี้ในหลาย ๆ ที่การไปยังเส้นทางฟอร์แมตเตอร์อาจเป็นวิธีที่ "แนะนำ" เกือบทุกอย่างในการเขียนโปรแกรมคำตอบจะขึ้นอยู่กับสถานการณ์ของคุณ


ภาพควรอยู่ในการใช้งานด้วยหรือไม่?
dibs487

GetImageวิธีการคืออะไร?
Yoda

1
@ Yoda เป็นวิธีการในการใช้งานของคุณที่จะส่งคืนรูปภาพที่ต้องโอนกลับไปยังไคลเอนต์
carlosfigueira

หากคุณกำลังส่งคืนไฟล์จากฮาร์ดไดรฟ์ฉันคิดว่าการใช้ FileStream จะดีกว่านี้ (ดูคำตอบที่ยอมรับในคำถามนี้): stackoverflow.com/questions/11125535/…
John Gilmer

19

รูปภาพมีน้ำหนักมาก ASP.NET WebForms, HttpHandlers, MVC และเว็บ API ทั้งหมดทำอย่างสาหัสงานของการให้บริการไฟล์คง IIS ทำงานได้ดีมาก - มักจะมีประสิทธิภาพมากกว่า 20-100 เท่า

หากคุณต้องการประสิทธิภาพที่ดีให้ทำการเขียน URL ใหม่ในช่วง PostAuthorizeRequest เพื่อให้ IIS สามารถรับและให้บริการไฟล์ได้ ใช่นี่หมายถึงการจัดการเหตุการณ์ระดับ HttpModule

[คำเตือน: ฉันเป็นผู้เขียนบทความต่อไปนี้และโครงการโอเพนซอร์ส]

หากคุณกำลังทำอะไรบางอย่างแบบไดนามิกที่มีภาพให้ตรวจสอบบทความนี้เกี่ยวกับข้อผิดพลาดการประมวลผลภาพที่จะหลีกเลี่ยงและพิจารณาดูที่ImageResizer มีการแคชดิสก์ที่ยอดเยี่ยม (ซึ่งใช้การจัดการไฟล์แบบคงที่ของ IIS) และง่ายต่อการเชื่อมต่อกับการสร้างภาพทุกประเภท มีการผูกเสริมสำหรับ AForge, FreeImage และ WIC เช่นกันหากคุณต้องการขั้นสูง


2
ฉันใช้ ImageResizer ในโครงการของฉันและมีความสุขมากกับวิธีการทำงาน - บวกจากฉัน เฉพาะที่จับเป็นเอกสารบางส่วนที่ต้องการการอัปเดต
Jon L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.