86 votes

Existe-t-il une méthode recommandée pour renvoyer une image à l'aide de l'API Web ASP.NET ?

Quelle est la meilleure façon de renvoyer une image avec 2 paramètres (x et y pour le redimensionnement).

Par exemple

~/api/image12345/200/200

Renvoie un fichier jpg/png/or gif de 200 par 200.

Dois-je renvoyer un System.Drawing.Image ou définissez manuellement l'objet HTTPReponseMessage.Content ?

151voto

carlosfigueira Points 40778

Vous ne devriez pas renvoyer un System.Drawing.Image À moins que vous n'ajoutiez un formateur qui sache convertir les données en octets appropriés, l'image ne se sérialise pas en octets comme prévu.

Une solution possible est de renvoyer un HttpResponseMessage avec l'image stockée dans son contenu (comme indiqué ci-dessous). Rappelez-vous que si vous voulez l'URL que vous avez montrée dans la question, vous avez besoin d'une route qui associe les paramètres {imageName}, {width} et {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;
    }
}

Mais encore une fois, si vous faites cela à de nombreux endroits, la voie du formatage peut être la voie "recommandée". Comme presque tout en programmation, la réponse dépendra de votre scénario.

20voto

Computer Linguist Points 6570

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

Si vous voulez obtenir de bonnes performances, faites de la réécriture d'URL. au plus tard pendant PostAuthorizeRequest, pour que IIS puisse récupérer et servir le fichier. Oui, cela signifie une gestion des événements au niveau du module Http.

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

Si vous faites quelque chose de dynamique avec des images, vérifiez les points suivants consultez cet article sur les pièges à éviter en matière de traitement de l'image et envisagez de jeter un coup d'œil à ImageResizer . Il dispose d'une excellente mise en cache sur le disque (qui utilise la gestion des fichiers statiques d'IIS), et est facile à connecter à la génération d'images de tout type. Il dispose de liaisons optionnelles pour AForge, FreeImage et WIC, si vous avez besoin d'aller plus loin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X