web-dev-qa-db-fra.com

Existe-t-il un moyen recommandé de renvoyer une image à l'aide de l'API Web ASP.NET?

Quel est le meilleur moyen de renvoyer une image avec 2 paramètres (x et y pour le redimensionnement).

Par exemple

~/api/image12345/200/200

Retournera un 200 par 200 jpg/png/ou gif

Dois-je retourner un System.Drawing.Image objet ou définir manuellement le HTTPReponseMessage.Content?

80
Max Alexander

Vous ne devriez pas retourner un System.Drawing.Image, sauf si vous ajoutez également un formateur qui sait comment le convertir en octets appropriés ne se sérialise pas comme les octets de l'image comme vous le souhaiteriez.

Une solution possible consiste à renvoyer un HttpResponseMessage avec l'image stockée dans son contenu (comme indiqué ci-dessous). N'oubliez pas que si vous souhaitez que l'URL indiquée dans la question s'affiche, vous avez besoin d'un itinéraire mappant les paramètres {nomImage}, {largeur} et {hauteur}.

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;
    }
}

Mais encore une fois, si vous faites cela dans de nombreux endroits, choisissez la méthode "recommandée". Comme presque tout dans la programmation, la réponse dépend de votre scénario.

136
carlosfigueira

Les images sont lourdes. ASP.NET WebForms, HttpHandlers, MVC et Web API effectuent tous un travail absolument terrible de servir des fichiers statiques. IIS fait un extrêmement bon travail) - souvent 20 à 100 fois plus efficacement.

Si vous souhaitez obtenir de bonnes performances, effectuez une réécriture d'URL au plus tard au cours de PostAuthorizeRequest. Ainsi, IIS peut récupérer et Oui, cela signifie que la gestion des événements au niveau HttpModule.

[Avertissement: je suis l'auteur de l'article suivant et du projet open-source]

Si vous faites quelque chose de dynamique avec les images, cochez dans cet article, évitez les pièges du traitement des images , et envisagez de jeter un oeil à ImageResizer . Il possède une excellente mise en cache disque (qui utilise IIS statique)), et se connecte facilement à la génération d'images de tout type. Il comporte des liaisons facultatives pour AForge, FreeImage et WIC, si vous devez être avancé.

19
Lilith River