type net ihttpactionresult httpresponsemessage asp apicontroller asp.net asp.net-web-api image

asp.net - net - return json web api controller c#



¿Hay alguna forma recomendada de devolver una imagen usando ASP.NET Web API? (2)

¿Cuál es la mejor manera de devolver una imagen con 2 parámetros (x e y para cambiar el tamaño).

Por ejemplo

~/api/image12345/200/200

Devolverá 200 por 200 jpg / png / o gif

¿Debo devolver un objeto System.Drawing.Image o definir manualmente el HTTPReponseMessage.Content ?


Las imágenes son pesadas. ASP.NET WebForms, HttpHandlers, MVC y Web API hacen un trabajo absolutamente terrible al servir archivos estáticos. IIS hace un trabajo extremadamente bueno de eso: a menudo 20-100 veces más eficientemente.

Si desea obtener un buen rendimiento, realice la reescritura de URL a más tardar durante PostAuthorizeRequest, para que IIS pueda recoger y servir el archivo. Sí, esto significa el manejo de eventos a nivel de HttpModule.

[Descargo de responsabilidad: soy el autor del siguiente artículo y proyecto de código abierto]

Si está haciendo algo dinámico con las imágenes, consulte este artículo sobre las dificultades del procesamiento de imágenes para evitar , y considere echarle un vistazo a ImageResizer . Tiene un excelente caché de disco (que utiliza el manejo de archivos estáticos de IIS) y es fácil de conectar a la generación de imágenes de cualquier tipo. También tiene enlaces opcionales para AForge, FreeImage y WIC, si necesita avanzar.


No debe devolver System.Drawing.Image , a menos que también agregue un formateador que sepa cómo convertirlo en los bytes apropiados, no se serialice como los bytes de imágenes como cabría esperar.

Una posible solución es devolver un HttpResponseMessage con la imagen almacenada en su contenido (como se muestra a continuación). Recuerde que si quiere la URL que mostró en la pregunta, necesitaría una ruta que mapee los parámetros {imageName}, {width} y {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; } }

Pero nuevamente, si lo hace en muchos lugares, la ruta del formateador puede ser la manera "recomendada". Como casi todo en programación, la respuesta dependerá de su escenario.