Gibt es eine empfohlene Möglichkeit, ein Bild mithilfe der ASP.NET-Web-API zurückzugeben?



webapi action (2)

Was ist der beste Weg, um ein Bild mit 2 Parametern (x und y für die Größenänderung) zurückzugeben.

Beispielsweise

~/api/image12345/200/200

Gibt ein 200 von 200 jpg / png / oder gif zurück

Soll ich ein System.Drawing.Image Objekt zurückgeben oder den HTTPReponseMessage.Content manuell definieren?


Sie sollten kein System.Drawing.Image , es sei denn, Sie fügen auch einen Formatierer hinzu, der weiß, wie er diese in die entsprechenden Bytes konvertiert, serialisiert sich nicht als Bildbytes, wie Sie es erwarten würden.

Eine mögliche Lösung besteht darin, eine HttpResponseMessage mit dem in ihrem Inhalt gespeicherten Bild zurückzugeben (wie unten gezeigt). Denken Sie daran, dass Sie eine Route benötigen, die die Parameter {imageName}, {width} und {height} abbildet, wenn Sie die in der Frage angezeigte URL verwenden möchten.

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

Aber auch wenn Sie dies an vielen Orten tun, kann die Formatierungsroute der "empfohlene" Weg sein. Wie bei fast allem Programmieren hängt die Antwort von Ihrem Szenario ab.


Bilder sind schwer. ASP.NET-WebForms, HttpHandlers, MVC und Web-API haben eine absolut schreckliche Aufgabe, statische Dateien zu liefern. IIS leistet eine sehr gute Arbeit - oft 20-100x effizienter.

Wenn Sie eine gute Leistung erzielen möchten, führen Sie spätestens während PostAuthorizeRequest eine URL-Umschreibung durch, damit IIS die Datei abrufen und bereitstellen kann. Ja, das bedeutet Ereignisbehandlung auf HttpModule-Ebene.

[Disclaimer: Ich bin der Autor des folgenden Artikels und Open-Source-Projekts]

Wenn Sie etwas dynamisches mit Bildern machen, lesen Sie diesen Artikel über Bildbearbeitungsproblemen, die Sie vermeiden sollten , und ziehen Sie einen Blick auf ImageResizer . Es verfügt über eine hervorragende Festplatten-Cachespeicherung (die die statische Dateiverwaltung von IIS verwendet) und lässt sich problemlos mit jeder beliebigen Bildgenerierung verbinden. Es hat optionale Bindungen für AForge, FreeImage und WIC, auch wenn Sie fortgeschritten sein müssen.





image