2012-09-17 11 views
60

Estoy jugando con ASP.NET Web Api y tengo curiosidad sobre la mejor manera de devolver una imagen con 2 parámetros (x y y para cambiar el tamaño).¿Existe alguna forma recomendada de devolver una imagen mediante ASP.NET Web API?

Por ejemplo

~/api/image12345/200/200 

devolverá un 200 por 200 jpg/png/gif o

¿Debo devolver un objeto System.Drawing.Image o definir manualmente el HTTPReponseMessage.Content? De qué forma es la más eficiente y baja en gastos generales.

+0

Confirmar mi respuesta aquí: http://stackoverflow.com/a/20888749/64334 –

Respuesta

104

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 a sí mismo como bytes de imágenes como era de 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, de nuevo, si usted está haciendo esto en muchos lugares, tomar la ruta de formateador puede ser el camino "recomendado". Como casi todo en programación, la respuesta dependerá de su escenario.

+0

caso de que la imagen sea en un uso demasiado? – dibs487

13

Las imágenes son pesadas. ASP.NET WebForms, HttpHandlers, MVC y Web API hacen absolutamente una tarea terrible de servir archivos estáticos. IIS hace un buen trabajo de extremadamente - 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: yo soy el autor de la siguiente proyecto de artículo y de código abierto]

Si estás haciendo algo dinámico con imágenes, comprobar out this article on image processing pitfalls to avoid, y considerar echar 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.

+0

He estado usando ImageResizer en mi proyecto y estoy muy contento con la forma en que funciona, más de mí. La única queja es que parte de la documentación necesita actualización. –

Cuestiones relacionadas